Книга: Погружение в Паттерны Проектирования
Назад: S: Принцип единой ответственности
Дальше: L: Принцип подстановки Лисков
O
Принцип открытости/закрытости

pen/closed Principle

Расширяйте классы, но не изменяйте их первоначальный код.

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

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

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

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

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

Пример

Класс заказов имеет метод расчёта стоимости доставки, причём способы доставки «зашиты» непосредственно в сам метод. Если вам нужно будет добавить новый способ доставки, то придётся трогать весь класс Order.

Нарушение принципа открытости/закрытости

ДО: код класса заказа нужно будет изменять при добавлении нового способа доставки.

Проблему можно решить, если применить паттерн Стратегия. Для этого нужно выделить способы доставки в собственные классы с общим интерфейсом.

Соблюдение принципа открытости/закрытости

ПОСЛЕ: новые способы доставки можно добавить, не трогая класс заказов.

Теперь при добавлении нового способа доставки нужно будет реализовать новый класс интерфейса доставки, не трогая класса заказов. Объект способа доставки в класс заказа будет подавать клиентский код, который раньше устанавливал способ доставки простой строкой.

Бонус этого решения в том, что расчёт времени и даты доставки тоже можно поместить в новые классы, повинуясь принципу единственной ответственности.

Назад: S: Принцип единой ответственности
Дальше: L: Принцип подстановки Лисков

asd
asdda