#c #wrapper #bridge #pimpl-idiom
#c #оболочка #мост #pimpl-идиома
Вопрос:
В моем проекте я использую стороннюю библиотеку, которая постоянно меняется. У меня есть класс-оболочка (шаблон Bridge шаблон Pimpl) для этой библиотеки. Таким образом, ни один из моих источников, кроме реализации-оболочки, не видит эту библиотеку. У этой библиотеки есть структура Options, например
struct Options {
double distance;
double weight;
int num_rabbits;
// etc
};
Я хочу, чтобы эта структура была доступна в модуле GUI, чтобы создать диалоговое окно, позволяющее устанавливать эти параметры. Нужно ли мне создавать для нее структуру-оболочку? Например.
struct MP_ThatLibOptions {
// exact member copy
double distance;
double weight;
int num_rabbits;
// etc
};
Или я должен напрямую включить заголовок этой структуры в свои исходные тексты?
Недостатками wrapper являются: копирование-вставка, дополнительный код для преобразования между структурами. Недостатками direct include являются: нарушение идиомы pimpl.
Может быть, есть какие-либо другие решения этой проблемы?
Также я хочу подчеркнуть, что библиотека сторонних разработчиков постоянно меняется, поэтому я должен адаптировать свои исходные тексты для поддержки каждой новой версии библиотеки.
Ответ №1:
Структура Options, похоже, является частью общедоступного API, а не частной реализацией, которую скрывает идиома pimpl, поэтому, казалось бы, вам следует включить заголовок в свои исходные тексты.
Если вы сделаете это, единственный код, который будет подвержен поломке при изменении кода стороннего разработчика, — это тот код, который напрямую использует элементы структуры Options, но предположительно, когда это изменится, ваш код в любом случае должен измениться соответствующим образом, поскольку это звучит так, как будто это будет изменение API, так что, похоже, вы охвачены.
Комментарии:
1. Шаблон Bridge, который я использую, скрывает все типы данных библиотеки. Итак, я решил быть последовательным и не нарушать ее, я сделал копию структуры…
Ответ №2:
Поскольку я использую шаблоны Bridge pimpl, я решил полностью скрыть библиотеку 3rd party.