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

Неоправданно обширные зависимости

Иногда компоненты зависят от большей информации, чем им нужно для работы. Например, представьте компонент логина в веб-приложении. Этому компоненту нужны только логин и пароль, и он вернет объект пользователя, если найдет такового.

Интерфейс может выглядеть так:

public class LoginManager{

public User login(HttpServletRequest request){
String user = request.getParameter("user");
String password = request.getParameter("password");

//read user and return it.
}
}

Вызов компонента мог бы выглядеть так:

LoginManager loginManager = new LoginManager();
User user = loginManager.login(request);

Выглядит просто, не так ли? И даже если методу логина потребуется больше параметров, не нужно будет изменять вызывающий код (это собственно и причина создания неоправданно обширной зависимости).

Но сейчас метод логина имеет то, что я называю «неоправданно обширные зависимости» от интерфейса HttpServletRequest. Метод зависит от большего, чем ему требуется для работы. oginManager требует только имя пользователя и пароль, чтобы найти пользователя, но получает HttpServletRequest как параметр в методе логина. HttpServletRequest содержит гораздо больше информации, чем нужно LoginManager.

Зависимость от интерфейса HttpServletRequest вызывает две проблемы:

  1. LoginManager не может быть переиспользован без объекта HttpServletRequest. Это может сделать труднее юнит-тестирование LoginManager. Вам нужно будет замокать объект HttpServletRequest, что требует большой работы.

  2. LoginManager требует, чтобы названия параметров пользовательского имени и пароля были «логин» и «пароль». Это также необязательная зависимость.

Намного лучший интерфейс для метода логина LoginManager будет:

public User login(String user, String password){
//read user and return it.
}

Но посмотрите, что случится с вызывающим кодом теперь:

LoginManager loginManager = new LoginManager();
User user = loginManager.login(
request.getParameter("user"),
request.getParameter("password"));

Он стал более сложным.

Внимание! Вот причина, по которой разработчики создают неоправданно широкие зависимости. Чтобы упростить вызывающий код.

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

Источник: https://habr.com/ru/post/349836/