|
|||
Идиома pimpl ⇐ ПредыдущаяСтр 4 из 4 Идиома Pimpl (pointer to implementation - указатель на реализацию ) полезна в тех случаях, когда нам нужно что-то скрыть. Она обеспечивает еще более глубокий вид инкапсуляции, которая маскирует не просто реализацию, а также все ее зависимости. Например, мы создаем библиотеку, которая сама зависит от сторонних библиотек. При этом мы собираемся передать нашу библиотеку кому-то другому без исходников. Чтобы не тянуть зависимости в виде заголовочных файлов (как минимум) и не раскрыть слишком много деталей реализации в интерфейсе класса (как максимум), мы можем воспользоваться идиомой pimpl. namespace PimplPattern { struct FileWorker { private: struct FileOutputter; std:: unique_ptr< FileOutputter> fileOutputter;
public: FileWorker(); FileWorker(FileWorker& & ) noexcept; ~FileWorker() noexcept;
virtual void outputMessage([[maybe_unused]] std:: string_view path, [[maybe_unused]] std:: string_view text); };
} // namespace PimplPattern
struct PimplPattern:: FileWorker:: FileOutputter { void outputMessage([[maybe_unused]] std:: string_view path, [[maybe_unused]] std:: string_view text) { #ifdef _WIN32 std:: cout < < " Windows - path: " < < path < < " text: " < < text < < std:: endl; #elif __linux__ std:: cout < < " Linux - path: " < < path < < " text: " < < text < < std:: endl; #endif } };
PimplPattern:: FileWorker:: FileWorker(): fileOutputter(new FileOutputter()) {}
PimplPattern:: FileWorker:: FileWorker(FileWorker& & ) noexcept = default;
PimplPattern:: FileWorker:: ~FileWorker() noexcept = default;
void PimplPattern:: FileWorker:: outputMessage([[maybe_unused]] std:: string_view path, [[maybe_unused]] std:: string_view text) { fileOutputter-> outputMessage(path, text); }
Преимущества: · помогает в поддержании двоичной совместимости разделяемых библиотек · скрытие определенных внутренних деталей · уменьшение циклов перекомпиляции Недостатки: · увеличение использования памяти из-за большего количества выделений, чем с наивным вариантом · увеличенные усилия по обслуживанию (вы должны написать хотя бы функции пересылки) · потеря производительности (возможно, компилятор не сможет встроить что-либо, как в случае с наивной реализацией вашего класса)
|
|||
|