Что такое антипаттерны в программировании и какие существуют их примеры

«Что такое антипаттерны в программировании и какие существуют их примеры» — вопрос из категории Паттерны, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные примеры:

  1. Магические числа (Magic Numbers) Использование в коде неименованных констант, смысл которых не очевиден без дополнительного контекста. Это ухудшает читаемость и усложняет рефакторинг.

    # Плохо: что такое 86400?
    token_expires = now() + 86400
    
    # Хорошо: смысл очевиден
    SECONDS_IN_DAY = 86400
    token_expires = now() + SECONDS_IN_DAY
  2. Божественный объект (God Object) Класс, который концентрирует в себе слишком много разнородной функциональности, нарушая принцип единой ответственности (SRP). Такие объекты сложно тестировать, поддерживать и переиспользовать.

  3. Спагетти-код (Spaghetti Code) Код с запутанной и непредсказуемой структурой управления, с множеством переходов и зависимостей. Его практически невозможно читать и отлаживать.

  4. Программирование копированием-вставкой (Copy-Paste Programming) Дублирование кода вместо создания переиспользуемых функций или классов. Нарушает принцип DRY (Don't Repeat Yourself) и приводит к тому, что при исправлении ошибки ее нужно исправлять во всех скопированных экземплярах.

  5. Преждевременная оптимизация (Premature Optimization) Оптимизация кода до того, как профилирование выявило реальные узкие места в производительности. Часто приводит к усложнению кода ради незначительного или нулевого выигрыша.

  6. Игнорирование ошибок (Error Hiding) Подавление исключений с помощью пустого блока except или логирование без последующей обработки. Это скрывает проблемы в системе и делает отладку крайне сложной.

    # Очень плохо: ошибка будет проигнорирована
    try:
        process_data(data)
    except Exception:
        pass # Проблема скрыта