Хелпикс

Главная

Контакты

Случайная статья





Идиома pimpl



Идиома 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);

}

 

Преимущества:

· помогает в поддержании двоичной совместимости разделяемых библиотек

· скрытие определенных внутренних деталей

· уменьшение циклов перекомпиляции

Недостатки:

· увеличение использования памяти из-за большего количества выделений, чем с наивным вариантом

· увеличенные усилия по обслуживанию (вы должны написать хотя бы функции пересылки)

· потеря производительности (возможно, компилятор не сможет встроить что-либо, как в случае с наивной реализацией вашего класса)



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.