Что такое анти-паттерн? - PullRequest
155 голосов
/ 11 июня 2009

Я изучаю паттерны и анти-паттерны. У меня есть четкое представление о шаблонах, но я не получаю анти-шаблонов. Определения из Интернета и Википедии меня сильно смущают.

Кто-нибудь может объяснить мне простыми словами, что такое анти-паттерн? Какова цель? Что они делают? Это плохо или хорошо?

Ответы [ 12 ]

199 голосов
/ 11 июня 2009

Анти-паттерны - это определенные паттерны в разработке программного обеспечения, которые считаются плохими методами программирования.

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

Например, в объектно-ориентированном программировании идея состоит в том, чтобы разделить программное обеспечение на маленькие части, называемые объектами. Анти-паттерн в объектно-ориентированном программировании - это объект Бога , который выполняет множество функций, которые лучше разделить на разные объекты.

Например:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

В приведенном выше примере есть объект, который делает все . В объектно-ориентированном программировании было бы предпочтительнее иметь четко определенные обязанности для различных объектов, чтобы сохранить код менее связанным и, в конечном счете, более удобным для обслуживания:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

Суть в том, что есть хорошие способы разработки программного обеспечения с часто используемыми шаблонами ( шаблоны проектирования ), но есть также способы разработки и реализации программного обеспечения, которые могут привести к проблемам. Шаблоны, которые считаются плохими методами разработки программного обеспечения, являются анти-шаблонами.

46 голосов
/ 19 декабря 2014

Всякий раз, когда я слышу об Анти-паттернах, я вспоминаю другой термин, а именно. Дизайнерский запах.

«Запахи проектирования - это определенные структуры в проекте, которые указывают на нарушение фундаментальных принципов проектирования и негативно влияют на качество проектирования». (Из «Рефакторинг для запаха проектирования программного обеспечения: управление техническим долгом»)

Есть много дизайнерских запахов, классифицированных на основе нарушающих принципы дизайна:

Абстракция пахнет

Отсутствует абстракция: Этот запах возникает, когда вместо создания класса или интерфейса используются скопления данных или закодированные строки.

Обязательная абстракция: Этот запах возникает, когда операция превращается в класс.

Неполная абстракция: Этот запах возникает, когда абстракция не полностью поддерживает дополнительные или взаимосвязанные методы.

Многогранная абстракция: Этот запах возникает, когда абстракции назначено более одной ответственности.

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

Неиспользованная абстракция: Этот запах возникает, когда абстракция не используется (либо не используется напрямую, либо недоступна).

Duplicate Abstraction: Этот запах возникает, когда две или более абстракции имеют одинаковые имена или идентичную реализацию, или обе.

Запах инкапсуляции

Дефицит инкапсуляции: Этот запах возникает, когда объявленная доступность одного или нескольких членов абстракции является более допустимой, чем фактически требуется.

Leaky Encapsulation: Этот запах возникает, когда абстракция «раскрывает» или «пропускает» детали реализации через открытый интерфейс.

Отсутствует инкапсуляция: Этот запах возникает, когда варианты реализации не инкапсулированы в абстракции или иерархии.

Неиспользованная инкапсуляция: Этот запах возникает, когда клиентский код использует явные проверки типов (используя цепочечные операторы if-else или switch, которые проверяют тип объекта) вместо использования изменений в типах, уже инкапсулированных в иерархия.

Модуляризация запахов

Сломанная модульность: Этот запах возникает, когда данные и / или методы, которые в идеале должны быть локализованы в одной абстракции, разделяются и распределяются по нескольким абстракциям.

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

Циклически-зависимая модуляризация: Этот запах возникает, когда две или более абстракции зависят друг от друга прямо или косвенно (создавая тесную связь между абстракциями).

Hub-Like Modularization: Этот запах возникает, когда абстракция имеет зависимости (как входящие, так и исходящие) с большим количеством других абстракций.

Иерархия запахов

Отсутствует иерархия: Этот запах возникает, когда сегмент кода использует условную логику (обычно в сочетании с «теговыми типами») для явного управления вариациями поведения, когда иерархия могла бы быть создана и использована для инкапсуляции этих вариации.

