Является одним из пяти принципов SOLID, которые используются для создания гибкого и легко поддерживаемого кода в объектно-ориентированном программировании. DIP гласит, что высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Этот принцип помогает снизить связанность компонентов системы, что облегчает их замену и тестирование. Если высокоуровневые модули зависят от низкоуровневых, изменения в низкоуровневых модулях могут требовать изменения высокоуровневых модулей. Это делает систему хрупкой и трудной в поддержке.
Вместо того чтобы напрямую зависеть от конкретных реализаций, модули должны зависеть от абстракций, таких как интерфейсы или абстрактные классы.
Здесь класс
Notification
зависит от конкретной реализации EmailService
. Если нам понадобится заменить EmailService
на другой способ отправки сообщений, например, SmsService
, придется менять класс Notification
.class EmailService {
public:
void sendEmail(const std::string &message) {
// Логика отправки email
}
};
class Notification {
EmailService emailService;
public:
void send(const std::string &message) {
emailService.sendEmail(message);
}
};
С использованием DIP. Теперь класс
Notification
зависит от абстракции IMessageService
, а не от конкретной реализации. Это позволяет легко подменять реализацию, не изменяя код Notification
.class IMessageService {
public:
virtual void sendMessage(const std::string &message) = 0;
virtual ~IMessageService() = default;
};
class EmailService : public IMessageService {
public:
void sendMessage(const std::string &message) override {
// Логика отправки email
}
};
class SmsService : public IMessageService {
public:
void sendMessage(const std::string &message) override {
// Логика отправки SMS
}
};
class Notification {
IMessageService &messageService;
public:
Notification(IMessageService &service) : messageService(service) {}
void send(const std::string &message) {
messageService.sendMessage(message);
}
};
Ставь 👍 и забирай 📚 Базу знаний