Программирование >>  Разработка устойчивых систем 

1 ... 147 148 149 [ 150 ] 151 152 153 ... 196


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

16. Измените программу BreakTie.cpp, добавив в нее класс VeryBottom, наследующий (не виртуально!) от Bottom. Класс VeryBottom почти не отличается от Bottom, кроме одного: в объявлении функции f слово Lelt заменяется словом Right . Измените функцию main() так, чтобы вместо объекта Bottom в ней создавался экземпляр VeryBottom. Какая версия f() будет вызываться?



Паттерны проектирования

...Опишите задачу, которая слова и снова встречается в вашей работе. А затем изложите суть ее решения этой задачи так, чтобы его можно было использовать миллион раз, но все решения были бы разными.

Кристофер Александер (Christopher Alexander)

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

Вероятно, самым важным недавним достижением в области объектно-ориентированного проектирования является методология паттернов проектирования (от англ. pattern). Впервые она была представлена в книге Паттерны проектирования (Гамма, Хелм, Джонсон и Влиссидес, изд-во Питер , 2003 год), демонстрирующей 23 типовых решения для определенных классов задач. В этой главе рассматриваются основные принципы использования паттернов, которые поясняются примерами. Надеемся, это пробудит в вас интерес к дальнейшему изучению паттернов - важнейшего, почти необходимого инструмента объектно-ориентированного программирования.

Концепция паттернов

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

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

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

В народе именуется книгой банды четырех (Gang of Four, GoF), далее - БЧ.



Концепция эталонов 473

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

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

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

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

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

Одним из самых фундаментальных принципов в БЧ является не паттерн, а аксиома, сформулированная в главе 1: Отдавайте предпочтение композиции объектов перед наследованием классов . Хорошее понимание наследования и полиморфизма требует столь значительных усилий, что программисты склонны преувеличивать значение этих методик. Мы видели много излишне усложненных архитектур (включая и наши собственные разработки), возникающих в результате тяги к наследованию . В частности, тяга к использованию наследования везде, где это возможно, породило много архитектур с множественным наследованием.



1 ... 147 148 149 [ 150 ] 151 152 153 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика