TL; DR
Я думаю, что добавление нового метода по сути означает, что вы не можете нарушать OCP; поскольку OCP в основном фокусируется на безрассудном переопределении существующих методов.
Пример:
Базовый класс Calculator
наследуется MyCustomCalculator
. Базовый класс имеет только методы для сложения, вычитания, умножения и деления двух чисел.
Создание нового метода в MyCustomCalculator
, например CalculateAverage(params int[])
не нарушает OCP. Он не изменяет логику каких-либо существующих методов, а просто расширяет методы, предоставляемые объектом калькулятора.
Новые методы по своей сути не меняют старые методы. Следовательно, они не изменяют существующую логику; затем просто расширьте то, что доступно.
Так что нет, это (по сути) не нарушает OCP.
Нарушение OCP практически невозможно, поскольку создание чего-то нового (по сути) полностью отличается от изменения того, что существует.
Однако на некоторые вещи следует обратить внимание:
- Я могу придумать одно (спорное) исключение из этого: перегрузка. Если вы создаете новый метод, который перегружает существующий, вы несете ответственность за соблюдение правил перегрузки. В частности, это означает, что перегруженные методы должны выполнять ту же задачу, что и другие (перегруженные методы просто основаны на разных входных параметрах, но их обработка и вывод должны быть функционально эквивалентными). Хотя я не уверен на 100%, является ли это нарушение OCP (потому что он неправильно расширяет базовый класс) или SRP (потому что это создает неоднозначную ответственность в отношении обработки / вывода перегруженных методов. ). Кажется, и то и другое.
- Тот же принцип применяется, даже если ваш новый метод не перегружает существующий. Достаточно ли актуален новый метод для ответственности (намерения / цели) базового класса? Потому что, если он сильно отличается, вы, возможно, нарушаете SRP.
ИЗМЕНИТЬ
Я пропустил часть вашего вопроса
Можно ли добавить метод к базовому классу или мы также должны создать новый класс, который наследует базовый класс, а затем поместить туда новый метод?
Это зависит от контекста. Для примера Calculator
/ MyCustomCalculator
/ CalculateAverage()
, который я предоставил; Я бы инстинктивно добавил его в базовый класс, поскольку вычисление средних значений - это базовая операция, относящаяся к обязанностям калькулятора.
Однако, если бы мы обсуждали добавление метода, который относится только к комплексным числам (MethodForComplexNumbers()
), то я бы поддержал создание ComplexNumberCalculator
, который наследуется от Calculator
и реализует MethodForComplexNumbers()
.
Однако я думаю, что это в основном связано с SRP, а не OCP.
person
Flater
schedule
28.06.2017