Современное проектирование на С++. Серия C++ In-Depth, т. 3
Андрей Александреску
В книге изложена новая технология программирования, представляющая собой сплав обобщенного программирования, метапрограммирования
шаблонов и объектно-ориентированного программирования на С++. Настраиваемые компоненты, созданные автором, высоко подняли уровень абстракции,
наделив язык С++ чертами языка спецификации проектирования, сохранив всю его мощь и выразительность.
В книге изложены способы реализации основных шаблонов проектирования. Разработанные компоненты воплощены в библиотеке Loki, которую можно
загрузить с Web-страницы автора.
Книга предназначена для опытных программистов на С++.
За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке C++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме. Я реализовал и протестировал библиотеку Loki с помощью компиляторов CodeWarrior Pro 6.0 компании Metrowerks и Comeau C++ 4.2.38 (оба компилятора работали под управлением системы Windows). Похоже, что компилятор KAI C++ также не должен иметь с этой библиотекой никаких проблем. Как только поставщики распространят новые, усовершенствованные версии компиляторов, вы сможете эксплуатировать библиотеку Loki полностью.
Код библиотеки Loki, а также примеры, приведенные в книге, используют популярный стандарт кодирования, предложенный Хербом Саттером (Herb Sutter). Я уверен, что вы легко его поймете. Этот стандарт сводится к следующему.
Классы, функции и перечислимые типы выглядят так: LikeThis.
Переменные и перечислимые значения выглядят так: likeThis.
Переменные-члены выглядят так: likeThis_.
Шаблонные параметры объявляются с ключевым словом class, если они представляют собой тип, определяемый пользователем (user-defined type), и с ключевым словом typename, если тип является простым (primitive).
Структура книги
Книга состоит из двух основных частей: способы программирования и компоненты. Часть I (главы 1-4) описывает способы программирования на языке С++, используемые в обобщенном программировании и, в частности, для создания обобщенных компонентов. Представлено множество особенностей и способов программирования на языке С++: проектирование, основанное на анализе поведения, частичная специализация шаблонов, списки типов, локальные классы и т.д. Эту часть можно читать последовательно, а затем возвращаться к ней за конкретной информацией.
Часть II организована так же, как и часть I. В ней рассматривается реализация обобщенных компонентов. Здесь нет искусственных примеров. Все описанные компоненты используются в реальных приложениях. Проблемы, ежедневно встающие перед программистами на языке С++, например, интеллектуальные указатели, фабрики объектов и функторы, обсуждаются глубоко и решаются в общем виде. Реализации, приведенные в тексте, ориентируются на основные потребности программистов и предназначены для решения фундаментальных задач. Вместо подробного объяснения, что именно делает тот или иной фрагмент кода, в книге последовательно применяется следующий подход: сначала обсуждается задача, а затем выбирается и реализуется метод ее решения.
Глава 1 посвящена классам стратегий - идиомам языка С++, позволяющим создавать гибкие шаблоны.
В главе 2 обсуждаются основные способы программирования на языке С++, относящиеся к обобщенному программированию.
Списки типов, представляющие собой мощные структуры для манипуляции с типами, реализуются в главе 3.
В главе 4 описывается важный вспомогательный инструмент - механизм распределения памяти для небольших объектов (small-object allocator).
Обобщенные функторы, использующие шаблон проектирования Command, обсуждаются в главе 5.
В главе 6 описываются синглтоны.
Глава 7 посвящена интеллектуальным указателям.
В главе 8 описываются обобщенные фабрики объектов.
Глава 9 посвящена шаблону проектирования Abstract Factory и его реализации.
В главе 10 в общем виде реализовано несколько вариантов шаблона проектирования Visitor.
Механизмы мультиметодов (multimethod engines), представляющие собой решения, ориентированные на использование готовых компонентов, реализованы в главе 11.
БЛАГОДАРНОСТИ
Прежде всего хочу поблагодарить моих родителей за их постоянную заботу.
Следует подчеркнуть, что этой книги, как и большинства моих профессиональных успехов, не было бы без Скотта Мейерcа. С момента нашей встречи на Всемирном конгрессе по С++ (C++ Worlds Congress) в 1998 году Скотт постоянно помогал мне. Он первым с энтузиазмом поддержал мои ранние идеи. Скотт познакомил меня с Джоном Влиссидесом, положив начало нашему сотрудничеству. Он посоветовал Хербу Саттеру сделать меня обозревателем журнала "C++ Report" и привел в издательство Addison-Wesley, практически вынудив начать эту книгу. В конце концов Скотт своими советами и замечаниями помогал мне все время в процессе работы над книгой, разделяя со мной творческие муки.
Выражаю глубокую признательность Джону Влиссидесу, который своими резкими замечаниями убедил меня, что мои решения не идеальны, и помог их улучшить. Глава 9 - его заслуга. Она появилась в книге благодаря постоянным требованиям Джона не останавливаться на достигнутом и искать более удачные решения.
Благодарю П. Дж. Плагера (P. J. Plaeger) и Марка Брианда (Mark Briand), вдохновивших меня писать статьи в журнал "C/C++ Users Journal" в то время, когда я считал обозревателей этого журнала инопланетянами.
Я очень признателен моему редактору Дебби Лафферти (Debbie Lafferty) за ее постоянную поддержку и полезные советы.
Мои коллеги по компании RealNetworks, особенно Борис Джеркуница (Boris Jerkunica) и Джим Кнаак (Jim Knaak), очень помогли мне, создав атмосферу свободомыслия, соперничества и стремления к вершинам мастерства. Я очень благодарен им за это.
Выражаю свою признательность всем участникам форумов comp.lang.c++.moderated и comp.std.c++.Usenet. Эти люди помогли мне лучше понять язык С++.