Антипаттерны и запахи

Основная проблема антипаттернов и запахов ниже — в сокрытии зависимостей и увеличении сцепления модулей друг с другом.

Контрол-фрик

Контрол-фрик — это запах, при котором зависимости явно создаются в конструкторе с помощью new.

class Auth {
  // обратите внимание на отсутствие аргументов у конструктора
  // и ключевое слово new внутри
  constructor() {
    this.connection = new MySqlConnection()
  }
}

Класс Auth становится жёстко сцепленным с MySqlConnection, то есть не может работать без него. Это нарушает OCP, LSP и ISP.

Также чтобы протестировать такой класс, придётся сделать глобальный мок для MySqlConnection. Это ресурсозатратно и засоряет глобальную область видимости.

Локатор служб

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

Мы называем его антипаттерном с оговоркой, что есть ситуации, когда он нужен — например, при работе с легаси. Но при создании новой системы лучше использовать DI.

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

Понять код и предугадать его поведение становится трудно — ведь, чтобы узнать все зависимости необходимо изучить исходники. IDE уже не сможет подсказать, какие зависимости необходимы для создания класса.

При использовании DI такой проблемы нет — у нас просто не получится создать экземпляр класса, не передав все необходимые зависимости.

Материалы к разделу