А. Александреску - Современное проектирование на C++ (1119444), страница 4
Текст из файла (страница 4)
Шаблоны проходят красной нитью через всю книгу, поскольку они обеспечивают тесное взаимодействие пользователя и библиотеки. Пользователь библиотеки буквально контролирует способ генерации кода, причем этот способ ограничивается самой библиотекой. Предназначение библиотеки обобщенных компонентов — позволять пользователю создавать собственные типы и определять их поведение, а также правильно объединять их с другими обобщенными компонентами.
Поскольку при этом используются статические методы, ошибки, связанные со смешиванием и подгонкой соответствующих фрагментов„обычно обнаруживаются на этапе компиляции. Аудиторагзг Аудитория, которой предназначена эта книга, состоит из двух частей. К первой категории относятся опытные программисты на С++, желающие овладеть наиболее современными методами создания библиотек, В книге представлены новые мощные 18 Предисловие идиомы языка С++, обладающие удивительными возможностями, некоторые из которых невозможно было себе представить. Эти идиомы окажут неоценимую помощь при создании библиотек высокого уровня. Для программистов среднего уровня, желающих повысить свою квалификацию, книга также будет полезной, особенно если они проявят определенную настойчивость. Несмотря на то что иногда в книге встречаются довольно сложные фрагменты кода на С++, они всегда сопровождаются подробным комментарием.
Вторая категория состоит из постоянно занятых программистов, которым нужно сделать дело, не тратя лишнего времени на изучение теории. Они могут пропустить наиболее сложные детали реализации и сосредоточить свое внимание на игаользовании предложенной библиотеки. Каждая глава начинается с подробного введения и заканчивается разделом, посвященным часто задаваемым вопросам. Для понимания и использования компонентов эти разделы окажутся весьма полезными.
Компоненты можно изучать независимо друг от друга. Они очень мошны и тем не менее безопасны, и, кроме того, их очень легко применять в своих приложениях. От читателя требуется хорошее знание языка С++ и желание знать его еше лучше. Следует также иметь представление о шаблонах вообгце и стандартной библиотеке шаблонов (8Т).) в частности. Знание основных шаблонов проектирования (Гамма и др., 1995) желательно, но не обязательно. Идиомы и шаблоны, применяемые в книге, детально описаны. Однако эта книга посвящена другой теме — в ней не делается попыток максимально обобшить шаблоны проектирования.
Поскольку они рассматриваются с точки зрения прагматичного создателя библиотеки, даже читатель, интересующийся в основном шаблонами проектирования, найдет для себя много нового, если захочет. Библиотека ьозгг' В книге описывается реальная библиотека ) оММ написанная на языке С++. Лаки (ЕоМ() — это бог остроумия в скандинавской мифологии, и автор надеется, что оригинальность и гибкость этой библиотеки соответствует названию.
Все элементы библиотеки находятся в пространстве имен ьоМ1. В примерах программ пространство имен не указывается, поскольку это увеличило бы размер кода и затемнило его содержание. Библиотеку ЕоМ) можно свободно загрузить с %еЬ-страницы Ьттр: //ахеи. аи1 . сов/сзеп9/ т(т1ез/0-201-70431-5. За исключением части, касающейся потоков, библиотека ) оМ) написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогуг работать с ней в полном объеме.
Я реализовал и протестировал библиотеку (.оМ( с помощью компиляторов Соде%апйог Рго 6.0 компании МеггозчегМз и Сотеац С++ 4.2.38 (оба компилятора работали под управлением системы %!лба). Похоже, что компилятор КА! С++ также не должен иметь с этой библиотекой никаких проблем. Как только поставщики распространят новые, усовершенствованные версии компиляторов, вы сможете эксплуатировать библиотеку ).оМ) полностью.
Код библиотеки ).оМ), а также примеры, приведенные в книге, используют популярный стандарт кодирования, предложенный Хербом Сеттером (НегЬ Бицег). Я уверен, что вы легко его поймете. Этот стандарт сводится к следующему. ° Классы, функции и перечислимые типы выглядят так: м(МетЫз. ° Переменные и перечислимые значения выглядят так: 1(МетЫз. ° Переменные-члены выглядят так: 1(МетЫз . 19 Предисловие ° Шаблонные параметры объявляются с ключевым словом с) азз, если онн представляют собой тип, определяемый пользователем (цзег-де1!пей гуре), и с ключевым словом гурепаме, если тип является простым !рптп!!!те). Структура книги Книга состоит из двух основных частей; способы программирования и компоненты. Часть) !главы 1 — 4) описывает способы программирования на языке С++, используемые в обобщенном программировании и, в частности, для создания обобщенных компонентов, Представлено множество особенностей и способов программирования на языке С++; проектирование, основанное на анализе поведения, частичная специализация шаблонов, списки типов, локальные классы и т.д.
Эту часть можно читать последовательно, а затем возвращаться к ней за конкретной информацией. Часть П организована так же, как и часть 1. В ней рассматривается реализация обобщенных компонентов. Здесь нет искусственных примеров. Все описанные компоненты используются в реальных приложениях. Проблемы, ежелневно встающие перед программистами на языке С++, например, интеллектуальные указатели, фабрики объектов и функторы, обсуждаются глубоко и решаются в общем виде. Реализации, приведенные в тексте, ориентируются на основные потребности программистов и предназначены лля решения фундаментальных задач.
Вместо подробного объяснения, что именно делает тот или иной фрагмент кода, в книге последовательно применяется следующий подход: сначала обсуждается задача, а затем выбирается и реализуется метод ее решения. Глава 1 посвящена классам стратегий — идиомам языка С++, позволяющим создавать гибкие шаблоны. В главе 2 обсужлаются основные способы программирования на языке С++, относящиеся к обобщенному программированию.
Списки типов, представляющие собой мощные структуры для манипуляции с типами, реализуются в главе 3. В главе 4 описывается важный вспомогательный инструмент — механизм распределения памяти для небольших объектов (зла!1-оЬ)есг а!!осагог). Обобщенные функторы, использующие шаблон проектирования совпало, обсуждаются в главе 5. В главе 6 описываются синглтоны. Глава 7 посвящена интеллектуальным указателям. В главе 8 описываются обобщенные фабрики объектов. Глава 9 посвящена шаблону проектирования дЬзтгаст яастогу и его реализации.
В главе 1О в общем виде реализовано несколько вариантов шаблона проектирования чз зз тог. Механизмы мультиметодов !пш!г)щегйоб епй!пез), представляющие собой решения, ориентированные на использование готовых компонентов, реализованы в главе 11. 20 Предисловие Прежде всего хочу поблагодарить моих родителей за их постоянную заботу. Следует подчеркнуть, что этой книги, как и большинства моих профессиональных успехов, не было бы без Скотта Мейерса.
С момента нашей встречи на Всемирном конгрессе по С+-ь (С++ Хтог!Ж Сопдгеьа) в 1998 году Скотт постоянно помогал мне. Он первым с энтузиазмом поддержал мои ранние идеи. Скотт познакомил меня с Джоном Влиссидесом, положив начало нашему сотрудничеству. Он посоветовал Хербу Саттеру сделать меня обозревателем журнала "С++ Верон" и привел в издательство Адйзоп-ХХгез!еу, практически вынудив начать эту книгу. В конце концов Скотт своими советами и замечаниями помогал мне все время в процессе работы над книгой, разлеляя со мной творческие муки. Выражаю глубокую признательность Джону Влнссидесу, который своими резкими замечаниями убелил меня, что мои решения не идеальны, и помог их улучшить.
Глава 9 — его заслуга. Она появилась в книге благодаря постоянным требованиям Джона не останавливаться на достигнутом и искать более удачные решения. Благодарю П. Дж. Плагера (Р. 3. Р1аедег) и Марка Брианда (Маг8 Вг!апд), вдохновивших меня писать статьи в журнал "С/С++ Узегз 9оигпаГ' в то время, когда я считал обозревателей этого журнала инопланетянами. Я очень признателен моему редактору Дебби Лафферти (ОеЬЬ!е !.а)Теку) за ее постоянную поддержку и полезные советы. Мои коллеги по компании Яеа!Ыепхог8з, особенно Борис Джеркуница (Вопз )ег!гцп!са) н Джим Кнаак (3!ш Кпаа)г), очень помогли мне, создав атмосферу свободомыслия, соперничества и стремления к вершинам мастерства. Я очень благодарен им за это. Выражаю свою признательность всем участникам форумов сотр.!апв.с++.пзодегагед и сснпр.Ы.с++ЛЬепег.
Эти люди помогли мне лучше понять язык С++. Я хотел бы выразить свою благодарность рецензентам моей рукописи: Михаилу Антонеску (М!Ьа)! Ап!овес!гц), Бобу Арчеру (ВоЬ Агсйег) (моему самому строгому рецензенту), Аллену Бролману (А1!еп Вгоайпап), Ионату Бурете (!опи! Вигеге), Мирель Чирита (М!ге! СЬ!пга), Стиву Кламагу (Бгехе С!агпаде), Джеймсу Коплину ()ашез Сор!!еп), Дугу Хазену (Ооцд Нахеп), Келвину Хенни (Ке!чп Неппеу), Джону Хикину (Лойп Н!сЫп), Говарлу Хиннанту (Ночагг) Н)паап!), Сорину Джиану (Бопп Яапц), Золтану Кормошу (Хо!гап Копцов), Джеймсу Кайперу (Загпез Киурег), Лизе Липпинкот (1 ьж Ебрр)псогг), Джонатану Лундквисту (Лопагйап )цпг)оц!зг), Петру Маргиняну (Регш Маг81пеап), Патрику МакКиллену (Рагпс)г МсК!11еп), Флорину Михайлу (Р)опп М!Ьа!)а), Сорину Опря (Бопп Оргеа), Джону Поттеру (Лойп Ропег), Адриану Рапитяну (Аг)пап Варйеапи), Монике Рапитяну (Моп!са Варйеапи), Брайану Стентону (Впап Бгепгоп), Адриану Стефле (Адпап 8!ейеа), Хербу Саттеру (НегЬ Бцггег), Джону Торйо ()о!зп Тот)о), Флорину Трофину (Р!опп Тюйп) и Кристи Власяну (Спзб 'х)азеапц).