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

03 Ноября 2022 (ред)

Что из себя представляет паттерн?

Паттерн проектирования — это распространённое решение конкретной проблемы при проектировании архитектуры программы.

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

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

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

Из чего состоит паттерн?

Описания паттернов обычно состоят из основных пунктов:

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

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

История паттернов

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

Концепцию паттернов для архитектурного проектирования впервые описал Кристофер Александер в книге «Язык шаблонов. Города. Здания. Строительство». В этой книге, впервые опубликованной в 1977 году, представлен радикально новый подход к архитектуре и строительству. В ней описан «язык» для проектирования окружающей среды, единицы которого - паттерны (patterns) или шаблоны - отвечают на различные архитектурные вопросы и определяют зависимости.

Эта идея показалась группе программистов применимой и к описанию архитектуры программ. В 1994 году четверо авторов Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес написали книгу «Приемы объектно-ориентированного проектирования. Паттерны проектирования», в которую вошли двадцать три паттерна, решающие различные проблемы объектно-ориентированного дизайна. Но название книги было слишком длинным для упоминания, как и перечень авторов, поэтому впоследствии группу авторов стали называть "бандой четырёх", сократив ещё до "GoF" (gang of four), соответственно книгу стали называть "GoF book".

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

Для чего нужно знать паттерны?

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

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

  • Стандартизация кода - скрытые проблемы конкретного подхода найдены и описаны.

  • Общая программистская терминология - проще объяснить коллегам, какой подход вы использовали без длительного объяснения реализации.

Недостатки паттернов

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

Классификация паттернов

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

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

Паттерны также предназначены для различных действий, разделяясь на группы:

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

  • Структурные паттерны устанавливают различные способы построения связей между объектами. Отвечают за построение удобных в поддержке иерархий классов.

  • Поведенческие паттерны заботятся об эффективной коммуникации между объектами. Решают задачи эффективного и безопасного взаимодействия между объектами программы.

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

Для ответа вы можете авторизоваться


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.