Принципы проектирования SOLID. Принцип открытости/закрытости.

Принцип открытости/закрытости (The Open/Closed Principle) звучит следующим образом: «Класс должен быть открыт для расширения, но закрыт для модификации». Основная мысль в том, что для добавления новой функциональности класс должен быть расширен за счет добавления нового кода, но никак не изменения существующего.

Рассмотрим все на примере. Наши изначальные условия представлены классом Bard — странствующим музыкантом, который исполняет свои баллады на своей гитаре и радует весь мир:

И все бы хорошо. Как только наш музыкант получает в руки гитару, он тут же может исполнять свои мелодии и радовать зрителей. Но в этом коде скрываются свои недостатки. А что если бард захочет использовать для исполнения какой-то другой инструмент? В этом случае придется сильно изменить существующий класс. Вот и нарушение принципа открытости/закрытости. Для добавления другой функциональности нам приходится изменять класс. Чтобы сделать класс расширяемым, нужно заранее предусмотреть такую возможность. Можно сделать класс более расширяемым, если заранее создать общий для всех музыкальных инструментов интерфейс Instrument с определенным в нем методом play(), а в классе Bard добавить метод setInstrument(), позволяющий установить текущий объект типа Instrument. В соответствующих реализациях данного интерфейса — классах Guitar(гитара) или Lute(лютня) мы реализуем данный метод.

Файл Instrument.java:

Файл Guitar.java:

Файл Lute.java:

После этого изменим сам класс Bard:

Таким образом, наш класс стал гораздо более гибким. При добавлении новых музыкальных инструментов нам не нужно будет переделывать класс Bard. Достаточно будет создать новую реализацию интерфейса Instrument, например, Reedpipe(свирель).

Теперь создание объекта класса Bard будет выглядеть следующим образом:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *