Недавно я прочитал исходный код leveldb, но меня смущает вопрос о структуре rep в источнике table и table_builder.
поскольку мы можем напрямую хранить переменную-член непосредственно в классе Table и классе TableBuilder.
Но почему автор делает структуру Rep и сохраняет переменную-член в структуре Rep.
Я могу привести одну причину, потому что таблица и table_builder будут открыты для пользователя, поэтому мы хотим скрыть реализацию.
Это правильно? или есть какая-то другая идея, по которой я скучаю, или это какой-то шаблон дизайна?
Спасибо
Вот фрагмент кода, извлеченный из 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.
Таким образом, эта идиома чрезвычайно важна для разработчиков библиотек и может также использоваться, чтобы минимизировать связь между различными модулями программы.
Других решений пока нет …