От: | SergeyT. | http://sergeyteplyakov.blogspot.com/ | |
Дата: | 04.04.16 16:16 | ||
Оценка: | 13 (1) |
От: | Тепляков Сергей Владимирович | http://sergeyteplyakov.blogspot.com/ | |
Дата: | 01.04.16 14:20 | ||
Оценка: |
От: | AK85 | ||
Дата: | 04.04.16 15:49 | ||
Оценка: |
Суть инверсии зависимостей сводится к тому, что класс перекладывает ответственность за создание зависимости или получение ее экземпляра на более высокий уровень, в результате чего он сам не создает экземпляр конкретного класса, а получает его от более высокоуровневого кода через конструктор или свойство.
От: | AK85 | ||
Дата: | 04.04.16 18:43 | ||
Оценка: |
Насколько я понял, речь идет о высоте уровня абстракции зависимостей, чем выше тем лучше.Принцип инверсии зависимости говорит о том, к каким видам зависимостей нужно стремиться. Важно, чтобы зависимости класса были понятны и важны вызывающему коду. Зависимости класса должны располагаться на текущем или более высоком уровне абстракции. Другими словами, не любой класс, который требует интерфейс в конструкторе следует принципу инверсии зависимостей:
class ReportProcessor { private readonly ISocket _socket; public ReportProcessor(ISocket socket) { _socket = socket; } public void SendReport(Report report, IStringBuilder stringBuilder) { stringBuilder.AppendFormat(CreateHeader(report)); stringBuilder.AppendFormat(CreateBody(report)); stringBuilder.AppendFormat(CreateFooter(report)); _socket.Connect(); _socket.Send(ConvertToByteArray(stringBuilder)); } }
Класс ReportProcessor все еще принимает «абстракцию» в аргументах конструктора — ISocket, но эта «абстракция» находится на несколько уровней ниже уровня формирования и отправки отчетов. Аналогично дела обстоят и с аргументом метода SendReport: «абстракция» IStringBuilder не соответствует принципу инверсии зависимостей, поскольку оперирует более низкоуровневыми понятиями, чем требуется. На этом уровне нужно оперировать не строками, а отчетами.
Здесь Вы говорите что суть в том чтобы переложить ответственность за создание зависимости на внешний код.Суть инверсии зависимостей сводится к тому, что класс перекладывает ответственность за создание зависимости или получение ее экземпляра на более высокий уровень, в результате чего он сам не создает экземпляр конкретного класса, а получает его от более высокоуровневого кода через конструктор или свойство. В результате мы заменяем композицию агрегацией и перекладываем часть проблем с текущего класса куда-то выше.
the Dependency Inversion Principle is primarily about reversing the conventional direction of dependencies from "higher level" components to "lower level" components such that "lower level" components are dependent upon the interfaces owned by the "higher level" components.