Вопрос

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

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

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()

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

Это было полезно?

Решение

Я попробую и придумаю название «паттерн ленивого фильтра (анти)».

Другие советы

Я видел это однажды.Этот программист просуществовал недолго.

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

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

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

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

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

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

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

Судя по всему, это произошло из следующих антипаттернов:

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

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

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

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

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

Тупые любители.

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

Производительность первого на самом деле может быть хорошей, в зависимости от типа Emails.Если это просто итератор (подумайте о std::vector::begin() в C++) тогда это нормально и лучше, чем сначала хранить все неотправленные электронные письма в каком-то контейнере.

У этого антипаттерна есть несколько возможных названий.

  • Антипаттерн «Не знаю SQL»
  • Антипаттерн «Фашист-ДБА»
  • "Что-то, что-то, магистр?" антипаттерн

Есть хороший пример на Ежедневный черт возьми.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top