Ответ
Принцип инверсии зависимостей (DIP) — пятый принцип SOLID. Он декларирует:
- Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Цель — уменьшить связанность между компонентами, сделав систему более гибкой, расширяемой и удобной для тестирования.
Пример нарушения DIP в C++:
// Модуль нижнего уровня (деталь)
class SqlDatabase {
public:
void saveData(const std::string& data) { /* ... */ }
};
// Модуль верхнего уровня жёстко зависит от детали
class ReportService {
SqlDatabase db; // Прямая зависимость от конкретного класса
public:
void generateReport() {
// ... логика отчёта
db.saveData(reportData);
}
};
Здесь ReportService тесно связан с SqlDatabase. Замена базы данных потребует изменений в ReportService.
Пример с применением DIP:
// Абстракция (интерфейс)
class IDataStorage {
public:
virtual ~IDataStorage() = default;
virtual void save(const std::string& data) = 0;
};
// Модуль нижнего уровня зависит от абстракции
class SqlDatabase : public IDataStorage {
public:
void save(const std::string& data) override { /* ... */ }
};
class FileStorage : public IDataStorage {
public:
void save(const std::string& data) override { /* ... */ }
};
// Модуль верхнего уровня также зависит от абстракции
class ReportService {
IDataStorage& storage; // Зависимость от интерфейса
public:
ReportService(IDataStorage& s) : storage(s) {} // Внедрение зависимости
void generateReport() {
// ... логика отчёта
storage.save(reportData);
}
};
Теперь ReportService не знает о деталях хранения данных. Мы можем легко подменить реализацию IDataStorage (для тестирования, смены БД и т.д.), не меняя код сервиса.
Видео-ответы
▶
Собеседование Python developer на 3000$
▶
Тестовое собеседование Java разработчика #17 - Александр Дранкин
▶
Открытое собеседование на Middle Go-разработчика в Wildberries: код-ревью
▶
Джун был тимлидом, разрабатывал телеграм ботов и стал миддлом? / Техсобес Middle Python Developer
▶
Миддл с 3-мя годами опыта менторит студентов?? / Техсобес на позицию Middle Python Developer
▶
Открытое собеседование на Go-разработчика | Тренировочные интервью
▶
Джун-самоучка получил оффер всего за день? / Техсобес Junior Python Developer / Mock interview
▶
Android-собеседование в Т-Банк. Теоретическая часть технического интервью
▶
У 11-ти классника уже 3 года опыта и собственная CRM на FastAPI?? / Техсобес Junior Python Developer
▶
Тестовое собеседование C# | .NET Junior Mock interview
▶
Тестовое собеседование C# | .NET Junior Mock interview
▶
Собеседование на позицию Java junior #1 Антон
▶
Собеседование на Junior Java разработчика
▶
Публичное собеседование по архитектуре фронтенда / Александр Зубов (Авито)
▶
Тестовое собеседование Java разработчика #20 - Игорь Самойлов