Назначение и принципы проектирования с использованием шаблонов.
Под "шаблоном" в общем смысле в контексте, связанном с разработкой ПО, понимается именованная пара "проблема/решение", содержащая рекомендации для применения в различных конкретных ситуациях. Однако появились шаблоны изначально вовсе не в разработке ПО.
Много лет назад архитектор по имени Кристофер Александр задумался над вопросом: "Является ли качество объективной категорией?". Следует ли считать представление о красоте сугубо индивидуальным, или люди могут прийти к общему соглашению, согласно которому некоторые вещи будут считаться красивыми, а другие нет? Александр размышлял о красоте с точки зрения архитектуры. Его интересовало, по каким показателям мы оцениваем архитектурные проекты. Например, если некто вознамерился спроектировать крыльцо дома, то как он может получить гарантии, что созданный им проект будет хорош? Можем ли мы знать заранее, что проект будет действительно хорош? Имеются ли объективные основания для вынесения такого суждения? Существует ли необходимая основа для достижения общего согласия?
Александр принял как постулат, что в области архитектуры такое объективное основание существует. Суждение о том, что некоторое здание является красивым, — это не просто вопрос вкуса. Красоту можно описать с помощью объективных критериев, которые могут быть измерены. К похожим выводам пришли, и исследователи в области в культурологии. В пределах одной культуры большинство индивидуумов имеют схожие представления о том, что является сделанным хорошо и что является красивым. В основе их суждений есть нечто более общее, чем сугубо индивидуальные представления о красоте. Похоже, что существуют некоторые трансцендентные образы или шаблоны, являющиеся объективным основанием для оценки предметов. Основная задача культурологии состоит в описании подобных шаблонов, определяющих каноны поведения и систему ценности каждой из культур.
Исходная посылка создания шаблонов проектирования также состояла в необходимости объективной оценки качества программного обеспечения. Если идея о том, что оценить и описать высококачественный проект возможно, возражений не вызывает, то не пора ли попробовать создать нечто подобное? Если качество проекта является объективной категорией, то мы можем явно определить, что именно делает проекты хорошими, а что — плохими. Александр изучал эту проблему, обследуя множество зданий, городов, улиц и всего прочего, что люди построили для своего проживания. В результате он обнаружил, что все, что было построено хорошо, имело между собой нечто общее. Архитектурные структуры отличаются друг от друга, даже если они относятся к одному и тому же типу. Однако, не взирая на имеющиеся различия, они могут оставаться высококачественными.
Например, два крыльца могут выглядеть конструктивно различными и, тем не менее, обладать высоким качеством — просто они решают различные задачи в различных зданиях. Одно крыльцо может служить для прохода с тротуара ко входной двери, а назначение другого может состоять в создании тени жарким днем. В другом случае два крыльца могут решать одну и ту же задачу, но различными способами.
Александр понял это и пришел к выводу, что сооружения нельзя рассматривать обособленно от проблемы, для решения которой они предназначены. Поэтому в своих попытках найти и описать критерии красоты и качества проекта он стал рассматривать различные архитектурные элементы, предназначенные для решения одинаковых задач. Например, на рис. 5.1 продемонстрированы два различных варианта оформления входа в здание.
5.1. Архитектурные элементы могут выглядеть различными, но выполнять одну функцию
Александр установил, что, сфокусировав внимание на структурах, предназначенных для решения подобных задач, можно обнаружить сходство между различными проектами, которым присуще высокое качество. Он назвал эти сходства шаблонами.
Он определил понятие шаблона как "решение проблемы в контексте". Каждый шаблон описывает проблему, которая возникает в данной среде снова и снова, а затем предлагает принцип ее решения таким способом, который можно будет применять многократно, получая каждый раз результаты, не повторяющие друг друга.
В табл. 5.1 приведены размышления Александра, взятые из его работы. Они иллюстрируют сделанное выше утверждение.
Таблица 5.1. Выдержка из книги "Строительство на века"
Слова Александра | Комментарий |
Аналогичным образом, правильно спроектированный внутренний двор дома способствует отдыху и восстановлению сил его жителей. | Шаблон всегда имеет уникальное имя и предназначен для определенной цели. В данном случае шаблон называется "Внутренний двор", а его назначение состоит в предоставлении жителям дома места для отдыха и восстановления сил. |
Рассмотрим, чем занимаются люди во внутреннем дворе. Прежде всего, они ищут возможность уединиться на свежем воздухе и найти такое место, где можно будет посидеть под открытым небом, полюбоваться звездами, насладиться солнечным теплом или по садить цветы. Это совершенно очевидно. | Хотя иногда это может быть вполне очевидно, нам важно четко сформулировать ту основную задачу, которая может быть решена с помощью данного шаблона. Именно это делает Александр при обсуждении шаблона "Внутренний Двор". |
Но не следует забывать и о других, на первый взгляд, менее важных задачах. В случае, если двор слишком замкнут и не дает необходимого обзора, люди в нем чувствуют себя неуютно. У них возникает желание покинуть это место, поскольку они нуждаются в более широком поле обзора. | Здесь подчеркиваются трудности, связанные с упрощенным подходом к решению задачи, а затем предлагается лучший способ решения, позволяющий избежать указанных затруднений. |
Однако привычка — вторая натура. Когда люди в своей обыденной жизни изо дня в день проходят через внутренний двор множество раз, это место становится для них знакомым, т.е. привычным местом прохода — и именно для этих целей оно будет использоваться ими в дальнейшем. Внутренний двор, не имеющий выхода на улицу, становится местом, которое посещают только изредка, когда хочется именно туда. Он остается непривычным местом, которое используется все реже и реже, поскольку люди, в основном, склонны к посещению знакомых им мест. Кроме того, есть что-то неприятное, нежелательное в том, чтобы из дома выйти сразу на улицу. Это вроде бы мелочь, но ее достаточно, чтобы вызвать нервозность или раздражение. | Привычка очень часто мешает нам увидеть очевидные вещи. Ценность шаблонов в том, что люди, не обладающие большим опытом, могут воспользоваться преимуществами, найденными их более опытными коллегами. Шаблоны позволяют им определять, какие детали должны быть включены для достижения высокого качества проекта, а также чего следует избегать, чтобы не потерять это качество. |
Если есть дополнительное пространство в виде крыльца или веранды под навесом, но открытое для воздуха — с психологической точки зрения это промежуточное состояние между домом и улицей. В результате человеку становиться легче и проще сделать тот короткий шаг, которые выведет его во внутренний двор. | Предлагается решение, способное изменить ваше мнение о преимуществах хорошего внутреннего двора. |
Если внутренний двор позволяет взглянуть на окружающее пространство, представляет собой удобный путь между различными комнатами, включает в себя некоторый вариант крыльца или веранды, то это наполняет его существование смыслом. Внешний обзор делает посещение внутреннего дворика приятным, а пересечение в нем многих путей между помещениями обеспечивает этим посещениям чувство привычности. Наличие калитки или веранды придает дополнительные психологические удобства при выходе из дома на улицу. | Александр рассказывает, как построить отличный внутренний двор… …и поясняет, почему он будет так хорош |
В качестве заключения укажем четыре компонента, которые, по мнению Александра, должны присутствовать в описании каждого шаблона.
• Имя шаблона.
• Назначение шаблона и описание задачи которую он призван решать.
• Способ решения поставленной задачи.
• Ограничения и требования, которые необходимо принимать во внимание при решении задачи.
Александр принял как постулат, что с помощью шаблонов может быть решена любая архитектурная задача, с которой столкнется проектировщик. Затем он пошел дальше и высказал утверждение о том, что совместное использование нескольких шаблонов позволит решать комплексные архитектурные проблемы.
Если описывать временными рамками появление шаблонов получим следующее.
1946 первая публикация (BenedictR., TheChrysanthemumandtheSword, Boston, MA: HoughtonMifflin, 1946) о методе анализа культур с помощью выявления существующих в ней шаблонов под авторством антрополога Рут Бенедикт (Ruth Benedict).
В 1970-е годы архитектор Кристофер Александр составил набор шаблонов проектирования, но в области архитектуры зданий эта идея не получила широкого развития.
В 1987 году Кент Бэк (Kent Beck) и Вард Каннингем (Ward Cunningham) взяли идеи Александра и разработали шаблоны применительно к ПО для получения графических оболочек на языке Smalltalk.
В 1988 году Эрих Гамма (Erich Gamma) начал писать докторскую диссертацию при цюрихском университете об общей переносимости этой методики на разработку программ.
В 1989—1991 годах Джеймс Коплин (James Coplien) трудился над разработкой идиом для программирования на C++ и опубликовал в 1991 году книгу Advanced C++ Idioms.
В этом же году Эрих Гамма заканчивает свою докторскую диссертацию и переезжает в США, где в сотрудничестве с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидсом (John Vlissides) публикует книгу Design Patterns — Elements of Reusable Object-Oriented Software. В этой книге описаны 23 шаблона проектирования. Также команда авторов этой книги известна общественности под названием «Банда четырёх» (англ. Gang of Four, часто сокращается до GoF). Именно эта книга стала причиной роста популярности шаблонов проектирования.
Помимо GoF есть ещё 9 шаблонов GRASP - General Responsibility Assignment Software Patterns (основные шаблоны распределения обязанностей в программном обеспечении). Это методический подход к объектному проектированию. Эти шаблоны называют также шаблонами распределения обязанностей.
В сравнении с полностью самостоятельным проектированием, шаблоны обладают рядом преимуществ:
· Основная польза состоит в снижении сложности разработки за счёт готовых абстракций для решения целого класса проблем.
· Шаблон даёт решению своё имя, что облегчает коммуникацию между разработчиками, позволяя ссылаться на известные шаблоны. Профессиональное общение и работа в группе (команде разработчиков) требует наличия единого базового словаря и единой точки зрения на проблему.
· Производится унификация деталей решений: модулей, элементов проекта, — снижается количество ошибок.
· Возможность многократного использования. Применение шаблонов концептуально сродни использованию готовых библиотек кода. Правильно сформулированный шаблон проектирования позволяет, отыскав удачное решение, пользоваться им снова и снова.Разработчик получает прямую выгоду от использования опыта других разработчиков, избежав необходимости вновь и вновь изобретать велосипед.
· Шаблоны проектирования предоставляют нам абстрактный высокоуровневый взгляд как на проблему, так и на весь процесс объектно-ориентированной разработки. Это помогает избежать излишней детализации на ранних стадиях проектирования.
Возможные недостатки и сложности:
· Требуется дополнительная подготовка разработчика ПО.
· Слепое следование некоторому выбранному шаблону может привести к усложнению программы.
· У разработчика может возникнуть желание попробовать некоторый шаблон в деле без особых оснований.