C ++ «класс-оболочка» для библиотеки XML - PullRequest
1 голос
/ 14 декабря 2010

Итак, я пытался создать некоторые классы вокруг библиотеки 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 ]

1 голос
/ 14 декабря 2010

Я бы порекомендовал избегать обертки на первом этапе.Просто убедитесь, что слои и их границы ясны, то есть сетевой уровень заботится о сериализации / десериализации XML, и оттуда вы используете только свои внутренние типы.Если вы сделаете это, и на более позднем этапе вам нужно заменить xerces любой другой библиотекой, просто замените слой сериализации.То есть вместо того, чтобы обернуть каждый объект XML, просто оберните всю операцию: serialize / deserialize.

1 голос
/ 14 декабря 2010

Как я уже упоминал в моих комментариях, я бы использовал немного другой подход. Я не хотел бы, чтобы моя кодовая база зависела от конкретного формата обмена сообщениями (xml), который я использую (что, если, например, вы решите изменить xml на что-то другое позже?) Вместо этого я бы работал с четко определенной объектной моделью и имел простой кодер / декодер для обработки преобразования в XML-строку и наоборот. Этот код / ​​декодер был бы битом, который я заменил бы, если бы основной формат проводов изменился.

Декодер получит данные, прочитанные из сокета, и создаст подходящий объект (с вложенными объектами для представления запроса), а декодер получит подобный объект и сгенерирует из него XML. Если производительность не является первостепенной задачей, я бы использовал библиотеку, такую ​​как TinyXML, которая довольно легкая - черт, вы можете уменьшить ее еще больше и сделать ее более легкой ...

1 голос
/ 14 декабря 2010

Написание собственного абстрактного интерфейса для библиотеки - не глупая идея, если вы планируете изменить или иметь возможность изменить используемую библиотеку.

Вы не должны полагаться на свой объект библиотеки для реализации вашего интерфейса оболочки. Реализуйте свою собственную структуру и свой собственный интерфейс функций. Это облегчит большую работу, когда вы захотите изменить способ реализации 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 или их функции не появляются в проекте.

...