Паттерны GoF
Тема дорожной карты · Software Architecture
Паттерны GoF (Gamma, Helm, Johnson, Vlissides, 1994) представляют собой каталог 23 объектно-ориентированных паттернов, разделённых на три категории: порождающие (как объекты появляются), структурные (как объекты сочетаются) и поведенческие (как объекты общаются). Эта книга является одной из самых влиятельных в области software engineering, хотя многие из предложенных паттернов (например, Singleton и Factory) сегодня рассматриваются скорее как следствие ограничений старых языков программирования, нежели как универсальные решения.
Как это работает
Чтобы эффективно использовать паттерны GoF, начните с изучения их как словаря, а затем переходите к их практическому применению. При возникновении design-проблемы важно уметь распознавать, какой паттерн подходит для её решения. Например, если вам нужно добавить поведение без изменения класса, можно использовать паттерн Decorator. Если требуется реализовать взаимозаменяемые алгоритмы, то подойдет паттерн Strategy. Важно помнить, что применение паттерна должно реально решать вашу проблему с разумными компромиссами, а не просто потому, что вы знаете этот паттерн.
Когда применять
Паттерны GoF особенно полезны при коммуникации design-решений, так как они позволяют сжать длинные объяснения до кратких и понятных описаний. Например, вы можете сказать: "Мы обработаем это через Strategy и Visitor". Однако, если ваш язык программирования предоставляет более идиоматичное решение для определенной проблемы (например, функциональные языки часто не требуют явного использования паттернов Iterator или Strategy), то применение этих паттернов может быть излишним.
Типичные ошибки
(1) Pattern-driven design — это распространенная ошибка, когда паттерны применяются независимо от их подходящести, просто потому что разработчик их знает. Симптомы такой ошибки могут включать создание сложных и избыточных классов, таких как AbstractSingletonFactoryProxyFactoryStrategy.
(2) Отношение к GoF как к евангелию — книга GoF была опубликована более 30 лет назад, и некоторые из предложенных паттернов устарели. Например, паттерн Singleton может быть неэффективным в многопоточных приложениях.
(3) Игнорирование функциональных альтернатив — многие паттерны GoF были разработаны как обходные пути для языковых ограничений, которые современные функциональные возможности могут решить напрямую. Например, паттерн Iterator часто не требуется в языках, поддерживающих итераторы напрямую.