Как называется этот анти-паттерн? - PullRequest
5 голосов
/ 01 апреля 2009

Конечно, некоторые из вас имели дело с этим. Это происходит, когда программисты слишком заняты ОО и забывают о производительности и наличии базы данных.

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

Emails = find_every_damn_email_in_the_database();
FOR Email in Emails
  IF !Email.IsSent() THEN Email.Send()

Это хорошо с точки зрения "не повторяй себя", но иногда это неизбежно и должно быть:

Emails = find_unsent_emails();
FOR Email in Emails
  Email.Send()

Есть имя этого?

Ответы [ 13 ]

9 голосов
/ 01 апреля 2009

Я пойду и напишу название «ленивый фильтр (анти)».

5 голосов
/ 01 апреля 2009

Я видел это однажды. Этот программист не был рядом слишком долго.

Мы назвали этот «метод пожарного рукава».

2 голосов
/ 01 апреля 2009

Я называю это «Подход к дробовику».

2 голосов
/ 01 апреля 2009

Для меня это дырявая абстракция Джоэля Спольски .

Это не совсем анти-паттерн, но тот, кто написал этот код, на самом деле не понимал, куда протекает абстракция паттерна Active Record.

1 голос
/ 01 апреля 2009

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

Я назвал это скачущая общность .

1 голос
/ 01 апреля 2009

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

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

1 голос
/ 01 апреля 2009

По-видимому, получены из следующих анти-паттернов:

Первоначальному разработчику, возможно, не разрешили бы написать реализацию find_unsent_emails (), и, следовательно, он использовал бы функцию миддл. А потом, зачем его менять после разработки и тестирования?

1 голос
/ 01 апреля 2009

Я не уверен, что это обязательно связано с базой данных, поскольку у вас может быть сложная и дорогая процедура (например, больше, чем флаг) для применения фильтра для группы.

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

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

0 голосов
/ 11 декабря 2009

Вдохновленный частично 1800-ми «ленивым (анти) паттерном фильтра», как насчет «дисфункционального программирования» (то есть, противоположного функциональному программированию)?

0 голосов
/ 01 апреля 2009

Есть хороший пример на The Daily WTF .

...