Антипаттерны и запахи
Основная проблема антипаттернов и запахов ниже — в сокрытии зависимостей и увеличении зацепления модулей друг с другом.
Контрол-фрик
Контрол-фрик — это запах, при котором зависимости явно создаются в конструкторе с помощью new
.
class Auth {
// обратите внимание на отсутствие аргументов у конструктора
// и ключевое слово new внутри
constructor() {
this.connection = new MySqlConnection()
}
}
Класс Auth
становится жёстко зацепленным с MySqlConnection
, то есть не может работать без него. Это нарушает OCP, LSP и ISP.
Также чтобы протестировать такой класс, придётся сделать глобальный мок для MySqlConnection
. Это ресурсозатратно и засоряет глобальную область видимости.
Локатор служб
Локатор служб — шаблон, который позволяет подключать зависимости в момент, когда они становятся нужны.
Мы называем его антипаттерном с оговоркой, что есть ситуации, когда он нужен — например, при работе с легаси. Но при создании новой системы лучше использовать DI.
Самый главный минус этого шаблона в том, что он нарушает инкапсуляцию, скрывая зависимости.
Понять код и предугадать его поведение становится трудно — ведь, чтобы узнать все зависимости необходимо изучить исходники. IDE уже не сможет подсказать, какие зависимости необходимы для создания класса.
При использовании DI такой проблемы нет — у нас просто не получится создать экземпляр класса, не передав все необходимые зависимости.