Ненужная иерархия: Этот запах возникает, когда вся иерархия наследования не нужна, указывая на то, что наследование было применено без необходимости для конкретного контекста проекта.

Нефакторная иерархия: Этот запах возникает, когда между иерархиями типов в иерархии возникает ненужное дублирование.

Wide Hierarchy: Этот запах возникает, когда иерархия наследования слишком широка, что указывает на отсутствие промежуточных типов.

Спекулятивная иерархия: Этот запах возникает, когда один или несколько типов в иерархии предоставляются спекулятивно (т.е. основаны на воображаемых потребностях, а не на реальных требованиях).

Глубокая иерархия: Этот запах возникает, когда иерархия наследования "чрезмерно" глубока.

Мятежная иерархия: Этот запах возникает, когда подтип отвергает методы, предоставленные его супертипом (ами).

Сломанная иерархия: Этот запах возникает, когда супертип и его подтип концептуально не разделяют отношения "IS-A", что приводит к нарушению замещаемости.

Многолучевая иерархия: Этот запах возникает, когда подтип наследует как прямо, так и косвенно от супертипа, что приводит к ненужным путям наследования в иерархии.

Циклическая иерархия: Этот запах возникает, когда супертип в иерархии зависит от любого из его подтипов.


Приведенное выше определение и классификация описаны в «Рефакторинг для запахов проектирования программного обеспечения: управление техническим долгом ». Некоторые более подходящие ресурсы можно найти здесь 1127 *.

33 голосов
/ 11 июня 2009

Шаблон - это представление о том, как решить задачу некоторого класса. Анти-паттерн - это идея о том, как его не решить, потому что реализация этой идеи приведет к плохому дизайну.

Пример: «шаблон» будет использовать функцию для повторного использования кода, «анти-шаблон» будет использовать copy-paste для того же самого. Оба решают одну и ту же проблему, но использование функции обычно приводит к более читабельному и поддерживаемому коду, чем копирование-вставка.

16 голосов
/ 11 июня 2009

Анти-паттерн - это способ не решить проблему. Но это еще не все: это также часто можно увидеть в попытках решить проблему.

10 голосов
/ 11 июня 2009

Если вы действительно хотите изучать AntiPatterns, возьмите книгу AntiPatterns (ISBN-13: 978-0471197133).

В нем они определяют: «AntiPattern - это литературная форма, которая описывает часто встречающееся решение проблемы, которое приводит к явно негативным последствиям».

Таким образом, если это плохая практика программирования, но не распространенная - ограниченная одним приложением, одной компанией или одним программистом, она не соответствует части «Шаблон» определения AntiPattern.

9 голосов
/ 11 июня 2009

Распространенный способ устроить беспорядок. Например, класс бога / кухонной раковины (делает все).

6 голосов
/ 29 августа 2015

Антишаблон является дополнением шаблона проектирования Анти-шаблон - это шаблонное решение, которое не следует использовать в определенной ситуации.

6 голосов
/ 11 июня 2009

Как и в случае шаблона проектирования , анти-шаблон также является шаблоном и повторяемым способом решения определенной проблемы, но неоптимальным и неэффективным способом.

5 голосов
/ 11 июня 2009

Интересно, что данный способ решения проблемы может быть как паттерном, так и антишаблоном. Синглтон является ярким примером этого. Он появится в обоих наборах литературы.

3 голосов
/ 02 мая 2016

Сегодня исследователи и практики разработки программного обеспечения часто используют термины «анти-паттерн» и «запах» взаимозаменяемо. Однако они концептуально не совпадают. Запись анти-паттерна в Википедии гласит, что анти-паттерн отличается от плохой практики или плохой идеи как минимум двумя факторами. Анти-шаблон

"Обычно используемый процесс, структура или схема действий, которые, несмотря на изначально представляется подходящим и эффективным ответом на проблема, как правило, имеет более плохие последствия, чем полезные результаты. "

Это ясно указывает на то, что анти-шаблон выбран в убеждении, что он является хорошим решением (как шаблон) для представленной проблемы; однако это приносит больше обязательств, чем выгод. С другой стороны, запах - это просто плохая практика, которая негативно влияет на качество программной системы. Например, Singleton - это анти-шаблон, а класс Бога (или Недостаточная модуляризация) - это запах дизайна.

...