Вопрос

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

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

Это было полезно?

Решение

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

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

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

Например:

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() {}
}

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

Другие советы

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

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

Существует множество дизайнерских запахов, классифицированных на основе нарушения принципов дизайна:

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

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

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

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

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

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

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

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

Инкапсуляция пахнет

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

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

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

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

Модуляризация пахнет

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

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

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

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

Иерархия пахнет

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Антишаблоны — это распространенные способы, которыми люди склонны программировать неправильно или, по крайней мере, не очень хорошо.

Любой шаблон проектирования, который приносит больше вреда, чем пользы данной среде разработки программного обеспечения, будет рассматриваться как антишаблон.

Некоторые антипаттерны очевидны, некоторые нет.Например, Singleton, хотя многие считают его старым добрым шаблоном проектирования, но есть и те, кто этого не делает.

Вы можете проверить вопрос Что такого плохого в синглтонах? чтобы лучше понять различные мнения по этому поводу.

Как и в «Алгоритме», вы можете добиться решения, используя грубую силу, но вам придется заплатить много, если ситуация станет сложной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top