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