Объяснение фразы 'должно зависеть от абстракций' в Dependency Inversion (DI)
Я так и не понял вторую часть фразы ...
«Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций (например, интерфейсов)'
Если бы я изменился ...
class Upper {
foo = () => {
console.log('bar')
}
}
к...
class Upper {
foo = () => {
let lower = new Lower()
lower.bar()
}
}
class Lower {
bar = () => {
console.log('bar')
}
}
Мы бы сказали, что я успешно инвертировал зависимости, потому что теперь код консоли не может сломать модуль высокого уровня (он находится в оболочке).
Абстракция в данном случае - это интерфейс «Нижний», но код консоли не ЗАВИСИТ от «Нижнего», не так ли? Это ни от чего не зависит. Это просто «код».
Я предполагаю, что мой настоящий вопрос в том, что в данном случае означает «зависимость»?
1 ответ
пусть никто не останется без ответа :)
да, если сузить контекст до этой фразы, то реализация console.log('bar') не зависит от публичного интерфейса bar() класса Lower.
но в инверсии зависимостей есть другое предложение: « Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций ». Это означает, что вы должны поместить абстрактный класс интерфейса между вашим Верхним и Нижним.
затем: « Абстракции не должны зависеть от деталей », ваш класс интерфейса не реализует разные bar() для разных нижних уровней (с разными реализациями BarWithDetailsSaveBarToDisk(), BarWithDetailsPrintBarToScreen() и т. д.), которые вы можете изменить в своем верхнем потребителе. Но в LowerInterface есть только Bar().
и, наконец: " детали должны зависеть от абстракций " ваши пользовательские классы LowerPrintLogConsole, LowerSaveBarDisk, LowerPrintBarScreen зависят от одного Bar(), который должен зависеть от абстрактной реализации LowerInterface.
Кроме того, вы можете добавить некоторые детали через bar(): для цвета консоли, для размера печати, для сохранения имени файла. вы можете сделать это через абстрактную оболочку barDetails: bar(barDetails InBarDetails), потому что « детали должны снова зависеть от абстракций». и прежде чем использовать bar() из Upper, вы можете создать соответствующий подкласс вашей другой оболочки интерфейса (barDetails).