Неправильные шаблоны дизайна - PullRequest
19 голосов
/ 31 октября 2008

Есть ли в каноническом списке «Банды четырех» какие-либо шаблоны проектирования, которые вы часто обнаруживаете неправильно, неправильно или слишком часто (помимо обсуждаемого синглтона)? Другими словами, есть ли шаблон дизайна, который вы бы посоветовали дважды подумать перед использованием? (А почему?)

Ответы [ 15 ]

17 голосов
/ 31 октября 2008

шаблон синглтона .. Глобальное состояние часто приводит к проблемам при тестировании

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

15 голосов
/ 31 октября 2008

Заводские паттерны ...

Я был спущен с парашютом в проект, где каждый MyObject в системе имел эквивалент MyObjectFactory для генерации новых экземпляров. Не было понятия абстракции или расширенных классов ... просто старый ClassX & ClassXFactory.

И никто не мог объяснить, почему ... «Так было всегда» 1007 *

9 голосов
/ 31 октября 2008

Единственным (кроме вышеупомянутого Синглтона и его соучастника в преступлении, Фабрики) не будет GoF, это будут сеттеры и геттеры при применении к собственным свойствам объекта.

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

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

Используя сеттер и / или геттер, вы по-прежнему выставляете свою внутреннюю структуру-член для внешнего мира (например, вам придется реорганизовать другие классы, если вы обнаружите, что вам нужно изменить int на long), и вы почти гарантируя, что некоторый код, который должен быть внутри вашего объекта, вместо этого размещается снаружи.

Есть несколько исключений, о которых я могу подумать:

Сеттеры, используемые для упрощения конструкции объектов. Иногда необходимо создать объект, а затем установить другие значения. Эти значения должны быть неизменными (вы не должны вызывать set дважды) для безопасности.

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

Java Beans, используемые для компонентов экрана: Да, не могу найти лучшего способа реализовать эти "шары свойств". Отражение пригодится для этого компонента, шаблоны полезны - это довольно странно, но работает.

Объекты DAO / DTO Bean. Честно говоря, я думаю, что это ненадежное использование паттерна, но это паттерн . Это делает манипулирование свойствами с помощью метаданных вместо кода гораздо сложнее, чем должно быть, поскольку оно должно быть отражающим. Свойства bean-компонентов всегда связаны с каким-либо внешним источником (формат базы данных, формат передачи данных, свойства компонента, ...), так почему же мы дублируем работу по определению каждой части?

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

Короткая версия -

if (account1.balance > 1000)
{
    account1.balance = account1.balance - 1000;
    account2.balance = account2.balance + 1000;
}; = BAD CODE. 

account2.deposit(account1.withdraw(1000)); = GOOD CODE. 

Второй не требует доступа ... - kyoryu (Немного изменен Биллом К, потому что у меня есть немного больше места, чем он сделал в своем комментарии).

Второй перемещает тест и некоторую другую математику в Аккаунт, а не дублирует его во всем коде, куда бы вы ни делали перевод.

Просто для того, чтобы обозначить точку ДАЖЕ БОЛЬШЕ, обратите внимание, что со стилем «ХОРОШИЙ КОД» вполне очевидно, что вывод .withdraw может быть объектом транзакции, который содержит информацию обо всей транзакции, включая ее успех, источник и назначение, а также ведение журнала. способность. Как бы это произошло с тем, кто пишет свой код в стиле «ПЛОХОЙ КОД»?

Кроме того, как бы вы реорганизовали BAD CODE, чтобы даже использовать такой объект? Это просто беспорядок.

4 голосов
/ 31 октября 2008

Я бы тоже сказал заводской шаблон. Подобный опыт, как Eoin. В моем случае в проекте было множество фабрик, потому что некоторые люди думали, что вы могли использовать объект A для локальной реализации и объект B для удаленной, и он был абстрагирован с помощью фабрики (что разумно сделать).

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

4 голосов
/ 31 октября 2008

На самом деле, чаще всего я вижу отсутствие использования соответствующего паттерна. Типичный сценарий: me: «Привет, модуль A уже имеет фрагмент кода, который просматривает набор объектов и выполняет над ними операцию базы данных X, почему вы не использовали этот код повторно?» кодер: «хорошо, но я должен был сделать операцию Y на этих объектах». я: «как насчет использования рефакторинга для использования шаблона Command для выполнения X или Y в зависимости от ситуации?»

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

3 голосов
/ 25 сентября 2009

ALL.

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

Речь идет не о том, чтобы не использовать тогда, это именно то, что вы сказали в вопросе «подумайте дважды, прежде чем использовать». Хорошо поймите, что вы делаете и почему. Если вы этого не сделаете, поговорите с кем-нибудь, кто может научить вас этому - помимо того, что вы много читаете. Остерегайтесь тех, кто знает все шаблоны, но не может четко объяснить вам, что / почему для любого из них, особенно для рассматриваемого.

2 голосов
/ 31 июля 2009

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

2 голосов
/ 22 ноября 2008

На самом деле, я бы сказал, что шаблоны проектирования в общем случае чрезмерно используются, когда все, что нужно, - это решение KISS ( Keep It Simple, Stupid Keep it Short and Simple ).

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

2 голосов
/ 31 октября 2008

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

Для такой вездесущей модели вряд ли можно говорить о правильном процессе принятия решения о том, когда должен умереть синглтон.

Просто мои 0,02.

ура

Rob

1 голос
/ 26 сентября 2009

Я просто хотел добавить еще один комментарий после просмотра некоторых ответов "Все шаблоны плохие".

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

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

Полагаю, если вы новичок в программировании, было бы очень полезно прочитать их, чтобы в тот день, когда он вам нужен, вам не приходилось разбираться самостоятельно, он уже есть в вашем наборе инструментов, но в целом - любая из них может быть выяснена Бандой Одного (anyOne!).

Если есть какие-то из них, которые вы еще не знали, вам, вероятно, это никогда не понадобилось.

Довольно полезно ставить имена для скороговорок и немного их формализовать, хотя я вообще не жалуюсь на книгу. Если вы не видите здесь случайной необходимости почти во всех шаблонах, вы просто не работаете над очень сложным кодом (или часто дублируете код, что я считаю ГЛАВНЫМ грехом).

...