Современный дизайн на C ++ - Modern C++ Design
Автор | Андрей Александреску |
---|---|
Язык | английский |
Предмет | C ++ |
Издатель | Эддисон-Уэсли |
Дата публикации | 2001 |
Страницы | 323 стр. |
ISBN | 978-0-201-70431-0 |
OCLC | 45129236 |
005.13/3 21 | |
Класс LC | QA76.73.C153 A42 2001 г. |
Современный дизайн на C ++: применение общих шаблонов программирования и проектирования это книга, написанная Андрей Александреску, опубликовано в 2001 г. Эддисон-Уэсли. Она была названа "одной из самых важных книг по C ++" Скотт Мейерс.[1]
Книга использует и исследует C ++ метод программирования называется метапрограммирование шаблона. Хотя Александреску не изобретал эту технику, он популяризировал ее среди программистов. Его книга содержит решения практических проблем, с которыми могут столкнуться программисты на C ++. Некоторые фразы из книги теперь используются в сообществе C ++ как общие термины: современный C ++ (в отличие от стиля C / C ++), дизайн на основе политик и список.
Весь код, описанный в книге, находится в свободном доступе в его библиотеке. Локи Книга переиздается и переведена на несколько языков с 2001 года.
Дизайн на основе политик
Дизайн на основе политик, также известный как разработка классов на основе политик или же программирование на основе политик, это термин, используемый в Современный дизайн на C ++ для дизайнерского подхода, основанного на идиома для C ++, известный как политика. Это было описано как время компиляции вариант шаблон стратегии, и имеет связи с C ++ метапрограммирование шаблона. Впервые он был популяризирован на C ++ Андреем Александреску с Современный дизайн на C ++ и с его колонкой Общий <Программирование> в Журнал пользователей C / C ++, и в настоящее время он тесно связан с C ++ и D поскольку это требует компилятор с очень крепкий Поддержка для шаблоны, что было нечасто до 2003 года.
Предыдущие примеры этого подхода к проектированию, основанного на параметризованном универсальном коде, включают параметрические модули (функторы) ML языки,[2] и C ++ распределители для политики управления памятью.
Центральная идиома в дизайне, основанном на политике, - это учебный класс шаблон (называемый хозяин класс), взяв несколько тип параметры в качестве ввода, которые созданный с типами, выбранными пользователем (называемыми классы политики), каждый реализация особый неявный интерфейс (называется политика), и инкапсуляция немного ортогональный (или в основном ортогональный) аспект поведения созданного класса хоста. Предоставляя класс хоста в сочетании с набором различных стандартных реализаций для каждой политики, библиотека или же модуль может поддержать экспоненциальный количество различных комбинаций поведения, разрешенных во время компиляции и выбранных путем смешивания и сопоставления различных предоставленных классов политики при создании экземпляра шаблона класса хоста. Кроме того, написав собственную реализацию данной политики, библиотека на основе политик может использоваться в ситуациях, требующих поведения, непредвиденного разработчиком библиотеки. Даже в тех случаях, когда когда-либо будет использоваться не более одной реализации каждой политики, разложение класса на политики может помочь процессу проектирования, увеличивая модульность и выделяя, где именно были приняты ортогональные проектные решения.
В то время как сборка программных компонентов из взаимозаменяемых модулей - далеко не новая концепция, проектирование на основе политик представляет собой новшество в способе применения этой концепции на (относительно низком) уровне определения поведения отдельного класса. Классы политик имеют некоторое сходство с обратные вызовы, но отличаются тем, что не состоят из одного функция, класс политики обычно содержит несколько связанных функций (методы ), часто в сочетании с государственный переменные или другие средства, такие как вложенные типы. Класс хоста на основе политик можно рассматривать как тип метафункция, принимая набор поведений, представленных типами, в качестве входных данных и возвращая в качестве выходных данных тип, представляющий результат объединения этих поведений в функционирующее целое. (В отличие от MPL Однако для метафункций вывод обычно представлен самим экземпляром класса хоста, а не вложенным типом вывода.)
Ключевая особенность политика идиома состоит в том, что обычно (хотя это не является строго необходимым) класс хоста выводить из (сделать себя дочерний класс of) каждый из своих классов политик, используя множественное наследование. (Альтернативой является то, что класс хоста может просто содержать переменную-член каждого типа класса политики или же наследовать классы политики в частном порядке; однако публичное наследование классов политики имеет главное преимущество, заключающееся в том, что класс политики может добавлять новые методы, унаследованные созданный экземпляр класса хоста и доступный для его пользователей, о чем сам класс хоста даже не должен знать.) Примечательной особенностью этого аспекта идиомы политики является то, что относительно объектно-ориентированного программирования политики инвертируют отношения между базовый класс и производный класс - тогда как в ООП интерфейсы традиционно представлены (Абстрактные ) базовые классы и реализации интерфейсов производными классами, при проектировании на основе политик производный класс (хост) представляет интерфейсы, а базовые классы (политики) реализуют их. В случае политик публичное наследование не представляет собой отношения между хостом и классами политик. Хотя это традиционно считалось доказательством дефекта дизайна в контекстах ООП, это не применяется в контексте идиомы политики.
Недостатком политик в их текущем воплощении является то, что интерфейс политики не имеет прямого, явного представления в код, а скорее определяется неявно, через утка печатать, и должны быть задокументированы отдельно и вручную в Комментарии. Основная идея состоит в том, чтобы использовать анализ общности-изменчивости для разделения типа на фиксированную реализацию и интерфейс, класс на основе политик и различные политики. Уловка состоит в том, чтобы знать, что входит в основной класс и какие политики следует создавать. В упомянутой выше статье дается следующий ответ: везде, где нам нужно принять возможное ограничивающее проектное решение, мы должны отложить это решение, мы должны делегировать его политике с соответствующим названием.
Классы политики могут содержать реализацию, определения типов и т. Д. По сути, разработчик основного класса шаблона будет определять, что должны предоставлять классы политики, какие точки настройки они должны реализовать.
Создание хорошего набора политик с правильным числом (например, минимально необходимым) может оказаться непростой задачей. Различные точки настройки, которые принадлежат друг другу, должны входить в один аргумент политики, например политику хранения, политику проверки и т. Д. Графические дизайнеры могут давать имена своим политикам, которые представляют концепции, а не те, которые представляют операции или второстепенные детали реализации.
Дизайн на основе политик может включать другие полезные методы. Например, шаблон метода шаблон может быть переинтерпретирован во время компиляции, так что основной класс имеет скелетный алгоритм, который - в точках настройки - вызывает соответствующие функции некоторых политик.
Это будет достигаться динамически за счет концепции[3] в будущих версиях C ++.
Простой пример
Ниже представлен простой (надуманный) пример C ++ привет мировая программа, где текст для печати и метод его печати декомпозируются с помощью политик. В этом примере Привет, мир - это класс хоста, для которого требуются две политики: одна для определения того, как должно отображаться сообщение, а другая - для фактического печатаемого сообщения. Обратите внимание, что общая реализация находится в Пробег
и поэтому код не может быть скомпилирован, если обе политики (Распечатать
и Сообщение
) предоставлены.
#включают <iostream>#включают <string>шаблон <typename OutputPolicy, typename LanguagePolicy>учебный класс Привет, мир : частный OutputPolicy, частный LanguagePolicy { общественный: // Метод поведения. пустота Пробег() const { // Два метода политики. Распечатать(Сообщение()); } частный: с помощью LanguagePolicy::Сообщение; с помощью OutputPolicy::Распечатать;};учебный класс OutputPolicyWriteToCout { защищенный: шаблон <typename MessageType> пустота Распечатать(MessageType&& сообщение) const { стандартное::cout << сообщение << стандартное::конец; }};учебный класс LanguagePolicyАнглийский { защищенный: стандартное::нить Сообщение() const { возвращаться "Привет, мир!"; }};учебный класс ЯзыкПолитикаНемецкий { защищенный: стандартное::нить Сообщение() const { возвращаться "Привет, Вельт!"; }};int главный() { // Пример 1 typedef Привет, мир<OutputPolicyWriteToCout, LanguagePolicyАнглийский> HelloWorldАнглийский; HelloWorldАнглийский Привет, мир; Привет, мир.Пробег(); // Печатает «Hello, World!». // Пример 2 // Делает то же самое, но использует другую языковую политику. typedef Привет, мир<OutputPolicyWriteToCout, ЯзыкПолитикаНемецкий> HelloWorldНемецкий; HelloWorldНемецкий hello_world2; hello_world2.Пробег(); // Печать «Hallo Welt!».}
Дизайнеры могут легко написать больше OutputPolicy
s путем добавления новых классов с функцией-членом Распечатать
и воспринимайте их как новые OutputPolicy
с.
Библиотека Локи
Локи это имя C ++ библиотека программного обеспечения написано Андрей Александреску как часть его книги Современный дизайн на C ++.
Библиотека широко использует C ++ метапрограммирование шаблона и реализует несколько часто используемых инструментов: список, функтор, одиночка, умный указатель, фабрика объектов, посетитель и мультиметоды.
Первоначально библиотека была совместима только с двумя наиболее стандартными компиляторами C ++ (CodeWarrior и Комо C / C ++ ): более поздние попытки сделали его пригодным для использования с широким спектром компиляторов (включая более старые Visual C ++ 6.0, Borland C ++ Builder 6.0, Лязг и GCC ). Производители компиляторов использовали Loki в качестве эталона совместимости, что еще больше увеличило количество совместимых компиляторов.[4]
Поддержка и дальнейшее развитие Loki продолжалось сообществом разработчиков ПО с открытым исходным кодом во главе с Петер Кюммель и Ричард Спосато как SourceForge проект. Постоянный вклад многих людей повысил общую надежность и функциональность библиотеки. Loki больше не привязан к книге, так как в ней уже есть много новых компонентов (например, StrongPtr, Printf и Scopeguard). Локи вдохновил аналогичные инструменты и функции, которые теперь также присутствуют в Способствовать росту библиотечное собрание.[нужна цитата ]
Смотрите также
Рекомендации
- ^ Скотт Мейерс, Самые важные книги по C ++ ... когда-либо
- ^ https://www.cl.cam.ac.uk/~lp15/MLbook/PDF/chapter7.pdf
- ^ http://www.stroustrup.com/good_concepts.pdf
- ^ C ++ и последующий период 2011 года: сеанс «Спросите нас о чем угодно», http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2011-Scott-Andrei-and-Herb-Ask-Us-Anything в 51: 40-51: 51
внешняя ссылка
- Сайт Александреску (с опечатками в книге [1] )
- Умные указатели (образец главы из книги)
- Локи на SourceForge.net
- Оригинальный исходный код от книжного издательства