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