C++ "класс-оболочка" для библиотеки XML
Поэтому я пытался создать некоторые классы вокруг библиотеки XML xerces, чтобы я мог "спрятать" ее от остальной части моего проекта, лежащая в основе библиотека xml остается независимой от остальной части моего проекта.
Предполагалось, что это будет довольно простой задачей, однако кажется совершенно невозможным скрыть библиотеку от остальной части проекта, написав вокруг нее несколько классов.
У меня неправильный подход или моя идея "обёртки" совершенно глупа?
Я получаю что-то вроде этого:
DOMElement* root(); //in my 'wrapper' class, however this DOMElement is part of the xerces library, at this point my 'wrapper' is broken. Now I have to use the xerces library everywhere I want to use this function.
Где мое мышление пошло не так?
3 ответа
Я бы порекомендовал избегать обертки на первом этапе. Просто убедитесь, что слои и их границы ясны, то есть сетевой уровень заботится о сериализации / десериализации XML, и с этого момента вы используете только свои внутренние типы. Если вы сделаете это, и на более позднем этапе вам нужно заменить xerces любой другой библиотекой, просто замените слой сериализации. То есть вместо того, чтобы оборачивать каждый объект XML, просто оберните всю операцию: serialize
/deserialize
,
Как я уже упоминал в моих комментариях, я бы использовал немного другой подход. Я бы не хотел, чтобы моя кодовая база зависела от конкретного формата обмена сообщениями (xml), который я использую (что, если, например, вы решите изменить xml на что-то другое позже?) Вместо этого я бы работал с четко определенной объектной моделью и имел простой кодер / декодер для обработки преобразования в XML-строку и наоборот. Этот код / декодер был бы тогда битом, который я заменил бы, если бы основной формат провода изменился.
Декодер получит данные, считанные из сокета, и создаст подходящий объект (с вложенными объектами для представления запроса), а декодер получит подобный объект и сгенерирует из него XML. Если производительность не является первостепенной задачей, я бы использовал библиотеку, такую как TinyXML, которая довольно легкая - черт, вы можете уменьшить ее еще больше и сделать ее более легкой...
Написание собственного абстрактного интерфейса для библиотеки не является глупой идеей, если вы планируете изменить или иметь возможность изменить используемую библиотеку.
Вы не должны полагаться на свой объект библиотеки для реализации вашего интерфейса оболочки. Реализуйте свою собственную структуру и свой собственный интерфейс функций. Это облегчит большую работу, когда вы захотите изменить способ реализации XML (например, изменить библиотеку).
Один пример реализации:
class XmlElement
{
private:
DOMElement element; // point to the element of your library
public:
// Here you define how its public interface.
// There should be enough method/parameter to interact
// with any xml interface you will use in the future
XmlElement getSubElement(param)
{
// Create the Xmlelement
// Set the DOMElement wanted
// return it
}
}
В вашей программе вы увидите:
void function()
{
XmlElement root();
root.getSubElement("value"); // for example
}
Таким образом, DOMElement или их функции не появляются в проекте.