🤔 Какова суть принципа open closed?



Является одним из пяти принципов SOLID, разработанных Робертом Мартином (Robert C. Martin). OCP гласит, что программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение модуля можно расширить без изменения его исходного кода.



🚩Почему это нужно?



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



🚩Как это используется?



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



🚩Пример использования



🟠Без применения OCP

Если нам нужно добавить новый тип сотрудников, например, Intern, нам придется изменить код класса Payroll.

class Employee {

public:

virtual double calculatePay() const = 0;

};



class FullTimeEmployee : public Employee {

public:

double calculatePay() const override {

return 5000.0; // фиксированная зарплата

}

};



class ContractEmployee : public Employee {

public:

double calculatePay() const override {

return 3000.0; // фиксированная зарплата

}

};



class Payroll {

public:

double calculateTotalPay(const std::vector<Employee*>& employees) {

double totalPay = 0.0;

for (const auto& employee : employees) {

totalPay += employee->calculatePay();

}

return totalPay;

}

};




🟠С применением OCP

Теперь мы можем добавлять новые типы сотрудников, например, Intern, без изменения кода класса Payroll. Мы просто создаем новый класс, реализующий интерфейс Employee, что соответствует принципу открытости-закрытости.

class Employee {

public:

virtual double calculatePay() const = 0;

virtual ~Employee() = default;

};



class FullTimeEmployee : public Employee {

public:

double calculatePay() const override {

return 5000.0; // фиксированная зарплата

}

};



class ContractEmployee : public Employee {

public:

double calculatePay() const override {

return 3000.0; // фиксированная зарплата

}

};



class Intern : public Employee {

public:

double calculatePay() const override {

return 1500.0; // фиксированная зарплата

}

};



class Payroll {

public:

double calculateTotalPay(const std::vector<Employee*>& employees) {

double totalPay = 0.0;

for (const auto& employee : employees) {

totalPay += employee->calculatePay();

}

return totalPay;

}

};




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