|
Программирование >> Разработка устойчивых систем
вый поток, в который отправляются сообщения. Поток открывается, если счетчик ссылок положителен, и закрывается, когда счетчик снова падает до нуля (данные всегда дописываются в конец файла). Организуйте отправку сообщений в статический поток со стороны объектов нескольких классов. Проследите за открытием и закрытием потока, включив в 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: Отдавайте предпочтение композиции объектов перед наследованием классов . Хорошее понимание наследования и полиморфизма требует столь значительных усилий, что программисты склонны преувеличивать значение этих методик. Мы видели много излишне усложненных архитектур (включая и наши собственные разработки), возникающих в результате тяги к наследованию . В частности, тяга к использованию наследования везде, где это возможно, породило много архитектур с множественным наследованием.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |