Jump to content

Современный дизайн на C++

Современный дизайн на C++
Автор Андрей Александреску
Язык Английский
Предмет С++
Издатель Аддисон-Уэсли
Дата публикации
2001
Страницы 323 стр.
ISBN 978-0-201-70431-0
ОКЛК 45129236
005.13/3 21
Класс ЛК QA76.73.C153 A42 2001 г.

Modern C++ Design: Generic Programming and Design Patterns Applied — книга, написанная Андреем Александреску и опубликованная в 2001 году издательством Addison-Wesley . назвал ее «одной из самых важных книг по C++» Скотт Мейерс . [1]

В книге используется и исследуется метод программирования на C++, называемый метапрограммированием шаблонов . Хотя Александреску не изобрел эту технику, он популяризировал ее среди программистов. Его книга содержит решения практических проблем, с которыми могут столкнуться программисты C++. Некоторые фразы из книги теперь используются в сообществе C++ как общие термины: современный C++ (в отличие от стиля C/C++), проектирование на основе политик и список типов . [ нужна ссылка ]

Весь код, описанный в книге, находится в свободном доступе в его библиотеке Loki . С 2001 года книга переиздана и переведена на несколько языков. [ нужна ссылка ]

Дизайн на основе политик [ править ]

Проектирование на основе политик , также известное как проектирование классов на основе политик или программирование на основе политик — это термин, используемый в современном проектировании C++ для обозначения подхода к проектированию, основанного на идиоме C++, известной как политики . Он был описан как во время компиляции вариант паттерна стратегии и связан с метапрограммированием шаблонов C++ . Впервые он был популяризирован на C++ Андреем Александреску в книге Modern C++ Design и в его колонке Generic<Programming> в журнале C/C++ Users Journal , и в настоящее время он тесно связан с C++ и D , поскольку требует компилятора с очень надежной поддержкой шаблонов. , что не было обычным явлением примерно до 2003 года.

Предыдущие примеры этого подхода к проектированию, основанного на параметризованном универсальном коде, включают параметрические модули (функторы) языков машинного обучения . [2] и распределители C++ для политики управления памятью.

Центральная идиома в проектировании на основе политик — это шаблон класса (называемый хост -классом), принимающий в качестве входных данных несколько типа параметров , экземпляры которых создаются с помощью типов, выбранных пользователем (называемых классами политики ), каждый из которых реализует определенный неявный интерфейс (называемый policy ) и инкапсулирует некоторый ортогональный (или в основном ортогональный) аспект поведения созданного экземпляра хост-класса. Предоставляя хост-класс в сочетании с набором различных готовых реализаций для каждой политики, библиотека или модуль могут поддерживать экспоненциальное количество различных комбинаций поведения, решаемых во время компиляции и выбираемых путем смешивания и сопоставления различных предоставленных классов политики в создание экземпляра шаблона хост-класса. Кроме того, написав собственную реализацию заданной политики, библиотеку на основе политики можно использовать в ситуациях, требующих поведения, непредвиденного разработчиком библиотеки. Даже в тех случаях, когда будет использоваться не более одной реализации каждой политики, разложение класса на политики может помочь процессу проектирования за счет повышения модульности и выделения именно тех мест, где были приняты ортогональные проектные решения.

Хотя сборка программных компонентов из взаимозаменяемых модулей является далеко не новой концепцией, проектирование на основе политик представляет собой инновацию в том, как она применяет эту концепцию на (относительно низком) уровне определения поведения отдельного класса. Классы политики имеют некоторое сходство с обратными вызовами , но отличаются тем, что вместо того, чтобы состоять из одной функции , класс политики обычно содержит несколько связанных функций ( методов ), часто в сочетании с состояния переменными или другими возможностями, такими как вложенные типы. Класс хоста, основанный на политике, можно рассматривать как тип метафункции , принимающий набор поведений, представленных типами, в качестве входных данных и возвращающий в качестве выходных данных тип, представляющий результат объединения этих поведений в функционирующее целое. (Однако, в отличие от метафункций MPL , выходные данные обычно представляются самим экземпляром хост-класса, а не вложенным типом вывода.)

