Каждый класс отвечает за одну задачу, что позволяет разработчикам работать над отдельными классами независимо друг от друга. Это минимизирует пересечения в коде и снижает риск конфликтов при слиянии изменений.
Классы и модули открыты для расширения, но закрыты для модификации. Это значит, что разработчики могут добавлять новую функциональность через создание новых классов, не изменяя существующий код, что уменьшает вероятность ошибок и конфликтов.
Объекты базового класса могут быть заменены объектами производного класса без нарушения корректности программы. Это обеспечивает правильное использование полиморфизма и наследования, позволяя разработчикам создавать новые подклассы, которые будут работать с существующим кодом.
Интерфейсы разделяются на узкоспециализированные, что позволяет разработчикам работать с конкретными интерфейсами, не зависящими от других частей системы. Это уменьшает риск конфликтов и облегчает тестирование и сопровождение.
Высокоуровневые модули зависят от абстракций, а не от конкретных реализаций. Это позволяет разработчикам разрабатывать модули независимо, создавая и тестируя их в изоляции. Абстракции упрощают подмену реализаций и позволяют использовать моки и стабы для тестирования.
Интерфейс уведомлений
class INotification {
public:
virtual void send(const std::string& message) = 0;
virtual ~INotification() = default;
};
Реализация различных типов уведомлений
class EmailNotification : public INotification {
public:
void send(const std::string& message) override {
// логика отправки email
}
};
class SMSNotification : public INotification {
public:
void send(const std::string& message) override {
// логика отправки SMS
}
};
class PushNotification : public INotification {
public:
void send(const std::string& message) override {
// логика отправки push-уведомления
}
};
Класс сервиса уведомлений
class NotificationService {
std::vector<INotification*> notifications;
public:
void addNotification(INotification* notification) {
notifications.push_back(notification);
}
void sendNotifications(const std::string& message) {
for (auto& notification : notifications) {
notification->send(message);
}
}
};
Каждый класс (например,
EmailNotification
, SMSNotification
, PushNotification
) отвечает только за свою логику отправки уведомлений.Новые типы уведомлений можно добавлять, создавая новые классы, реализующие
INotification
, без изменения существующего кода.Новые классы уведомлений могут использоваться вместо базового
INotification
без изменения логики работы NotificationService
.Клиенты зависят только от интерфейса
INotification
, а не от конкретных реализаций.NotificationService
зависит от абстракции INotification
, что упрощает тестирование и подмену реализаций.Ставь 👍 и забирай 📚 Базу знаний