почему table и tablebuilder в leveldb используют struct rep?

Недавно я прочитал исходный код leveldb, но меня смущает вопрос о структуре rep в источнике table и table_builder.

поскольку мы можем напрямую хранить переменную-член непосредственно в классе Table и классе TableBuilder.

Но почему автор делает структуру Rep и сохраняет переменную-член в структуре Rep.

Я могу привести одну причину, потому что таблица и table_builder будут открыты для пользователя, поэтому мы хотим скрыть реализацию.
Это правильно? или есть какая-то другая идея, по которой я скучаю, или это какой-то шаблон дизайна?

Спасибо

4

Решение

Вот фрагмент кода, извлеченный из table.hи фрагмент кода из table_builder.h показал бы подобный дизайн

class Table
{
...
struct Rep;
Rep* rep_;
...
};

Таким образом, объяснение, которое вы пришли, является правильным:

  • Объявления классов table.h а также table_builder.h подвергаются leveldb клиенты;
  • Однако разработчик не хотел раскрывать внутреннее представление данных, так как они являются деталями реализации и не нужны в интерфейсе;
  • Таким образом, эти детали были перемещены в отдельную структуру, структуру Rep которая объявлена ​​в открытых интерфейсах (файлы заголовков), но определена и используется только в файлах реализации (исходных файлах);
  • Это довольно распространенная идиома, часто называемая идиома (так как указатель на реализация часто называется pImpl) или брандмауэр компиляции.

Помимо инкапсуляции дизайна, есть еще одна причина для этой идиомы, которая заключается в удобстве использования. Действительно, если внутренние детали Table были выставлены в Table.h, любой исходный файл пользователя leveldb, который включает Table.h придется перекомпилировать каждый раз, когда эти детали меняются.

Скрывая эти детали реализации, исходные файлы пользователей leveldb не подвержены изменениям во внутреннем представлении данных leveldb. Пока открытый интерфейс leveldb (файлы общих заголовков) не изменяется, пользователи могут обновлять одну версию leveldb до другой, даже не перекомпилируя свой исходный код: им просто нужно связаться с новой версией библиотеки leveldb.

Таким образом, эта идиома чрезвычайно важна для разработчиков библиотек и может также использоваться, чтобы минимизировать связь между различными модулями программы.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]