Что такое паттерн проектирования

Термин «паттерн проектирования» пришел из архитектуры, и ввел его в обращение Кристофер Александр, архитектор, при решении задач, возникающих при проектировании зданий и городов [561. Но его слова «любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново» верны и в отношении паттернов проектирования в ПО.

Что же такое паттерны (GoF) — а именно так мы будем обозначать их, отделяя от появившихся позже библиотек шаблонов C++, JAVA, PHP и т. п.

В общем случае паттерн состоит из четырех основных элементов [551.

  • 1. Имя. Сославшись на него, мы можем сразу описать проблему проектирования; ее решения и их последствия. Присваивание паттернам имен позволяет проектировать на более высоком уровне абстракции. С помощью словаря паттернов можно вести обсуждение с коллегами, упоминать паттерны в документации, в тонкостях представлять дизайн системы. Название паттерна должно четко отражать его назначение.
  • 2. Задача. Описание того, когда следует применять паттерн. Необходимо сформулировать задачу и ее контекст. Может описываться конкретная проблема проектирования или перечень условий, при выполнении которых имеет смысл применять данный паттерн.
  • 3. Решение. Описание элементов, отношений между ними, функций каждого элемента. Конкретный дизайн или реализация не имеются в виду, поскольку паттерн применим в самых разных ситуациях. Дается абстрактное описание задачи проектирования и того, как она может быть решена с помощью некоего весьма обобщенного сочетания классов и объектов.
  • 4. Результаты — это следствия применения паттерна и разного рода компромиссы. Хотя при описании проектных решений о последствиях часто не упоминают, знать о них необходимо, чтобы можно было выбрать между различными вариантами и оценить преимущества и недостатки данного паттерна.

Таким образом, под паттернами проектирования понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.

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

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

И самое главное: подавляющее большинство людей понимает паттерн не так, как понимали его создатели. Кстати, также часто применяемый термин «шаблон» не совсем синоним слова «паттерн», ибо паттерн скорее следует переводить с английского как образ...

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

Паттерны проектирования — это не то же самое, что связанные списки или хэш-таблицы, которые можно реализовать в виде класса и повторно использовать без каких бы то ни было модификаций. Но это и не сложные, предметно-ориентированные решения для целого приложения или подсистемы. Паттерн — это абстрактная модель решения некоторых наиболее часто встречающихся общих задач программирования. Собственно множество паттернов вор — это то множество абстрактных задач, на которое Э. Гамма, Р. Хелму, Р. Джонсону и Дж. Влиссидесу хватило фантазии на основе их личного опыта. Впоследствии другими авторами были сформулированы подобные абстракции для задач, не вошедших в перечень паттернов СоР. Но особый смысл паттернов проектирования заключается не в попытке создать некую «таблицу Менделеева», а в понимании необходимости при решении любой задачи двигаться от общего понимания проблемы через абстрактное ее описание к конкретной реализации. И не столь важно, будем мы применять именно паттерны СоБ или сами создадим ни на что не похожий набор универсальных абстракций для нашего проекта.

Д. Влиссидес [57], один из «Банды четырех», описал ряд «Заблуждений» о сути паттернов.

Заблуждение 1. «Паттерн — это решение определенной проблемы в определенных обстоятельствах» (Кристофер Александер).

Проблема: получить выигрыш по лотерейному билету.

Ситуация: собака съела билет за час до истечения указанного срока.

Решение: вскрыть собаку, извлечь билет и бежать к ближайшему пункту выплаты выигрышей.

Это и есть решение проблемы в определенных обстоятельствах. Но это не паттерн.

Чего же не хватает? По крайней мере, трех составляющих:

  • 1. Повторяемости, которая делает решение применимым в ситуациях, отличных от рассматриваемой.
  • 2. Обучения, которое дает понимание, как данное решение связано с конкретным вариантом проблемы. (В реальных паттернах обучающая часть состоит главным образом в описании и выделении движущих сил и/или последствий его применения.)
  • 3. Имени, с помощью которого можно ссылаться на данный паттерн.

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

Разработка определений для терминов — неблагодарный труд, поскольку определение, понятное одной аудитории (скажем, программистам), может показаться полностью бессмысленным другим специалистам.

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

Заблуждение 2. Паттерны — это просто жаргон, правила, приемы программирования, структуры данных...

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

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

Заблуждение 3. Достаточно посмотреть на один из них, чтобы получить представление об остальных.

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

Заблуждение 4. Для успешного применения паттернов необходимы соответствующие инструментальные средства или методологическая поддержка.

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

Четыре основных преимущества паттернов:

  • 1) они позволяют суммировать опыт экспертов и сделать его доступным рядовым разработчикам;
  • 2) имена паттернов образуют своего рода словарь, который позволяет разработчикам лучше понимать друг друга;
  • 3) если в документации системы указано, какие паттерны в ней используются, это позволяет читателю быстрее понять систему;
  • 4) паттерны упрощают реструктуризацию системы независимо от того, использовались ли паттерны при ее проектировании или нет.

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

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

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

Это заблуждение очевидно, поскольку паттерны вообще ничего не гарантируют. Можно говорить только о вероятности получения неких преимуществ. Паттерны никоим образом не могут заменить человека в творческом процессе. Они просто предоставляют дополнительные возможности разработчику.

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

Заблуждение 6. Паттерны порождают готовые архитектурные решения.

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

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

Это особенно полезно при определении и уточнении архитектуры. Но сами по себе паттерны ничего не создают, это делают люди и только в том случае, если они достаточно квалифицированны, а используемые ими паттерны достаточно эффективны.

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

Заблуждение 7. Паттерны предназначены для объектно-ориентированного проектирования и реализации.

Это заблуждение относится к разряду тех, где возможности паттернов чересчур ограничиваются. Паттерны не представляют собой никакой ценности, если они не содержат практического опыта. Какой опыт будет заключен в паттерне, зависит от его разработчика. Безусловно, в объектно-ориентированном проектировании существует огромный опыт, но не менее ценные наработки имеются в проектировании, не основанном на объектно-ориентированной парадигме, и не только в проектировании, но и в анализе, сопровождении, тестировании, документировании, разработке организационной структуры и даже для создания музыкальных композиций!

Всеобъемлющим является лишь понятие паттерна как средства сбора и передачи опыта в любой сфере деятельности.

 
< Пред   СОДЕРЖАНИЕ     След >