Мне нравятся шаблоны проектирования, но они (кроме простых, таких как Singleton) определенно добавляют сложности к приложению. Они добавляют некоторое измерение в дизайн, который не является интуитивно очевидным для начинающего дизайнера (и не является частью функций языка программирования).
Некоторые люди могут чувствовать, что шаблоны уменьшают сложность из-за преимуществ, которые они приносят с точки зрения нефункциональных требований программного обеспечения, таких как ремонтопригодность, расширяемость, возможность повторного использования и т. Д. Однако я не согласен и рассматриваю преимущества как возврат на сложность вложения . Возможно, в некоторых случаях закономерности уменьшают сложность, но теоретическое обсуждение такого рода дает больше тепла, чем света. Почти ни один из ответов до сих пор не использовал конкретные примеры, кроме https://stackoverflow.com/a/760968/1168342.
Чтобы быть точным, многие шаблоны увеличивают случайную сложность проекта путем введения новых структур (интерфейсов, методов и т. Д.), Которых не было в проекте до шаблона. был применен.
Давайте используем Посетитель в качестве примера.
Посетитель - это способ отделения операций от структуры объекта, с которой они работают.
Перед решением с помощью Visitor операции жестко запрограммированы в каждом элементе структуры объекта. Задача для разработчика состоит в том, что добавление новых операций включает в себя изменение кода в различных элементах.
После применения шаблона Visitor существует дополнительная иерархия классов посетителей, которая инкапсулирует операции.
Поток
контроль в решении определенно более сложный, и будет сложнее
для отладки (любой, кто реализовал Visitor и пытался следовать
программа дважды отправит звонков с принять / посетить будет знать это).
Понимание и поддержание функций посетителя с точки зрения
связные единицы менее сложны, чем альтернатива кодирования
функции в каждом из элементов в фиксированной структуре, которая
посетил. Это преимущество шаблона.
Трудно сказать количественно, насколько велика случайная сложность или насколько проще добавлять новые операции. Я, конечно, не согласен с ответами, которые делают общее заявление о том, что в долгосрочной перспективе сложность уменьшается с применением шаблона. Не похоже, что ваш дизайн «забывает» двойную диспетчеризацию, добавленную подходом Visitor, просто потому, что у вас есть код, который позволяет легко добавлять операции. Сложность - это цена (или налог), которую вы платите, чтобы получить преимущество в ремонтопригодности.
Шаблоны все еще должны применяться
Независимо от предполагаемого знакомства с шаблонами, любой данный шаблон должен применяться к решению. Это приложение будет отличаться каждый раз (Мартин Фаулер сказал, что паттерны - это всего лишь полуготовые решения ) Разработчики всегда должны понимать, какие классы играют, какие роли в существующем дизайне, что обусловлено существенной сложностью (сложность проблемы приложения), которая часто является нетривиальной.
В лучшем случае, понимание шаблона проектирования, примененного в уже сложном приложении, может быть тривиальным, но это не 0 усилий:
- Шаблоны не всегда применяются одинаково. Есть много вариантов паттернов - на ум приходит Proxy. Я не уверен, что все согласны с тем, как следует применять тот или иной шаблон.
- Введение одного шаблона (например, Стратегия для инкапсуляции алгоритмов) часто приводит к другим шаблонам для правильного управления вещами (например, Фабрика для создания конкретных Стратегий).
- Введение шаблона часто приводит к увеличению ответственности. Очистка объекта при использовании Factory не тривиальна (а также не документирована в GoF). Кто из вас знает о так называемой проблеме Lapsed-listener ?
- Что произойдет, если произойдут изменения в предположениях о необходимости шаблона (например, больше не будет необходимости иметь несколько инкапсулированных алгоритмов, предоставляемых шаблоном Strategy)? Это будет дополнительная работа, чтобы удалить шаблон позже. Если вы не удалите его, новые разработчики могут быть обмануты его присутствием, когда они появятся на борту. Шаблоны переплетаются между классами, играющими роли в шаблоне. Удаление не тривиально.
Эрих Гамма представил на ECOOP 2006 * анекдот, в котором один из дизайнеров решил удалить абстрактный шаблон фабрики из коммерческой многоплатформенной среды графического интерфейса (классический пример абстрактной фабрики!). Оказалось, что многоуровневая косвенность (полиморфные вызовы) в сложных графических интерфейсах была значительным ударом по производительности в клиентском коде. Клиенты жаловались на медлительность графического интерфейса, и «оптимизация» заключалась в удалении косвенных указаний. В этом случае производительность превысила ремонтопригодность; шаблон только радует кодеров, а не конечных пользователей.
DAO пример
С точки зрения примера DAO, который вы приводите в вопросе, если вы кодируете приложение, которое никогда не будет нуждаться в работе с различными базами данных, то шаблон DAO - это ненужный уровень сложности. В общем, если ваш код не нуждается в преимуществах, которые должен обеспечивать шаблон, применение этого шаблона излишне увеличит сложность вашего приложения.
метафора с вращающейся дверью
Используя здания в качестве метафоры, давайте рассмотрим вращающуюся дверь как образец проектирования здания. Следующее изображение взято из Википедии:
Вы можете "увидеть" дополнительную сложность в такой двери. Преимущества вращающихся дверей в экономии энергии. Они пытаются решить проблему, когда люди часто заходят в здание и выходят из него, а открывание / закрывание стандартной двери позволяет каждый раз обмениваться слишком большим количеством воздуха внутри здания.
Вероятно, не имеет смысла устанавливать вращающуюся дверь в качестве входа в дом с двумя спальнями, потому что не хватает трафика, чтобы оправдать дополнительную сложность. Вращающаяся дверь по-прежнему будет работать в доме с двумя спальнями. Преимущества с точки зрения экономии энергии будут небольшими (и могут быть даже хуже из-за размера и герметичности по сравнению с обычной дверью). Дверь наверняка будет стоить дороже и займет больше места, чем традиционная дверь.