Ключевой особенностью идиомы политики является то, что обычно (хотя это не является строго необходимым) класс хоста наследуется от каждого из своих классов политики (становится его дочерним классом ), используя (публичное) множественное наследование . (Альтернативы заключаются в том, что хост-класс просто содержит переменную-член каждого типа класса политики или может наследовать классы политики в частном порядке; однако публичное наследование классов политики имеет главное преимущество, заключающееся в том, что класс политики может добавлять новые методы, унаследованные классом политики. Примечательной особенностью этого аспекта идиомы политики является то, что по сравнению с объектно-ориентированным программированием политики инвертируют отношения между базовым классом и производным классом. class - тогда как в ООП-интерфейсах традиционно представлены ( абстрактные ) базовые классы, а реализации интерфейсов - производными классами, в проектировании на основе политик производный (хост) класс представляет интерфейсы, а базовые (политические) классы реализуют их. В случае политик публичное наследование не представляет собой связь между хостом и классами политики. Хотя это традиционно считается свидетельством дефекта проектирования в контексте ООП, это не применимо в контексте идиомы политики.

Недостатком политик в их нынешнем воплощении является то, что интерфейс политики не имеет прямого явного представления в коде , а скорее определяется неявно, посредством утиной типизации , и должен документироваться отдельно и вручную, в комментариях . Основная идея состоит в том, чтобы использовать анализ изменчивости общности, чтобы разделить тип на фиксированную реализацию и интерфейс, класс, основанный на политике, и различные политики. Хитрость заключается в том, чтобы знать, что входит в основной класс и какие политики следует создать. Упомянутая выше статья дает следующий ответ: всякий раз, когда нам нужно принять возможное ограничивающее проектное решение, мы должны отложить это решение, мы должны делегировать его политике с соответствующим названием.

Классы политики могут содержать реализацию, определения типов и т. д. По сути, разработчик основного класса шаблона определяет, что должны предоставлять классы политики, какие точки настройки им необходимо реализовать.

Создание хорошего набора политик в нужном количестве (например, необходимый минимум) может оказаться непростой задачей. Различные точки настройки, которые связаны друг с другом, должны входить в один аргумент политики, например, политика хранения, политика проверки и т. д. Графические дизайнеры могут давать имена своим политикам, которые представляют собой концепции, а не те, которые представляют операции или мелкие детали реализации.

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

Это будет достигнуто динамически с помощью концепций [3] в будущих версиях C++.

Простой пример [ править ]

Ниже представлен простой (надуманный) пример программы hello world на языке C++ , где выводимый на печать текст и метод его печати разлагаются с помощью политик. В этом примере HelloWorld — это хост-класс, в котором используются две политики: одна для указания того, как должно отображаться сообщение, а другая — для фактического печатаемого сообщения. Обратите внимание, что общая реализация находится в Run и поэтому код не может быть скомпилирован, если обе политики ( Print и Message) предусмотрены.

#include <iostream>
#include <string>

template <typename OutputPolicy, typename LanguagePolicy>
class HelloWorld : private OutputPolicy, private LanguagePolicy {
 public:
  // Behavior method.
  void Run() const {
    // Two policy methods.
    Print(Message());
  }

 private:
  using LanguagePolicy::Message;
  using OutputPolicy::Print;
};

class OutputPolicyWriteToCout {
 protected:
  void Print(std::string&& message) const {
    std::cout << message << std::endl;
  }
};

class LanguagePolicyEnglish {
 protected:
  std::string Message() const { return "Hello, World!"; }
};

class LanguagePolicyGerman {
 protected:
  std::string Message() const { return "Hallo Welt!"; }
};

int main() {
  // Example 1
  using HelloWorldEnglish = HelloWorld<OutputPolicyWriteToCout, LanguagePolicyEnglish>;

  HelloWorldEnglish hello_world;
  hello_world.Run();  // Prints "Hello, World!".

  // Example 2
  // Does the same, but uses another language policy.
  using HelloWorldGerman = HelloWorld<OutputPolicyWriteToCout, LanguagePolicyGerman>;

  HelloWorldGerman hello_world2;
  hello_world2.Run();  // Prints "Hallo Welt!".
}

Дизайнеры могут легко написать больше OutputPolicys, добавляя новые классы с помощью функции-члена Print и воспринимай их как новые OutputPolicyс.

Библиотека Локи [ править ]

Loki — это название C++, библиотеки программного обеспечения написанной Андреем Александреску в рамках его книги «Современный дизайн C++» .

Библиотека широко использует метапрограммирование шаблонов C++ и реализует несколько часто используемых инструментов: список типов , функтор , синглтон , интеллектуальный указатель , фабрику объектов , посетитель и мультиметоды .

Первоначально библиотека была совместима только с двумя наиболее стандартными компиляторами C++ ( CodeWarrior и Comeau C/C++ ): последующие усилия сделали ее пригодной для использования с широким спектром компиляторов (включая старые Visual C++ 6.0 , Borland C++ Builder 6.0 , Clang и ССЗ ). Поставщики компиляторов использовали Loki в качестве эталона совместимости, что еще больше увеличило количество совместимых компиляторов. [4]

Поддержка и дальнейшее развитие Loki продолжалось через сообщество открытого исходного кода под руководством Питера Кюммеля и Ричарда Спозато в рамках проекта SourceForge . Постоянный вклад многих людей улучшил общую надежность и функциональность библиотеки. Loki больше не привязан к книге, так как в нем уже есть много новых компонентов (например, StrongPtr, Printf и Scopeguard). Локи вдохновил подобные инструменты и функциональные возможности, которые теперь также присутствуют в коллекции библиотеки Boost . [ нужна ссылка ]

См. также [ править ]

Ссылки [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 602f0d7b54bda9abe88e8bfe2d8d598f__1716239280
URL1:https://arc.ask3.ru/arc/aa/60/8f/602f0d7b54bda9abe88e8bfe2d8d598f.html
Заголовок, (Title) документа по адресу, URL1:
Modern C++ Design - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)