Модули верхнего уровня не должны зависеть от модулей нижнего уровня.
Оба типа модулей должны зависеть от абстракций.
Вместо жёстких зависимостей от конкретных классов — зависим от интерфейсов.
Это облегчает тестирование, замену реализаций и расширение системы.
// Нарушение — напрямую зависит от конкретного класса class Keyboard {} class Computer { private Keyboard keyboard = new Keyboard(); } // Правильно — зависимость от абстракции interface InputDevice { void input(); } class Keyboard implements InputDevice { public void input() { System.out.println("Набор текста"); } } class Computer { private final InputDevice device; public Computer(InputDevice device) { this.device = device; } }
Модули верхнего уровня не должны зависеть от модулей нижнего уровня.
Оба типа модулей должны зависеть от абстракций.
Вместо жёстких зависимостей от конкретных классов — зависим от интерфейсов.
Это облегчает тестирование, замену реализаций и расширение системы.
// Нарушение — напрямую зависит от конкретного класса class Keyboard {} class Computer { private Keyboard keyboard = new Keyboard(); } // Правильно — зависимость от абстракции interface InputDevice { void input(); } class Keyboard implements InputDevice { public void input() { System.out.println("Набор текста"); } } class Computer { private final InputDevice device; public Computer(InputDevice device) { this.device = device; } }
// Пример кода
function hello(name) {
console.log(`Hi, ${name}!`);
}
hello("Sergey");