Comments 16
Хорошее объяснение одного из практических плюсов «академического» ISP. Часто можно наблюдать, что люди пытаются формально соблюдать DIP, но никаких практических плюсов это не даёт, потому что выносят в один интерфейс все методы огромного класса, который почти гарантировано станет навсегда единственной реализацией из-за своей сложности.
Да, именованный конструктор UserCreds:createFromHttpRequest(HttpServletRequest request) не очень хорошее место по инкапсуляции знаний о способе преобразования HttpServletRequest в UserCred в общем случае. Лучше его помещать куда-то в слой, основная функция которого преобразовывать HttpServletRequest в DTO/ValueObject приложения или доменной области. Пускай даже без выделения в отдельный метод, пока не нарушается DRY. Итого у нас есть варианта клиентского кода:
LoginManager loginManager = new LoginManager();
User user = loginManager.login(request);
User user = loginManager.login(
request.getParameter("user"),
request.getParameter("password"));
LoginManager loginManager = new LoginManager();
UserCreds creds = new UserCreds(request.getParameter("user"), request.getParameter("password")); // @todo extract fabric into http layer
User user = loginManager.login(creds);
По-моему, последний оптимален по читаемости и возможности изменения/расширения в будущем.
в 3-м варианте я сразу думаю — creds? что это? иду искать. Благо, что оно строчкой выше расположено, а если нет?
Замысел как раз чтобы стали нет. :) Вторая строчка в третьем варианте может быть где угодно, например в какой-то мидваре, бросая параметром контроллеру инстанс UserCreds. разработчику контроллера можно вообще не думать об http-запросе.
Краеугольный камень ООП — «внедрение зависимостей».
А я всю жизнь думал, что инкапсуляция, наследование и полиморфизм :) Внедрение зависимостей появилось (читать: начало активно использоваться) гораздо позже, по причине, неплохо описанной в данной статье. Взять тот же Turbo Vision — там даже интерфейсы не использовались (они появились позже), и тем не менее Turbo Vision — это ООП. Кстати, «Внедрение зависимостей», вероятно, стоило бы называть «внедрение независимостей», это лучше отражает суть.
public byte[] readFileContents(String fileName){
//open the file and return the contents as a byte array.
}
подзавис секунд на 15, а потом понял что это не PHP :D
Understanding Dependencies