- Паттерны проектирования и их роль в объектно-ориентированном программировании
- Полиморфизм в паттернах или Паттерн создания Паттернов
- Антипаттерны
- Выводы
Паттерны проектирования — это стандартизированные подходы к решению типовых задач в области программирования. Мы уже изучили множество паттернов, в том числе Стратегию и Фабрику.
В этом уроке мы поговорим о том, как использовать паттерны проектирования в контексте объектно-ориентированного программирования (ООП). Также сосредоточимся на применении полиморфизма в паттернах проектирования, поскольку это ключевой аспект многих широко используемых паттернов.
Паттерны проектирования и их роль в объектно-ориентированном программировании
Паттерны не связаны с понятием ООП, но именно в ООП их любят структурировать и описывать. Поэтому паттерны особенно распространены в языках с классовой структурой, например, Java, C# или PHP.
Большинство паттернов сводится к тому, как правильно применять полиморфизм подтипов в разных ситуациях. Некоторые из широко известных, которые опираются на полиморфизм:
- Адаптер
- Стратегия
- Абстрактная фабрика
- Мост
- Композит
- Декоратор
- Посредник
- Цепочка ответственности
- Наблюдатель
- Состояние
- Шаблонный метод
- Посетитель
Одни связаны с абстракцией и имеют внутреннее состояние, другие — обычные функции, упакованные в классы только ради полиморфизма. При этом последние могли бы быть реализованы и обычными функциями, которые диспетчеризуются разными способами.
В мире ООП-паттернов их основным источником считается книга «Приемы объектно-ориентированного проектирования. Паттерны проектирования». В ней описано много полезных подходов, но нужно учитывать следующие моменты:
- Примеры в книге описаны на языке C++ и имеют более сложную реализацию, чем это нужно в динамических языках
- Многие паттерны рождаются вследствие ограничений конкретного языка, например, паттерн «Команда». В JavaScript это естественный способ писать код, и для этого не нужны классы
- Не все паттерны, описанные в этой книге, важны для веб-разработчиков. Вероятность того, что вам придется когда-то иметь дело с абстрактной фабрикой — крайне мала
- Самих паттернов намного больше, чем указано в этой книге
Полиморфизм в паттернах или Паттерн создания Паттернов
Большая часть паттернов, которая связана с полиморфизмом, строится по одному принципу. Зная его, можно самостоятельно принимать правильные решения. Ключевая идея состоит в том, что берется все множество вариантов поведения и на каждый создается свой класс.
Например, в «Стратегии» количество классов-стратегий совпадает с количеством разных способов вычисления. Если их будет пять, то придется создать пять классов. Так происходит в классовых языках.
В языках, где предпочитают функции, будет создано пять разных функций, и это все равно будет «Стратегия».
Антипаттерны
Антипаттерны — это типовые ошибки, которые совершают программисты. У них бывают конкретные и даже шуточные названия: паблик морозов или божественный объект.
Подходы, которые ранее считались паттернами, иногда перетекают в раздел антипаттернов. Например, паттерн «Одиночка» или Singleton – объект, который может существовать только в единственном экземпляре. Как показала жизнь, это плохо почти всегда. Кроме того, код с Singleton сложно тестировать.
Выводы
Про паттерны говорят все. Но мало кто действительно прочитал, понял их и может разумно применять. Причин этому несколько:
- Сложно осознать паттерн, не столкнувшись с реальной проблемой, которую он решает
- Настоящее понимание паттернов завязано на те вещи, которые мы разбирали на протяжении всей профессии: именование, менеджмент состояния, побочные эффекты, абстракции, расширяемость, полиморфизм подтипов. Без понимания этих вещей попытка использовать паттерны почти наверняка превратится в Культ Карго. Причем из всего списка выше паттерны по эффекту оказываемому на код, находятся на последнем месте
Важно понимать, что паттерны — это не причина, а следствие. Сначала нужно понять ситуацию, а потом возникнет паттерн. И совершенно нормально, что первые годы разработки задачи будут решаться так, как получается.
Обучение происходит через ошибки и неправильные решения, этого не надо бояться и избегать. Главное — это последовательное улучшение, а здесь помогут книги и наставники. О том, как лучше читать книги, в том числе по паттернам, мы писали в статье.
Дополнительные материалы
- Принцип единственной ответственности
- Вебинар: Что такое паттерны программирования
- Паттерны (Редакция Хекслета)
- Антипаттерны
- Архитектура корпоративных приложений
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.