Принцип открытого-закрытого (OCP) гласит, что объект должен быть открыт для расширения, но закрыт для модификации. Я полагаю, что понимаю это и использую это вместе с SRP для создания классов, которые делают только одно. И я пытаюсь создать много небольших методов, которые позволяют извлечь все элементы управления поведением в методы, которые могут быть расширены или переопределены в некотором подклассе. Таким образом, я получаю классы, которые имеют много точек расширения, будь то через: внедрение и составление зависимостей, события, делегирование и т. Д.
Рассмотрим следующий простой расширяемый класс:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Теперь скажем, например, что OvertimeFactor
изменения до 1,5. Поскольку вышеупомянутый класс был разработан для расширения, я могу легко создать подкласс и вернуть другой OvertimeFactor
.
Но ... несмотря на то, что класс предназначен для расширения и соответствия OCP, я изменю отдельный метод, о котором идет речь, вместо того, чтобы создавать подклассы и переопределять этот метод, а затем перемонтировать мои объекты в мой контейнер IoC.
В результате я нарушил часть того, что пытается сделать OCP. Такое чувство, что я просто ленивый, потому что выше немного легче. Я неправильно понимаю OCP? Должен ли я действительно делать что-то другое? Вы по-разному используете преимущества OCP?
Обновление : основываясь на ответах, похоже, что этот надуманный пример плохой по ряду разных причин. Основная цель этого примера состояла в том, чтобы продемонстрировать, что класс был разработан для расширения путем предоставления методов, которые при переопределении будут изменять поведение открытых методов без необходимости изменения внутреннего или частного кода. Тем не менее, я определенно неправильно понял OCP.