🤔 Как принципы SOLID помогают при параллельной разработке?



🟠Единственной ответственности (SRP)

Каждый класс отвечает за одну задачу, что позволяет разработчикам работать над отдельными классами независимо друг от друга. Это минимизирует пересечения в коде и снижает риск конфликтов при слиянии изменений.



🟠Открытости-закрытости (OCP)

Классы и модули открыты для расширения, но закрыты для модификации. Это значит, что разработчики могут добавлять новую функциональность через создание новых классов, не изменяя существующий код, что уменьшает вероятность ошибок и конфликтов.



🟠Подстановки Барбары Лисков (LSP)

Объекты базового класса могут быть заменены объектами производного класса без нарушения корректности программы. Это обеспечивает правильное использование полиморфизма и наследования, позволяя разработчикам создавать новые подклассы, которые будут работать с существующим кодом.



🟠Разделения интерфейса (ISP)

Интерфейсы разделяются на узкоспециализированные, что позволяет разработчикам работать с конкретными интерфейсами, не зависящими от других частей системы. Это уменьшает риск конфликтов и облегчает тестирование и сопровождение.



🟠Инверсии зависимостей (DIP)

Высокоуровневые модули зависят от абстракций, а не от конкретных реализаций. Это позволяет разработчикам разрабатывать модули независимо, создавая и тестируя их в изоляции. Абстракции упрощают подмену реализаций и позволяют использовать моки и стабы для тестирования.



🚩Примеры



Интерфейс уведомлений

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);

}

}

};




🚩Плюсы



SRP

Каждый класс (например, EmailNotification, SMSNotification, PushNotification) отвечает только за свою логику отправки уведомлений.

OCP

Новые типы уведомлений можно добавлять, создавая новые классы, реализующие INotification, без изменения существующего кода.

LSP

Новые классы уведомлений могут использоваться вместо базового INotification без изменения логики работы NotificationService.

ISP

Клиенты зависят только от интерфейса INotification, а не от конкретных реализаций.

DIP

NotificationService зависит от абстракции INotification, что упрощает тестирование и подмену реализаций.



Ставь 👍 и забирай 📚 Базу знаний