Проверяет понимание принципа инверсии зависимостей (Dependency Inversion Principle) из SOLID, который позволяет уменьшить связанность кода и упростить его тестирование и поддержку.
Инверсия зависимостей (Dependency Inversion Principle, DIP) — это пятый принцип SOLID, который гласит: модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей; детали должны зависеть от абстракций.
Без инверсии зависимостей код становится жестко связанным: изменение в низкоуровневом модуле (например, смена базы данных) требует изменения всех высокоуровневых модулей, которые его используют. Это усложняет тестирование, поддержку и расширение функциональности.
Рассмотрим пример без инверсии зависимостей:
class MySQLDatabase {
save(data) { /* сохранение в MySQL */ }
}
class UserService {
constructor() {
this.db = new MySQLDatabase(); // жесткая зависимость
}
createUser(user) {
this.db.save(user);
}
}Теперь с инверсией зависимостей:
class DatabaseInterface {
save(data) { throw new Error('Not implemented'); }
}
class MySQLDatabase extends DatabaseInterface {
save(data) { /* сохранение в MySQL */ }
}
class UserService {
constructor(database) {
this.db = database; // зависимость от абстракции
}
createUser(user) {
this.db.save(user);
}
}
// Использование
const db = new MySQLDatabase();
const service = new UserService(db);Принцип широко используется в фреймворках с внедрением зависимостей (Dependency Injection), таких как Angular, Spring, NestJS. Он позволяет легко подменять реализации для тестирования (например, использовать in-memory базу вместо реальной).
Вывод: Инверсия зависимостей делает код гибким, тестируемым и слабо связанным. Её стоит применять в любом проекте, где важна поддерживаемость и возможность замены компонентов.