Решил оживить давно умерший раздел программирования. Анти-паттерны (anti-patterns), также известные как ловушки (pitfalls) — это классы наиболее часто внедряемых плохих решений проблем. Они изучаются, как категория, в случае когда их хотят избежать в будущем, и некоторые отдельные случаи их могут быть распознаны при изучении неработающих систем.
Термин происходит из информатики, из книги «Банды четырёх» Шаблоны проектирования, которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «шаблонами проектирования», и противоположными им являются «анти-паттерны». Частью хорошей практики программирования является избежание анти-паттернов.
Концепция также прекрасно подходит к машиностроению. Несмотря на то, что термин нечасто используется вне программной инженерии, концепция является универсальной.
Анти-паттерны в управлении разработкой ПО
* Дым и зеркала (Smoke and mirrors): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми фокусники скрывают свои секреты).
* Раздувание ПО (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов.
* Функции для галочки: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в рекламе, что функция есть).
Анти-паттерны в разработке ПО
* Инверсия абстракции (Abstraction inversion): Создание простых конструкций поверх сложных (спорный)
* Неопределённая точка зрения (Ambiguous viewpoint): Представление модели без спецификации её точки рассмотрения
* Большой комок грязи (Big ball of mud): Система с нераспознаваемой структурой
* Блоб (Blob): см. Божественный объект (God object)
* Бензиновая фабрика (Gas factory): Необязательная сложность дизайна
* Затычка на ввод данных (Input kludge): Забывчивость в спецификации и выполнении поддержки возможного неверного ввода
* Раздувание интерфейса (Interface bloat): Изготовление интерфейса очень мощным и очень трудным для осуществления
* Магическая кнопка (Magic pushbutton): Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, в системах типа Delphi это написание прикладной логики в обработчиках нажатий на кнопку.
* Перестыковка (компьютер) (Re-Coupling): Процесс внедрения ненужной зависимости
* Дымоход (Stovepipe system): Редко поддерживаемая сборка плохосвязанных компонентов
* Гонки (Race hazard, Race condition): Ошибка в определении последовательности различных порядков событий
Анти-паттерны в объектно-ориентированном программировании
* Базовый класс-утилита (BaseBean): Наследование функциональности из класса-утилиты вместо делегирования к нему
* Вызов предка (CallSuper): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка.
* Ошибка пустого подкласса (Empty subclass failure): Создание класса (Perl), который не проходит «проверку пустоты подкласса» («Empty Subclass Test») из-за различного поведения по сравнению с классом, который наследуется от него без изменений
* Божественный объект (God object): Концентрация слишком большого количества функций в одиночной части дизайна (классе)
* Объектная клоака (Object cesspool): Переиспользование объектов, чьё состояние не удовлетворяет (возможно неявному) контракту переиспользования.
* Полтергейст (компьютер) (Poltergeist): Объекты, чьё единственное предназначение — передавать информацию другим объектам
* Проблема йо-йо (Yo-yo problem): Структура (например: наследования) которая тяжело понятна вследствие избыточной фрагментации
* Синглетонизм (Singletonitis): Избыточное использование паттерна синглетон
Анти-паттерны в программировании
* Ненужная сложность (Accidental complexity): Внесение ненужной сложности в решение
* Действие на расстоянии (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы
* Накопить и запустить (Accumulate and fire): Установка параметров подпрограмм в наборе глобальных переменных
* Слепая вера (Blind faith): Недостаточная проверка (a) корректности исправления ошибки или (b) результата работы подпрограммы
* Лодочный якорь (Boat anchor): Сохранение более не используемой части системы
* Активное ожидание (Busy spin): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать систему сообщений
* Кэшированный сбой (Caching failure): Забывать сбросить флаг ошибки после её обработки
* Проверка типа вместо интерфейса (Checking type instead of membership, Checking type instead of interface): Проверка того, что объект имеет специфический тип в то время, когда требуется только определённый интерфейс
* Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы
* Кодирование путём исключения (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая
* Таинственный код (Cryptic code): Использование аббревиатур вместо полных (самоописывающих) имён
* Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации
* Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование.
* Поток лавы (Lava flow): Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия
* Магические числа (Magic numbers): Включение чисел в алгоритмы без объяснений
* Процедурный код (Procedural code): Когда другая парадигма является более подходящей
* Спагетти-код (Spaghetti code): Системы, чья структура редко понятна, особенно потому что структура кода используется неправильно
* Мыльный пузырь (Soap bubble): Класс, инициализированый мусором, максимально долго притворяется, что содержит какие-то данные.