Перейти к основному содержимому

Антипаттерны проектирования ПО

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

Существует около 20–30 известных антипаттернов. Рассмотрим некоторые из них.

Большой комок грязи (Big Ball of Mud)

Неорганизованная, беспорядочная архитектура без четкой структуры.

  • Причины: отсутствие долгосрочного планирования, рост системы без рефакторинга и учета архитектурных принципов.
  • Пример: проект, где новые функции добавляются без разделения компонентов, создавая хаос и трудности в поддержке.

Код-спагетти (Spaghetti Code)

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

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

Замечание: Spaghetti Code описывает проблемы на уровне отдельных модулей, а Big Ball of Mud — на уровне архитектуры.

Золотой молоток (Golden Hammer)

Использование одного инструмента или технологии для решения всех задач.

  • Причины: ограниченное знание технологий, привычка к одному инструменту.
  • Пример: применение SQL для всех видов хранения данных, даже когда NoSQL подходит лучше.

Изобретение велосипеда (Reinventing the Wheel)

Создание собственного решения для задачи, уже решенной готовыми библиотеками или фреймворками.

  • Причины: недостаток знаний о существующих решениях.
  • Пример: создание собственной системы логирования вместо использования Log4j.

Дымоход (Stovepipe System)

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

  • Причины: отсутствие координации между командами, историческое наследие.
  • Пример: отделы разрабатывают свои ИТ-системы без учета интеграции с другими.

Божественный объект (God Object)

Один объект, который знает слишком много или делает слишком много.

  • Причины: недостаточное разделение ответственности, централизованное управление.
  • Пример: класс в ООП, который содержит логику для всего приложения.

Лавина изменений (Lava Flow)

Неиспользуемый или мертвый код остается в проекте.

  • Причины: боязнь сломать систему, отсутствие документации.
  • Пример: код, написанный в начале проекта, но не удаленный после изменения требований.

Незакрытые соединения (Resource Leak)

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

  • Причины: ошибки в управлении ресурсами, отсутствие тестирования.
  • Пример: открытые сетевые соединения, которые не закрываются.

Избыточная абстракция (Abstract Obsession)

Усложнение архитектуры за счет добавления ненужных абстракций.

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

Форма, нарушающая контракт (Leaky Abstraction)

Абстракция, которая не скрывает детали реализации.

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

Необоснованные зависимости (Unnecessary Dependencies)

Модули зависят друг от друга без веской причины.

  • Причины: плохое планирование, отсутствие модульности.
  • Пример: логика бизнес-слоя зависит от UI-компонентов.

Перекрестные зависимости (Cyclic Dependencies)

Модули зависят друг от друга, создавая циклы.

  • Причины: недостаточное планирование, отсутствие четкой архитектуры.
  • Пример: модуль А зависит от модуля B, который зависит от модуля А.

Копипаст (Copy-and-Paste Programming)

Код копируется и вставляется без модификации или рефакторинга.

  • Причины: спешка, отсутствие времени на рефакторинг.
  • Пример: дублирование обработки ошибок в нескольких методах.

Черный ящик (Magic Numbers)

Использование в коде числовых значений без пояснения их смысла.

  • Причины: недостаток времени на документирование, слабое проектирование.
  • Пример: использование числа "7" для количества попыток без пояснений.

Материалы

  1. Магическое число (Magic Number)
  2. Большой комок грязи
  3. Антипаттерн — Золотой молоток (Golden Hammer)
  4. Золотой молоток
  5. Спагетти-статья о спагетти-коде
  6. Автоматы против спагетти-кода
  7. God object. Анализ сложных проектов
  8. Антипаттерн — Божественный объект (God Object)
  9. [Антипаттерн — Метод копипаста (Copy and paste programming)](https://dev.koshovyi.com/2018/05/18/antipattern-4-metod-kopipasta-copy-and-paste-programming/#:~:text=Copy%20and%20paste%20programming%20(%D0%B8%D0%BB%D0%B8,%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20copy%20%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20paste.)
  10. Антипаттерны проектирования: Dead End
  11. Замена магического числа символьной константой
  12. Что такое «антипаттерн», какие антипаттерны знаешь
  13. Антипаттерны построения микросервисных приложений в высоконагруженных проектах
  14. Что такое антипаттерны? Разбираем примеры
  15. Худшие практики разработки и архитектуры
  16. Что такое антипаттерны? Разбираем примеры (часть 1)
  17. Антипаттерны микросервисов
  18. Антипаттерн и паттерны проектирования
  19. Топ-10 антипаттернов при использовании микросервисов
  20. Что такое анти-паттерны?
  21. Антипаттерны проектирования
  22. 9 анти-паттернов, о которых должен знать каждый программист
  23. Паттерны и антипаттерны обоснования задач
  24. Архитектурные антипаттерны в микросервисах и способы их избежания

Видео

  1. Худшие практики разработки и архитектуры за 12 минут
  2. Антипаттерны
  3. Антипаттерны (обзор нескольких)
  4. Анти-паттерны проектирования RESTful API
  5. Kubernetes антипаттерны. Вредные советы для построения твоего мира микросервисов
  6. Вебинар "Антипаттерны проектирования"
  7. Analystdays: Распространенные антипаттерны проектирования RESTful API

Книги