Антипаттерн (англ.anti-pattern) — это распространённый подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным[1]. В отличие от шаблона проектирования, рассмотрение антипаттерна включает в себя как неправильное решение проблемы с его признаками и последствиями, так и выход из ситуации[2].
Термин происходит из информатики, из книги «Банды четырёх» «Шаблоны проектирования», которая заложила примеры практики хорошего программирования. Авторы назвали эти хорошие методы «паттернами», и противоположными им являются «антипаттерны». Частью хорошей практикой программирования является избегание антипаттернов. До появления термина все проблемы назывались ловушки (pitfalls). Таким образом, антипаттерны — это самые распространённые ловушки, но не все ловушки будут антипаттернами.
Антипаттерны концептуально похожи на паттерны в том, что они документируют повторяющиеся решения общих проблем. Они известны как антипаттерны, потому что их использование (или злоупотребления) даёт негативные последствия[3].
Концепция также прекрасно подходит к машиностроению. Несмотря на то, что термин нечасто используется вне программной инженерии, концепция является универсальной.
Антипаттерн и паттерн ошибки
Паттерн ошибки — повторяющаяся взаимосвязь между ошибками, о которых сигнализирует программа, и ошибкой в программе, являющейся причиной сообщений об ошибках[4].
Антипаттерны являются паттернами проектирования, паттерны ошибок представляют собой паттерны некорректного поведения программ, коррелирующего с ошибками программирования[4].
История
С развитием ИТ-индустрии масштабы программных проектов и затраты ресурсов на них стремительно росли, что порождало большое количество проблем, что вставали перед программистами. Большинство этих проблем были типичными и встречались практически в каждом крупном проекте. В начале 90-х годов приобрели значительную популярность каталоги шаблонов проектирования (англ. design patterns) — элегантных и проверенных на практике способов решения типичных проблем. Паттерны и на сегодняшний день являются мощными и чрезвычайно популярны, однако многие разработчики, используя популярные паттерны в ситуациях, к которым они не приспособлены, делали программы крайне неэффективными, порождали гораздо больше проблем, чем было в проекте перед использованием паттерна. Кроме того, у ИТ-инженеров, как и у работников любой сферы деятельности, можно выделить типичные ошибки, обусловленные недостаточной базой знаний или отсутствием опыта у программиста, сжатыми сроками сдачи проекта, финансовыми ограничениями и прочим.
Впервые термин «Антипаттерн» в смысле формальной модели типичного неудачного решения используется в 1996 году Майклом Эйкройдом (англ. Michael Akroyd) на конференции «Object World West Conference», посвященной аспектам объектно-ориентированного программирования.[5] В своей презентации «Антипаттерны: предотвращение неправильного использования объектов» Эйкройд обращал внимание на вредные, но частые программные конструкции, в частности, те, что противоречат принципам ООП. К тому же, для каждой такой конструкции он предлагал эффективную замену.
Термин (в смысле: «плохая идея») встречался и до Эйкройда, но не публиковался и особой популярностью не пользовался. И все же приписывать авторство одному человеку не стоит. Как считает Уильям Браун, автор книги «Антипаттерны: рефакторинг приложений, архитектур и проектов», антипаттерн — это этап эволюции понятия паттерна проектирования, расширения их модели.
Вызов предка[en] (Call super): Для реализации прикладной функциональности методу класса-потомка требуется в обязательном порядке вызывать те же методы класса-предка.
Ошибка пустого подкласса (Empty subclass failure): Создание класса (в Perl), который не проходит «проверку пустоты подкласса» («Empty Subclass Test») из-за различного поведения по сравнению с классом, который наследуется от него без изменений.
Божественный объект (God object): Концентрация слишком большого количества функций в одной части системы (классе).
Объектная клоака (Object cesspool): Переиспользование объектов, находящихся в непригодном для переиспользования состоянии.
Полтергейст[en] (Poltergeist[14]): Объекты, чьё единственное предназначение — передавать информацию другим объектам.
Проблема йо-йо[en] (Yo-yo problem): Чрезмерная размытость сильно связанного кода (например, выполняемого по порядку) по иерархии классов.
Приватизация (Privatisation): Сокрытие функциональности в приватной секции (private), что затрудняет его расширение в классах-потомках.
Френд-зона (Friend zone): Неуместное использование дружественных классов и дружественных функций в языке C++.
Каша из интерфейсов (Interface soup[15]): Объединение нескольких интерфейсов, разделенных согласно принципу изоляции интерфейсов (Interface segregation), в один.
Висящие концы: Интерфейс, большинство методов которого бессмысленны и реализуются «пустышками».
Заглушка (Stub): Попытка «натянуть» на объект уже имеющийся малоподходящий по смыслу интерфейс, вместо создания нового.
Активное ожидание[en] (Busy spin, busy waiting): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать асинхронное программирование (к примеру, систему сообщений или событий).
Кэширование ошибки[en] (Caching failure): Забывать сбросить флаг ошибки после её обработки.
Воняющий подгузник (The Diaper Pattern Stinks): Сброс флага ошибки без её обработки или передачи вышестоящему обработчику.
Проверка типа вместо интерфейса (Checking type instead of membership, Checking type instead of interface): Проверка того, что объект имеет специфический тип в то время, когда требуется только определённый интерфейс.
Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы.
Кодирование путём исключения[en] (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая.
Таинственный код (Cryptic code): Использование аббревиатур вместо мнемоничных имён.
Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации.
Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование.
Поток лавы[en] (Lava flow)[14]: Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия.
Волшебные числа (Magic numbers): Использование числовых констант без объяснения их смысла.
Спагетти-код (Spaghetti code, иногда «макароны»)[14]: Код с чрезмерно запутанным порядком выполнения.
Лазанья-код[en] (Lasagnia code, или «лук» (onion)): Использование неоправданно большого количества уровней абстракции.
Равиоли-код (Ravioli code, или «пельмени»): Объекты настолько «склеены» между собой, что практически не допускают рефакторинга.
Мыльный пузырь (Soap bubble): Объект, инициализированый мусором, максимально долго притворяется, что содержит какие-то данные.
Мьютексный ад (Mutex hell): Внедрение слишком большого количества объектов синхронизации между потоками.
(Мета-)шаблонный рак (Template cancer): Повсеместное использование шаблонов (в основном C++), в том числе там, где их использование не оправдано. Это уменьшает понимание и сопровождение кода и замедляет компиляцию.
Методологические антипаттерны
Паттерн проектирования: само по себе использование паттернов считается анти-паттерном — знаком того, что система не воплощает достаточный уровень абстракции[16].
Дефакторинг (De-Factoring): Процесс уничтожения функциональности и замены её документацией.
Золотой молоток (Golden hammer[14]): Сильная уверенность в том, что любимое решение универсально применимо. Название происходит от поговорки «когда в руках молоток, все проблемы кажутся гвоздями».
Фактор невероятности[en] (Improbability factor): Предположение о невозможности того, что сработает известная ошибка.
Программирование методом подбора (Programming by permutation): Подход к разработке программного обеспечения небольшими изменениями.
Изобретение колеса/велосипеда (Reinventing the wheel[14]): Создание с нуля, вместо использования готового решения.
Изобретение квадратного колеса (Reinventing the square wheel): Создание плохого решения, когда существует хорошее известное решение.
Самоуничтожение (Self-destruction): Фатальная ошибка либо нестандартное поведение программы, приводящая к отказу в обслуживании, возникшая вследствие другой менее серьёзной ошибки. Например, при возникновении ошибки, приложение начинает очень быстро и много писать в лог, вследствие чего заканчивается место на жёстком диске быстрее, чем это обнаружит мониторинг.
Два тоннеля: Вынесение новой функциональности в отдельное приложение вместо расширения уже имеющегося. Чаще всего применяется, когда по каким-либо причинам (в основном, при нехватке времени либо нежелании менеджмента) внесение изменений в уже имеющийся код требует больших затрат, чем создание нового. При этом у клиента в конечном итоге работают два приложения, запускаясь одновременно либо попеременно друг из друга.
Коммит-убийца (Commit assasin): Внесение отдельных изменений в систему контроля версий без проверки влияния их на другие части программы. Как правило, после подобных коммитов работа коллектива парализуется на время исправления проблем в местах, которые ранее работали безошибочно.
Антипаттерны управления конфигурацией
Ад зависимостей (Dependency hell, на платформе Microsoft Windows также называется «DLL hell», «DLL-ад»): Разрастание графа взаимных зависимостей программных продуктов и библиотек, приводящее к сложности установки новых и удаления старых продуктов. В сложных случаях различные установленные программные продукты требуют наличия разных версий одной и той же библиотеки. В наиболее сложных случаях один продукт может косвенно потребовать сразу две версии одной и той же библиотеки.
Разные
Дым и зеркала (Smoke and mirrors[14]): Демонстрация того, как будут выглядеть ненаписанные функции (название происходит от двух излюбленных способов, которыми фокусники скрывают свои секреты).
Раздувание ПО (Software bloat): Разрешение последующим версиям системы требовать всё больше и больше ресурсов.
Функции для галочки: Превращение программы в конгломерат плохо реализованных и не связанных между собой функций (как правило, для того, чтобы заявить в рекламе, что функция есть).
Архитектурные антипаттерны
Типичные проблемы, связанные со структурой системы[7]:
Инверсия абстракции (Abstraction inversion): Сокрытие части функциональности от внешнего использования, в надежде на то, что никто не будет его использовать
Затычка на ввод данных (Input kludge[14]): Забывчивость в спецификации и выполнении поддержки возможного неверного ввода.
Раздувание интерфейса (Interface bloat): Разработка интерфейса очень мощным и очень сложным для реализации.
Волшебная кнопка (Magic pushbutton): Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, в системах типа Delphi это написание прикладной логики в обработчиках нажатий на кнопку.
Дымоход (Stovepipe System[14]): Редко поддерживаемая сборка плохо связанных компонентов.
Состояние гонки (Race hazard, Race condition): непредвидение возможности наступления событий в порядке, отличном от ожидаемого.
Мышиная возня[источник не указан 2120 дней]: Неоправданное создание множества мелких и абстрактных классов для решения одной конкретной задачи более высокого уровня.
Членовредительство (Mutilation): Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами.
Сохранение или смерть (Save or die): Сохранение изменений в конфигурации на жесткий диск лишь при завершении приложения; приводит к тому, что в случае отказа в программе эти данные будут утеряны
Организационные антипаттерны
Проблемы, с которыми встречаются менеджеры (или группы менеджеров)[7]:
Аналитический паралич (Analysis paralysis)[14]: неоправданно большие затраты на анализ и проектирование. Часто приводит к закрытию проекта до начала его реализации;
Дойная корова[en] (Cash cow): когда при наличии продукта, приносящего выгоду без существенных вложений, не вкладываются средства в развитие и разработку новых продуктов;
Продолжительное устаревание[en] (Continuous obsolescence)[14]: выделение непропорционально больших усилий на портирование системы в новые окружения;
Сваливание расходов (Cost migration): перенос расходов на проект к уязвимому отделу или бизнес-партнёру;
Раздутый улучшизм (Creeping featurism): добавление новых улучшений в ущерб суммарному качеству системы;
Раздутый элегантизм[en] (Creeping elegance): непропорциональное улучшение красивости кода в ущерб функциональности и суммарному качеству системы;
Разработка комитетом (Design by committee)[14]: разработка проекта без централизованного управления, либо при некомпетентном руководстве;
Неуёмная преданность[en] (Escalation of commitment): продолжение реализации решения после того, как доказана его ошибочность;
Управление основанное на числах (Management by numbers): излишнее внимание к численным показателям, имеющим очень косвенное отношение к управляемой системе, сложным для получения, либо подверженным эффекту Гудхарта;
Драконовские меры (Management by perkele): неоправданно жесткий стиль управления;
Управление грибами[en] (Mushroom management)[14]: недостаточное информирование работников о выполняемой работе;
Тёплое тело (Warm Bodies)[14]: человек, чей вклад в проект под сомнением;
Единственный знающий человек (Single head of knowledge, SHOK): когда жизненно важными для проекта сведениями или навыками обладает только один человек в команде; с его уходом работа останавливается;
Рыцарь на белом коне (Knight in shining armor, KISA): когда на сцене появляется человек, который пытается починить всё, не сообщая никому, что он сделал и почему.
Нейл и Лапланте приводят следующие антипаттерны[6]:
(Absentee Manager)
(All You Have Is A Hammer)
(Cage Match Negotiator)
(Doppelganger)
(Fruitless Hoops)
(Golden Child)
(Headless Chicken)
(Leader Not Manager)
(Managerial Cloning)
(Manager Not Leader)
(Metric Abuse)
(Mr. Nice Guy)
(Mushroom Management)
(Plate Spinning)
(Proletariat Hero)
(Rising Upstart)
(Road to Nowhere)
(Spineless Executive)
(Three-Headed Knight)
(Ultimate Weapon)
(Warm Bodies)
Антипаттерны обстановки
Проблемы, вызванные доминирующей в организации структурой и социальной моделью, являющейся результатом действующей в организации общественной политики[17][7][6][18]:
↑ Miroslav Kis. Information security antipatterns in software requirements engineering. In Proceedings of the 9th Conference on Pattern Language of Programs (Plop), 2002.
↑ John Long. Software reuse antipatterns. In ACM SIGSOFT Software Engineering Notes, volume26, page 4, July 2001.
↑ Paula Kotze, Karen Renaud, and Judy van Biljona. Don’t do this — pitfalls in using anti-patterns in teaching human-computer interaction principles. Computers and Education, 50(3):979-1008, April 2008
↑ J. Krai and M. Zemlicka. The most important service-oriented antipatterns. In proceedings of the International Conference on Software Engineering Advances (ICSEA), 2007.
↑ P.A. Laplante, R.R. Hoffman, and G. Klein. Antipatterns in the creation of intelligent systems. IEEE Intelligent Systems, 22:91-95, 2007.
↑ Gary McLean Hall.Adaptive Code via C#: Agile coding with design patterns and SOLID principles.— Microsoft Press, 2014.— С.267-268.— ISBN 978-0735683204.
↑ Revenge of the Nerds(неопр.).— «In the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.».
William J. Brown, Raphael C. Malveau, Hays W. McCormick III, and Thomas J. Mowbray.AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis.— John Wiley & Sons, 1998.— ISBN 0471197130.
William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas.AntiPatterns and Patterns in Software Configuration Management.— Wiley, 1999.— ISBN 978-0-471-32929-9.
William J. Brown, Hays W. "Skip" McCormick, Scott W. Thomas.AntiPatterns in Project Management.— Wiley, 2000.— ISBN 978-0-471-36366-8.
Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.
2019-2024 WikiSort.ru - проект по пересортировке и дополнению контента Википедии