Всякий раз, когда я слышу об Анти-паттернах, я вспоминаю другой термин, а именно. Дизайнерский запах.
«Запахи проектирования - это определенные структуры в проекте, которые указывают на нарушение фундаментальных принципов проектирования и негативно влияют на качество проектирования». (Из «Рефакторинг для запаха проектирования программного обеспечения: управление техническим долгом»)
Есть много дизайнерских запахов, классифицированных на основе нарушающих принципы дизайна:
Абстракция пахнет
Отсутствует абстракция: Этот запах возникает, когда вместо создания класса или интерфейса используются скопления данных или закодированные строки.
Обязательная абстракция: Этот запах возникает, когда операция превращается в класс.
Неполная абстракция: Этот запах возникает, когда абстракция не полностью поддерживает дополнительные или взаимосвязанные методы.
Многогранная абстракция: Этот запах возникает, когда абстракции назначено более одной ответственности.
Ненужная абстракция: Этот запах возникает, когда абстракция, которая фактически не нужна (и, следовательно, ее можно было избежать), вводится в проект программного обеспечения.
Неиспользованная абстракция: Этот запах возникает, когда абстракция не используется (либо не используется напрямую, либо недоступна).
Duplicate Abstraction: Этот запах возникает, когда две или более абстракции имеют одинаковые имена или идентичную реализацию, или обе.
Запах инкапсуляции
Дефицит инкапсуляции: Этот запах возникает, когда объявленная доступность одного или нескольких членов абстракции является более допустимой, чем фактически требуется.
Leaky Encapsulation: Этот запах возникает, когда абстракция «раскрывает» или «пропускает» детали реализации через открытый интерфейс.
Отсутствует инкапсуляция: Этот запах возникает, когда варианты реализации не инкапсулированы в абстракции или иерархии.
Неиспользованная инкапсуляция: Этот запах возникает, когда клиентский код использует явные проверки типов (используя цепочечные операторы if-else или switch, которые проверяют тип объекта) вместо использования изменений в типах, уже инкапсулированных в иерархия.
Модуляризация запахов
Сломанная модульность: Этот запах возникает, когда данные и / или методы, которые в идеале должны быть локализованы в одной абстракции, разделяются и распределяются по нескольким абстракциям.
Недостаточная модуляризация: Этот запах возникает, когда существует абстракция, которая не была полностью разложена, и дальнейшая декомпозиция может уменьшить ее размер, сложность реализации или и то, и другое.
Циклически-зависимая модуляризация: Этот запах возникает, когда две или более абстракции зависят друг от друга прямо или косвенно (создавая тесную связь между абстракциями).
Hub-Like Modularization: Этот запах возникает, когда абстракция имеет зависимости (как входящие, так и исходящие) с большим количеством других абстракций.
Иерархия запахов
Отсутствует иерархия: Этот запах возникает, когда сегмент кода использует условную логику (обычно в сочетании с «теговыми типами») для явного управления вариациями поведения, когда иерархия могла бы быть создана и использована для инкапсуляции этих вариации.
Ненужная иерархия: Этот запах возникает, когда вся иерархия наследования не нужна, указывая на то, что наследование было применено без необходимости для конкретного контекста проекта.
Нефакторная иерархия: Этот запах возникает, когда между иерархиями типов в иерархии возникает ненужное дублирование.
Wide Hierarchy: Этот запах возникает, когда иерархия наследования слишком широка, что указывает на отсутствие промежуточных типов.
Спекулятивная иерархия: Этот запах возникает, когда один или несколько типов в иерархии предоставляются спекулятивно (т.е. основаны на воображаемых потребностях, а не на реальных требованиях).
Глубокая иерархия: Этот запах возникает, когда иерархия наследования "чрезмерно" глубока.
Мятежная иерархия: Этот запах возникает, когда подтип отвергает методы, предоставленные его супертипом (ами).
Сломанная иерархия: Этот запах возникает, когда супертип и его подтип концептуально не разделяют отношения "IS-A", что приводит к нарушению замещаемости.
Многолучевая иерархия: Этот запах возникает, когда подтип наследует как прямо, так и косвенно от супертипа, что приводит к ненужным путям наследования в иерархии.
Циклическая иерархия: Этот запах возникает, когда супертип в иерархии зависит от любого из его подтипов.
Приведенное выше определение и классификация описаны в «Рефакторинг для запахов проектирования программного обеспечения: управление техническим долгом ». Некоторые более подходящие ресурсы можно найти здесь 1127 *.