Шаг 14 - Класс CGIParam

Вторым классом, который требуется для класса CGIApp должен быть класс хранящий имена передаваемых параметров и их значение.

Для хранения значений параметров мы уже сделали класс CGIContent. Нам осталось добавить в класс переменную для имени и методы для обеспечения добавления параметров и их быстрого поиска. Структура класса очень похожа на класс CGIContent. Класс CGIParamItem будет элементом списка, а класс CGIParam управляющим:

class CGIParam;

class CGIParamItem {
friend CGIParam;
	char *Name;
	CGIContent *Content;
	CGIParamItem *Next;
public:
	CGIParamItem();
	~CGIParamItem();
};

CGIParamItem::CGIParamItem(){
	Name=NULL;
	Next=NULL;
	Content=new CGIContent();
};

CGIParamItem::~CGIParamItem(){
	if (Name!=NULL) free(Name);
	delete Content;
	if (Next!=NULL) delete Next;
};

Класс CGIParamItem содержит имя параметра в переменной Name, а содержимое в Content.

Теперь класс CGIParam:

class CGIParam{
	CGIParamItem *List;
public:
	CGIParam();
	~CGIParam();
	CGIContent *Add(char *name,char *Buffer);
	CGIContent *Find(char *name);
};

CGIParam::CGIParam(){
	List=NULL;
};

CGIParam::~CGIParam(){
	if (List!=NULL) delete List;
};

CGIContent *CGIParam::Add(char *name,char *Buffer){
	CGIParamItem *temp,*p;

	temp=new CGIParamItem();
	temp->Name=strdup(name);
	temp->Content->Add(Buffer);

	if (List==NULL){
		List=temp;
	} else {
		p=List;
		while (p->Next!=NULL) p=p->Next;
		p->Next=temp;
	};
	return temp->Content;

};

CGIContent *CGIParam::Find(char *name){
	CGIParamItem *temp=List;
	while (temp!=NULL){
		if (strcmp(temp->Name,name)==0) return temp->Content;
		temp=temp->Next;
	};
	return NULL;
};

Удобство этого класса очевидно. Позволяет хранить большие объемы, обеспечивает очень быстрый поиск нужного параметра. Теперь вместо просмотра всех данных, как раньше, требуется всего лишь просмотреть имена параметров, что, собственно говоря, и требуется. Кроме того эти классы в будущем будут хранить уже декодированные данные. Раньше нам нельзя было декодировать данные потому, что мы могли потерять связки разделяющие имена параметров и их содержимое между собой, т.е. могли бы появиться нежелательные символы & и = и испортить все картину. Теперь этого никогда не произойдет, т.к. данные хранятся отдельно друг от друга и бережно охраняются своими управляющими классами. Преимущество ООП вообще еще состоит в и том, что создав класс вы можете не беспокойться о динамическом распределении памяти, правильно написанные конструкторы и деструкторы будут заботиться об этом без вашего участия.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей - 24.04.2000