Как правильно обернуть стороннюю библиотечную структуру?

#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.