Я розумію наміри принципу відкритого закритого типу. Це покликане зменшити ризик зламати щось, що вже працює, змінюючи його, сказавши вам спробувати продовжити, не змінюючи.
Однак у мене виникли проблеми з розумінням того, як цей принцип застосовується на практиці. Наскільки я розумію, це два способи застосувати. Beofore та після можливої зміни:
Перед: програмуйте на абстракції і «прогнозуйте майбутнє» наскільки це можливо. Наприклад, метод
drive(Car car)
доведеться змінити, якщоMotorcycle
s в майбутньому буде додано s, тому він, ймовірно, порушує OCP. Але методdrive(MotorVehicle vehicle)
, швидше за все, доведеться змінити в майбутньому, тому він дотримується OCP.Однак передбачити майбутнє і заздалегідь знати, які зміни будуть внесені в систему, досить складно.
Після: коли потрібна зміна, розгорніть клас замість того, щоб змінювати його поточний код.
Практику №1 не важко зрозуміти. Однак у практиці №2 у мене виникають проблеми з розумінням, як подати заявку.
Наприклад (я взяв його з відео на YouTube): припустимо , у нас є метод в класі , який приймає CreditCard
об'єкти: makePayment(CraditCard card)
. Один день Voucher
s додаються в систему. Цей метод не підтримує їх, тому його потрібно модифікувати.
При впровадженні методу ми в першу чергу не спромоглися передбачити майбутнє та програму більш абстрактно (наприклад makePayment(Payment pay)
, тепер нам доведеться змінити існуючий код.
Практика № 2 говорить, що ми повинні додати функціональність шляхом розширення, а не модифікації. Що це означає? Чи слід підкласити існуючий клас замість того, щоб просто змінити існуючий код? Чи варто робити якусь обгортку навколо неї, щоб уникнути переписування коду?
Або принцип навіть не посилається на "як правильно змінити / додати функціональність", а скоріше посилається на "як уникнути необхідності вносити зміни в першу чергу (тобто програму на абстракції)?