Посоветуйте с архитектурой. Обработчик XML запросов.
От: ifndef Россия  
Дата: 18.06.10 05:44
Оценка:
Здравствуйте, Друзья!
Ломаю голову над такой задачкой:
нужно написать приложение, которое запрос в формате XML переваривала бы в определенный протокол.

XML запрос представляет из себя "команду" вида:

<AddNew>
 <User name="UserName" age="UserAge" address="UserAddress"/>
 <Hardware id="HardwareID" type="HardwareType" power="HardwarePower" count="HardwareCount"/>
 <Linkage user="UserName" hardware="HardwareID"/>
</AddNew>


или

<UpdateOld>
 <User name="UserName" age="UserAge" address="UserAddress"/>
 <Hardware id="HardwareID" type="HardwareType" power="HardwarePower" count="HardwareCount"/>
 <Linkage user="UserName" hardware="HardwareID"/>
</UpdateOld>



Протокол переваривает эти запросы в следующий вид.
Команда AddNew, к примеру, превращается в запрос:

RQ_ADDNEW_USER
{
  char UserName[20];
  byte UserAge;
  char Addres[250];
}

RQ_ADDNEW_HARDWARE
{
  UINT HardwareID;
  BYTE HardwareType;
  UINT HardwarePower;
  BYTE HardwareCount;
}

RQ_ADDNEW_LINKAGE
{
  char UserName[20];
  UINT HardwareID;
}


Посоветуйте, пожалуйста, как организовать архитектуру приложения?
Планируется использовать XML парсер TinyXML. Язык C++.
Задача осложняется тем, что наличие некоторых атрибутов элементов XML запроса необязательно, других — обязательно, то есть необходимо выполнять проверки на наличие определенных элементов.

Мне видится такая картина:
1. объект класса CRequestFactory — получает строку XML запроса. Парсит ее. В зависимости от корневого элемента запроса <AddNew> или <UpdateOld> создает класс соответствующего протокольного запроса CAddRequest или CUpdateRequest, соответственно, и отдает им распарсенные данные, а также указатель на объект-передатчик запроса на сервер.
2. объекты классов CAddRequest и CUpdateRequest на основе распарсенных данных заполняют свои внутренние члены-данные и проверяют их по необходимым условиям (наличие элементов, значения элементов). В случае, если наполнение запроса прошло успешно, объект вызывает функцию объекта-передатчика для отправки запроса на сервер, например:

sender->SendRequest(RQ_RQ_ADDNEW_USER, this->UserName, this->UserAge, this->Addres);


Проблема такой реализации в том, что при большом наличии атрибутов элементов и необходимости сложных преобразований типов этих атрибутов, функции классов CAddRequest и CUpdateRequest становятся очень громоздкими. Становится сложно изменять запросы. Хочется как-то упростить реализацию.

Буду благодарен любым советам.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.