Объяснение фразы 'должно зависеть от абстракций' в 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).

Другие вопросы по тегам