1277. Что такое Open Closed Principle (Принцип открытости/закрытости)?
Принцип открытости/закрытости (Open/Closed Principle, OCP) - классы должны быть открыты для расширения, но закрыты для модификации. Иными словами, вы должны иметь возможность добавлять новую функциональность без изменения старого кода.
Принцип открытости/закрытости (Open Closed Principle, OCP) в объектно-ориентированном программировании означает, что сущность должна быть открыта для расширения, но закрыта для модификации. Суть заключается в том, что при добавлении новой функциональности к системе не следует изменять существующий рабочий код, вместо этого следует добавлять новый код. Это помогает сделать код более гибким и способствует улучшению его качества и поддерживаемости.
Примером может служить система меню, которая может иметь различный функционал в зависимости от роли пользователя. Вместо того, чтобы изменять код существующих классов, можно написать новый класс, который наследует интерфейс существующего класса и реализует новую функциональность. Такой подход позволяет оставлять существующий код неизменным, в то время как добавление новой функциональности выполняется без нарушения существующего функционала.
Еще одним примером может быть система отправки сообщений, которая может использоваться различными клиентами для отправки различных типов сообщений. Эта система может быть организована с использованием интерфейсов и классов, таким образом, чтобы при добавлении нового типа сообщений не требовалось изменять код уже существующих классов.
Изучение и применение принципа OCP в своих проектах может помочь сделать код более гибким и снизить уровень зависимости между различными частями системы.
Пример на Java:
// Плохой пример нарушает OCP public class Shape {
private String type;
public void draw() {
if (type.equalsIgnoreCase("circle")) {
drawCircle();
} else if (type.equalsIgnoreCase("square")) {
drawSquare();
}
}
private void drawCircle() {
// логика рисования круга }
private void drawSquare() {
// логика рисования квадрата }
}
// Хороший пример OCP public abstract class Shape {
public abstract void draw();
}
public class Circle extends Shape {
@Override public void draw() {
// логика рисования круга }
}
public class Square extends Shape {
@Override public void draw() {
// логика рисования квадрата }
}
В этом примере класс Shape нарушает принцип OCP, так как его метод draw() использует условную конструкцию для определения типа фигуры и выбора правильного метода рисования. Если мы добавим новый тип фигуры, нам нужно будет изменить класс Shape, что нарушает принцип OCP.
Классы Circle и Square следуют принципу OCP, так как они наследуются от абстрактного класса Shape и имеют свою собственную реализацию метода draw(). Если мы захотим добавить новый тип фигуры, нам просто нужно будет создать новый класс, наследуемый от Shape.