Вопрос 16 · Раздел 2

Какие антипаттерны вы знаете?

4. Refactoring — регулярно чистите код 5. Knowledge Sharing — учите команду

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

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

Частые антипаттерны:

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

// ❌ Один класс делает ВСЁ
public class Application {
    public void connectToDatabase() { }
    public void validateUser() { }
    public void sendEmail() { }
    public void generateReport() { }
    public void backupData() { }
    // ... ещё 1000 методов
}

2. Spaghetti Code:

// ❌ Код без структуры, трудно читать
public void process() {
    if (a) { for (...) { if (b) { ... } } }
    else { while (...) { switch (...) { ... } } }
}

3. Copy-Paste Programming:

// ❌ Один и тот же код в 10 местах
// Изменил в одном — забыл в остальных

Как избежать:

  • Разделяйте код на маленькие классы
  • Следуйте SOLID принципам
  • Не копируйте код — используйте общие методы

🟡 Middle Level

Основные антипаттерны

1. Golden Hammer (Золотой молоток):

// Использование любимого паттерна везде, где можно
// "У меня есть Spring — сделаю всё через бины!"
// Иногда достаточно простого if-else

2. Inner-Platform Effect:

// reinventing wheel внутри приложения
// Своя БД поверх файловой системы
// Свой ORM поверх JDBC

3. Lava Flow:

// Код, который никто не понимает, но боится удалить
// "Не трогай, оно работает"
// → Технический долг растёт

4. Magic Push Button:

// Использование кода, не понимая как работает
// Copy-paste из StackOverflow
// → Баги, которые невозможно отдебажить

5. Poltergeist (Полтергейст):

// Классы без состояния, только для вызова других классов
public class Manager {
    public void doWork() {
        service.process(new Processor().execute());
    }
}
// → Лишний уровень косвенности

Как распознать

Признак Антипаттерн
Класс > 500 строк God Object
Метод > 50 строк Long Method
10+ параметров Parameter List
Дублирование кода Copy-Paste
“Не трогай, работает” Lava Flow

🔴 Senior Level

Архитектурные антипаттерны

1. Big Ball of Mud:

Нет архитектуры, всё связано со всем
→ Изменение в одном месте ломает другое
→ Невозможно тестировать
→ Решение: рефакторинг, модуляризация

2. Architecture by Implosion:

Проектирование от деталей к общему
→ Начали кодить без дизайна
→ Потеряли общую картину

3. Cargo Cult Programming:

// Копирование кода/конфигурации без понимания зачем.
// Например, добавление @Transactional на каждый метод «на всякий случай».
// Или добавление @Service на каждый класс «потому что так принято».

4. Not Invented Here:

"Наше лучше" → переписываем всё с нуля
→ Тратим годы на то, что уже сделано

Организационные антипаттерны

1. Design by Committee:

Слишком много людей принимают решения
→ Компромиссный, неоптимальный дизайн
→ "Верблюд — это лошадь, спроектированная комитетом"

2. Management by Numbers:

Оценка только по метрикам
→ Игнорирование качества кода
→ Технический долг растёт

Антипаттерны в коде

1. Couplet:

// Жёсткая связь двух классов
class A { private B b = new B(); }
class B { private A a = new A(); }
// → Circular dependency

2. God Object (он же Blob):

Один класс делает всё, остальные — только передают данные
→ Нарушение SRP
→ Решение: распределение ответственности

3. Sequential Coupling:

// Методы должны вызываться в строгом порядке
obj.init();
obj.configure();
obj.process();  // Если вызвать без init → exception!
// → Решение: Builder или конструктор

Prevention Strategies

  1. Code Review — ловите антипаттерны до merge
  2. Static Analysis — SonarQube, Checkstyle
  3. Metrics — отслеживайте complexity, duplication
  4. Refactoring — регулярно чистите код
  5. Knowledge Sharing — учите команду

Production Experience

Реальный сценарий: God Object убил проект

  • Класс UserService: 5000 строк, 200 методов
  • 15 разработчиков concurrently → merge conflicts каждый день
  • Решение: разделили на 12 классов по SRP
  • Результат: конфликты исчезли, читаемость значительно повысилась

Best Practices

  1. SOLID — лучшая защита от антипаттернов
  2. KISS — не усложняйте
  3. YAGNI — не делайте “на будущее”
  4. DRY — не копируйте код
  5. Code Review — коллективная ответственность
  6. Refactoring — регулярная чистка
  7. Metrics — измеряйте качество

Резюме для Senior

  • Антипаттерны = повторяющиеся плохие решения
  • God Object — самый частый в enterprise
  • Lava Flow — признак отсутствия Code Review
  • Golden Hammer — злоупотребление паттернами
  • Big Ball of Mud — отсутствие архитектуры
  • SOLID — лучшая профилактика
  • Metrics — раннее обнаружение проблем
  • Refactoring — регулярная гигиена кода

🎯 Шпаргалка для интервью

Обязательно знать:

  • God Object — один класс делает всё (>500 строк, >200 методов), нарушает SRP, решение: разделение по ответственности
  • Golden Hammer — использование любимого паттерна везде, overengineering убивает читаемость
  • Lava Flow — код, который никто не понимает, но боится удалить → технический долг растёт
  • Big Ball of Mud — нет архитектуры, всё связано со всем, невозможно тестировать
  • Cargo Cult — копирование кода/конфигурации без понимания (@Transactional на каждый метод “на всякий случай”)
  • Poltergeist — классы без состояния, только для вызова других классов → лишний уровень косвенности
  • SOLID + KISS + YAGNI + DRY — лучшая профилактика антипаттернов

Частые уточняющие вопросы:

  • Как распознать God Object? — Класс >500 строк, >200 методов, 15+ разработчиков concurrently → merge conflicts
  • Что такое Lava Flow и почему опасен? — “Не трогай, оно работает” → никто не понимает код → технический долг растёт
  • Чем Cargo Cult отличается от Golden Hammer? — Cargo Cult = копирование без понимания, Golden Hammer = злоупотребление паттерном
  • Как бороться с Big Ball of Mud? — Модуляризация, Code Review, Static Analysis (SonarQube), регулярный рефакторинг

Красные флаги (НЕ говорить):

  • “У нас один класс на весь сервис” — это God Object, разделение по SRP обязательно
  • “Я добавляю @Transactional везде для безопасности” — Cargo Cult, ненужный overhead
  • “Этот код старый, но работает — не трогайте” — Lava Flow, источник багов
  • “Мне не нужны метрики качества кода” — без метрик антипаттерны растут незаметно

Связанные темы:

  • [[1. Что такое паттерны проектирования]] — паттерны vs антипаттерны
  • [[3. Что такое Singleton]] — Singleton как источник антипаттернов
  • [[6. Каковы проблемы с Singleton]] — проблемы Singleton
  • [[2. Какие категории паттернов существуют]] — правильные паттерны вместо антипаттернов
  • [[12. В чём преимущество Decorator перед наследованием]] — композиция как альтернатива God Object