Какие наихудшие анти-паттерны вы встретили в своей карьере программиста?
Я в основном занимаюсь Java, хотя, вероятно, это не зависит от языка.
Я думаю, что худшее из этого - то, что я называю основным анти-паттерном . Это означает программу, состоящую из одного очень большого класса (иногда сопровождаемого парой маленьких классов), который содержит всю логику. Обычно с большим циклом, в котором содержится вся бизнес-логика, иногда с десятками тысяч строк кода.
language-agnostic
anti-patterns
стривігор
источник
источник
Я ударю другой очевидный с "копи-паста". Копирование кода, который почти идентичен тому, что вы хотите, затем изменение нескольких вещей (вместо извлечения в метод).
Это особенно распространено в некоторых функциональных и API-тестовых кодах конца 90-х годов: буквально сотни (или даже тысячи) практически идентичных тестовых примеров, которые можно было бы разбить на несколько функций, которые принимают 3 или 4 параметра - или, что еще лучше что-то управляемое данными. Моей первой работой после колледжа было буквально 8 месяцев переписывания и рефакторинга тысяч строк копировальной пасты с использованием устаревших методов. К тому времени, как я закончил, тестовые файлы были менее чем на десятую часть от их первоначального размера и намного более удобны в обслуживании (и читаемы!).
источник
Я думаю, что я могу много написать о Pattern Mania и решениях, которые можно решить с гораздо меньшими усилиями, но я бы скорее указал на большую статью, которую я недавно прочитал, с фантастическим примером того, как простое решение может быть слишком сложным ,
Как (не) писать Факториал на Java или так, мы вводим фабрику в ваш алгоритм
источник
Золотой Молот
источник
районы
В C # вы можете определить область кода, которая может быть свернута в IDE, тем самым скрывая ее, если вы не хотите иметь дело с этим кодом. Я принимал (в настоящее время включаю) проект, в котором регионы охватывали сотни строк (если бы я преувеличивал), и в функции из тысячи строк было несколько регионов (опять же, я хотел бы шутить).
С другой стороны, разработчик, который сделал регион, проделал очень хорошую работу по определению конкретных функций в регионе. Настолько, что я смог сделать метод извлечения для региона и двигаться дальше.
Регионы поощряют разработчиков «прятать» свое дерьмо на виду.
источник
DoNotUseRegions
.#region SQL Update
делает его разборным, поэтому требуется меньше прокрутки.Для меня худший шаблон это Копировать / Вставить .
источник
Не перегруженные методы:
Наглядно видно, что программист не понимал перегрузки.
источник
Последовательности петлевого переключателя
http://en.wikipedia.org/wiki/Loop-switch_sequence
Они бесконечно раздражают меня и показывают, насколько неопытным был
источник
Мягкое кодирование , т.е. когда программисты стараются изо всех сил избегать жесткого кодирования и оказываются на другой стороне шкалы - «жестко закодированные» зависимости.
источник
Сохраняйте состояние в клиенте.
Когда-то работал с веб-приложением, где все состояние сохранялось в браузере. (Для обеспечения бесперебойной масштабируемости все исключения были проигнорированы).
источник
Массивные Checkins
Я ненавижу, когда вижу, что разработчик не прошел регистрацию за неделю. Это означает, что он либо застрял и не искал помощи, либо собирает кучу функций в одну большую регистрацию. (Я пропустил наихудший сценарий, он просто ничего не делает. Это легко решить ... два слова звучат так, как будто тебя наняли.)
Если вы делаете большую регистрацию, вы теряете много преимуществ SCM, например, возможность связать набор изменений с определенной функцией. Кроме того, вам, вероятно, придется сделать много слияний, и это не всегда легко сделать правильно.
источник
В настоящее время я работаю с устаревшим кодом, и мне нравится, как предыдущий кодер получает первый элемент списка:
Но самое худшее, что я видел в этом коде, это определение классов встроенных страниц JSP, написание всего HTML, CSS и Javascript с использованием scriptlet и out.println :-(
источник
Одним из худших поведенческих анти-паттернов, которые я видел, был магазин, который позволял проверять код только для контроля версий после его производства. В сочетании с эксклюзивными проверками в VSS это привело к запутанному процессу отмены проверок, если производственный дефект необходимо было исправить до следующего выпуска, не говоря уже о том, что несколько человек нуждались в изменении данного файла для предстоящего выпуска.
Тот факт, что это была политика департамента, сделал это еще хуже, чем случай, когда один разработчик вел себя таким образом.
источник
Блокировка на строковом литерале
Очень длинные имена классов. (в JRE)
Плохая структура наследования
Исключение, которого нет.
Бессмысленная и загадочная обработка ошибок
Ненужное создание объектов
Бросать исключение для других целей
Использование объектов экземпляра для статических методов.
Синхронизация на не финальном поле
Бессмысленная копия постоянной строки
Бессмысленный вызов String.toString ()
Вызов System.gc () для освобождения памяти
Установка локальной переменной на ноль для освобождения памяти
Использование ++ i вместо i ++ по соображениям производительности (или любой другой микро-микро-оптимизации)
источник
Код посыпан:
или
без дополнительной информации.
источник
Итератор для чайников:
Singletono-Factory:
разработка, управляемая if-else (также называется принципом открытого закрытия - открытым для модификации, близкого для понимания):
StringPattern (также называется StringObject):
источник
else if
зачастую это единственный способ добиться цели. Я думаю о строках; не могу использовать переключатель. Условия должны быть одинаковыми, чтобы это было полезно.getInstance
возвращает один и тот же экземпляр. Такое предположение нарушит инкапсуляцию и является одним из самых распространенных анти-паттернов.Это не столько паттерн кодирования, сколько поведенческий паттерн, но он довольно плох: модифицирует что-то в коде (скажем, требования изменились), затем настраивает все модульные тесты, пока код не пройдет его. Настраиваем или просто удаляем весь тестовый код из тестового метода, но оставляем метод там.
Это связано с более общим шаблоном, который будет делать , вот примерная строка кода для него:
Это работает, в конце концов.
источник
Я абсолютно презираю инверсию абстракций или переизобретение низкоуровневых примитивов поверх высокоуровневых примитивов. Иногда, однако, это вызвано плохими дизайнерами языка, а не плохими программистами. Примеры:
Использование одного класса метода без переменных-членов и соответствующего интерфейса (реализовано в виде таблиц указателей на функции) вместо указателя на функцию. Обратите внимание, что в таких языках, как Java, у вас может не быть выбора.
В MATLAB и R настойчивое требование, что все является вектором / матрицей, а не примитивом.
Пока мы работаем над MATLAB, как насчет того, что в нем нет целых чисел, поэтому, когда вам нужно целое число, вы должны использовать двойное число.
Чисто функциональные языки, где вы должны использовать вызовы функций для написания цикла.
источник
Это было бы определенно копирование / вставка, из-за этого я видел много плохого кода, это и ковбойское кодирование и все, что вытекает из этого. (Классы Бога, очень большие методы, плохо продуманные алгоритмы и т. Д.)
И если бы разрешались шаблоны проектирования, я бы сказал: «Выполнение проекта как набора действий из плана, без какого-либо проектирования или анализа предметной области».
источник
Многофункциональный боб Java -
Java-бин с большим количеством переменных, используемых в различных операциях. Каждая операция использует произвольное подмножество переменных bean-компонента и игнорирует другие. Несколько переменных для состояния графического интерфейса, несколько переменных, добавляемых для передачи между компонентами, некоторые, которые, вероятно, даже больше не используются. В лучших примерах нет документации, которая помешала бы оценке шаблона.
Кроме того, не могу забыть любимого
источник
Бывший сотрудник имел обыкновение повторно использовать объекты, перезаписывая их свойства, вместо того, чтобы просто создавать новые. Я никогда не мог представить, сколько проблем это вызвало при внедрении новых функций.
источник
Что-то, что вызвало у меня много горя, это шаблон «Большая карта в небе». Бродить вокруг карты вместо использования правильных объектов. Вы не представляете, какие «переменные» он содержит, без отладки, и вы не знаете, что он может содержать, не отслеживая код в обратном направлении. Обычно отображает строки в объекты или строки в строки, которые вы потенциально должны анализировать в примитивы.
источник
Один из моих любимых шаблонов разработки - использование «дизайна» базы данных, который требует постоянного добавления дополнительных столбцов в одну или несколько таблиц программным способом . Это двоюродный брат «дизайна», который создает новую таблицу для каждого экземпляра объекта. И то, и другое неизбежно затрагивает ограничения сервера базы данных, но обычно это происходит до тех пор, пока система не будет работать в течение достаточно долгого времени.
источник
Я думаю, что одним из худших анти-паттернов, которые я видел, является использование таблицы базы данных в качестве временного хранилища вместо использования памяти компьютера.
Проблемная область является частной собственностью, что не позволяет мне объяснять это, но нет необходимости понимать основную проблему. Это было приложение с графическим интерфейсом, написанное на Java с базой данных. Это должно было взять определенные входные данные, манипулировать ими и затем передать обработанные данные в базу данных.
Наш проект имеет довольно сложный алгоритм, который сохраняет промежуточные значения для последующей обработки. Вместо того, чтобы инкапсулировать временные объекты в ... объектах, была создана таблица базы данных, например, "t_object". Каждый раз, когда значение вычислялось, оно добавлялось в эту таблицу. После того, как алгоритм завершит свою работу, он выберет все промежуточные значения и обработает их все в одном большом объекте Map. После завершения всей обработки оставшиеся значения, помеченные для сохранения, будут добавлены в реальную схему базы данных, а временные записи в таблице "t_object" будут отброшены.
Таблица также использовалась как уникальный список, данные могли существовать только один раз. Это могло бы быть приличной особенностью дизайна, если бы мы реализовали ограничения в таблице, но в итоге мы перебрали всю таблицу, чтобы посмотреть, существуют ли данные или нет. (Нет, мы даже не использовали запросы, которые использовали предложения where с CONTAINS)
Некоторые из проблем, с которыми мы столкнулись из-за этого проекта, были специально отлажены. Приложение было построено для передачи данных, поэтому было бы несколько графических интерфейсов, которые будут обрабатывать данные до того, как они достигнут этого алгоритма. Процесс отладки состоял в том, чтобы обработать контрольный пример, а затем сделать паузу сразу после завершения вышеуказанного раздела. Затем мы запросим базу данных, чтобы увидеть, какие данные содержатся в этой таблице.
Еще одна проблема, которую мы обнаружили, заключалась в том, что данные не были должным образом удалены из этой временной таблицы, что может помешать выполнению в будущем. Мы обнаружили, что это связано с неправильной обработкой исключений и, следовательно, с неправильным завершением работы приложения и удалением данных из таблицы, которой он управлял.
Если бы мы использовали базовый объектно-ориентированный дизайн и сохранили все в памяти, эти проблемы никогда бы не возникли. Во-первых, отладка была бы простой, так как мы могли бы легко установить точки останова в приложении, а затем проверить память в стеке и куче. Во-вторых, при неправильном выходе из приложения, память Java была бы очищена естественным образом, не беспокоясь об удалении ее из базы данных.
ПРИМЕЧАНИЕ: я не говорю, что этот паттерн по своей сути плох, но в этом примере я обнаружил, что он не нужен, когда основных принципов ОО было бы достаточно.
Я не уверен в названии этого анти-паттерна, так как впервые вижу подобное. Какие хорошие имена вы, ребята, можете придумать для этого шаблона?
источник
Тележка перед лошадью - так называемый YouMightNeedIt
Например:
источник
IMO худший антишаблон, который я когда-либо видел, это анти-паттерн «Нам не нужны вонючие паттерны»: идея в том, что паттерны проектирования - это пустая трата времени, и вы можете писать код быстрее, просто вставляя его вместе и копируя / вставка по мере необходимости.
Похвальное упоминание - наличие кода, который загружает объект из базы данных, используя старый стиль VB6:
на самом деле не является анти-паттерном, но демонстрирует недостаток использования правильной архитектуры и разделения проблем.
Кроме того, такие вещи:
источник