А. Александреску - Современное проектирование на C++ (1119444), страница 3
Текст из файла (страница 3)
Эта книга посвящена слиянию разных способов программирования — обобщенного программирования, метапрограммирования шаблонов, объектно-ориентированного программирования и разработки шаблонов проектирования — в рамках нового подхода. До сих пор эти направления в программировании развивались изолированно друг от друга, и выгоды, полученные от их объединения, лишь начинают получать достойную оценку. Это слияние открывает новые перспективы для языка С++ не только с точки зрения собственно программирования, но для разработки программного обеспечения в целом.
Особенно значительно это повлияет на анализ программного обеспечения и его архитектуру. Обобщенные компоненты, созданные Андреем, поднимают уровень абстракции настолько высоко, что язык С++ приобретает черты языка спецификаций проектирования (без!йп зрес(йсагюп!апацаае). При этом в отличие от узкоспециализированных языков проектирования язык С++ сохраняет всю свою мощь и выразительность. Андрей продемонстрировал, как программируются концепции проектирования; синглтоны (з)пя!егопез), инспекторы (г(з(гога), заместители (ргох(еэ), абстрактные фабрики (аЬзггасг гастог)ез) и т.п.
Можно даже настраивать готовые компоненты с помощью шаблонных параметров, не расходуя дополнительного машинного времени. Не нужно выбрасывать кучу денег на разработку новых инструментальных средств или изучать тома методологической тарабарщины. Достаточно иметь надежный современный компилятор (и эту книгу). Разработчики генераторов кода долгие годы обещали обеспечить их совместимость, но теоретические исследования и практический опыт убедили меня, что достичь этой цели невозможно. Остаются нерешенными проблемы полного обхода дерева поиска, генерации недостаточно качественного кода, негибких генераторов, нечитабельности сгенерированного кода и, разумеется, широко известная проблема, которую можно сформулировать так; "Я не могу вставить этот проклятый код в свою программу".
Каждой из этой проблем достаточно, чтобы завести программиста в тупик, а вместе они создают практически непреодолимые препятствия для автоматической генерации кода. Как было бы хорошо получить все теоретические преимушества автоматической генерации кода — скорость, легкость реализации, сокращенную избыточность, меньшее количество ошибок, одновременно избежав его практических недостатков! Именно это обещает подход, предложенный Андреем. Обобщенные компоненты (лепет(с сотропеп!з) реализуют удачные схемы в виде удобных для использования, поддающихся смешиванию и подходящих для решения задачи шаблонов (пцхаЫеапо-щагспаЫе гетр!агез).
Эти шаблоны делают практически то же, что и генераторы кода: создают стандартные фрагменты кода для дальнейшей обработки с полющью компилятора. Отличие заключается в том, что шаблоны позволяют сделать это, не выходя за рамки языка С++. В результате происходит полная интеграция полученного кода с исходным кодом приложения. При этом остается возможность использовать всю мощь языка, расширяя классы, замещая методы и подгоняя шаблоны под свои требования. Некоторые из описанных приемов программирования довольно трудно понять, особенно метапрограммирование шаблонов, рассмотренное в главе 3. Однако, освоив его, вы сможете постичь всю теорию обобщенных компонентов, которые практически сами себя создают, Эти компоненть< описань< в последующих главах. Я думаю, что метапрограмл<ирование шаблонов, изложенное в главе 3, само по себе достойно отдельной книги.
Остальные десять глав освещают' способы его применения. Несмотря на то что десять глав — это довольно много, ваши инвестиции окупятся сторицей. Джон Влиссидес (3ойп 'йЬзЫеа) Предисловие Джона Влиссидеса П РЕДИСЛОВИЕ Возможно, вы держите эту книгу в руках, находясь в книжной лавке, раздумывая, покупать ли ее? А может быть вы пришли в библиотеку и решаете, стоит ли тратить время на эту книгу? Знаю, что у вас нет времени, поэтому буду краток. Если вы когда-либо интересоюлись, как нужно писать программы высокого уровня на языке С++, как справиться с лавиной мелких деталей, загромождаюших даже самую простую программу, или как создать компонент, пригодный для повторного использования, который не нужно разрабатывать заново для каждого нового приложения, то зта книга для вас.
Представьте себе такую картину. Вы приходите с производственного совещания, неся в руках груду диаграмм, на которых нацарапаны ваши комментарии. О'кей, говорите вы, тип события, передаваемого от одного объекта к другому, в любом случае не сваг. Это — тип зпт. И вы изменяете одну строку в вашей программе. Интеллектуальный указатель на объект класса М6дет работает слишком медленно, его следует сделать неконтролируемым.
И вы изменяете еще одну строку. Фабрика объектов должна поддерживать новый класс падучее, добавленный соседним отделом. И вы снова изменяете одну строку. Вы закончили разработку своей программы. Компилируете. Связываете. Готово. Отлично! Не кажется ли вам, что в этом сценарии что-то не так? Намного правдоподобнее выглядит следующее развитие событий. Вы приходите с производственного совещания взмыленный, поскольку вам предстоит выполнить кучу работы. Вы запускаете глобальный поиск.
Удаляете фрагмент. Добавляете фрагмент. Делаете ошибки. Исправляете ошибки... В этом и заключается работа программиста, не так ли? Хотя эта книга и не гарантирует вам исполнение первого сценария, она поможет вам пройти несколько шагов в этом направлении. Здесь предпринята попытка представить язык С++ в новол» качестве— языка для разработки архитектуры программного обеспечения. Традиционно код представляет собой наиболее детализированный и сложный аспект программного обеспечения.
Исторически, несмотря на существование языков разных уровней, предназначенных для поддержки методологий проектирования (например, объектной ориентации), между проектом программы и ее кодом лежит пропасть. Это обусловлено тем, что в коде должны быть учтены все мельчайшие детали реализации и множество других побочных моментов. Цель программы в большинстве случаев скрывается за множеством подробностей.
В этой книге представлена коллекция пригодных к повторному использованию шаблонов, называемых обобщениыми коилоненпимя (бепег1с согпропепгз), а также способы их разработки. Обобщенные компоненты предоставляют пользователю хорошо известные выгоды, свойственные библиотекам, однако они пригодны для более широкого спектра системных архитектур. Приемы кодирования и реализации сконцентрированы на задачах и моментах, традиционно присущих проектированию, которое обычно лредаесшвует собственно кодированию программ. Благодаря своему высокому уровню абстракции обобщенные компоненты позволяют необычайно выразительно, сжато и легко отображать в коде сложные архитектуры.
В обобщенных компонентах воплощены три ветви программирования; проектирование шаблонов, обобщенное программирование и язык С++. Комбинация этих элементов позволила достичь высокого уровня готовности кода к повторному использо- ванию, условно говоря, как в горизонтальном, так и в вертикальном направлениях. В горизонтальном направлении небольшое количество библиотечного кода позволяет реализовать огромное — в принципе, бесконечное — количество структур и моделей поведения.
В вертикальном направлении степень обобщенности этих компонентов делает их пригодными для широчайшего круга программ. Своим появлением книга обязана проектированию шаблонов, которое позволяет создавать мощные средства решения часто встречающихся задач объектноориентированной разработки программ. Проектирование шаблонов — это тщательно отобранные примеры хорошей разработки — рецепты правильных, пригодных к повторному использованию решений задач, возникающих в различных областях. Основной задачей проектирования шаблонов является создание содержательного лексикона бщяяезг!че 1ех)соп) для воплощаемых разработок. Эти шаблоны описывают задачу, ее проверенное временем решение с разными вариантами, а также последствия выбора одного из них. Проектирование шаблонов не связано с конкретными языками программирования, Следуя определенным шаблонам проектирования и комбинируя их друг с другом, компоненты, представленные в этой книге, стремятся охватить как можно более широкий круг конкретных задач.
Обобщенное программирование — это парадигма, в центре которой лежат абстрактные типы, узкий набор функциональных требований и алгоритмы реализации, выраженные в терминах этих требований. Поскольку алгоритмы сами определяют точную и тесную связь с типами, которыми они могут манипулировать, один и тот же алгоритм момсно применять для работы с широким спектром типов. Для реализации алгоритмов, приведенных в этой книге, использованы методы обобщенного программирования, позволяющие достичь минимальной специфичности, невероятной лаконичности и эффективности, присущих программам, тщательно разработанным вручную.
В качестве средства реализации в книге используется только язык С++. В этой книге вы не найдете кода, реализующего изящные системы оконного интерфейса, сложных библиотек для сетевого программирования или интеллектуальных механизмов регистрации (1ояя)пя шестая)зщз). Вместо этого вы обнаружите массу базовых компонентов, которые облегчают решение как всех описанных выше задач, так и многих других. Лля разработки этих компонентов язык С++ крайне необходим. Лежащий в его основе механизм управления памятью, реализованный в языке С, гарантирует быстрое выполнение программ, поддержка полиморфизма позволяет применять приемы объектно-ориентированного программирования, а шаблоны допускают использование невероятных машин, предназначенных для автоматической генерации кода.