Comprendo l'intento del principio di open-closed. Ha lo scopo di ridurre il rischio di rompere qualcosa che già funziona modificandolo, dicendoti di provare ad estendere senza modificare.
Tuttavia, ho avuto qualche problema a capire come questo principio viene applicato nella pratica. Per quanto ho capito, ci sono due modi per applicarlo. Prima e dopo un possibile cambiamento:
-
Prima: programma alle astrazioni e "prevedi il futuro" il più possibile. Ad esempio, un metodo
drive(Car car)
dovrà cambiare seMotorcycle
s vengono aggiunti al sistema in futuro, quindi probabilmente viola l'OCP. Ma il metododrive(MotorVehicle vehicle)
è inferiore probabilmente dovrà cambiare in futuro, quindi aderisce a OCP.Tuttavia, è abbastanza difficile prevedere il futuro e conoscere anticipare le modifiche che verranno apportate al sistema.
-
Dopo: quando è necessaria una modifica, estendi una classe invece di modificarla codice corrente.
La pratica n. 1 non è difficile da capire. Comunque è la pratica n. 2 che ho difficoltà a capire come applicare.
Ad esempio (l'ho preso da un video su YouTube): diciamo che abbiamo un metodo in una classe che accetta CreditCard
oggetti: makePayment(CraditCard card)
. Un giorno Voucher
s vengono aggiunti al sistema. Questo metodo non li supporta quindi deve essere modificato.
Quando implementavamo il metodo, in primo luogo, non riuscivamo a prevedere il futuro e il programma in termini più astratti (ad esempio makePayment(Payment pay)
, quindi ora dobbiamo cambiare il codice esistente.
La pratica n. 2 dice che dovremmo aggiungere la funzionalità estendendo invece di modificare. Che cosa significa? Devo creare una sottoclasse della classe esistente invece di modificare semplicemente il codice esistente? Dovrei creare una sorta di wrapper attorno ad esso solo per evitare di riscrivere il codice?
O il principio non si riferisce nemmeno a 'come modificare / aggiungere correttamente funzionalità', ma piuttosto si riferisce a 'come evitare di dover apportare modifiche in primo luogo (es. programma alle astrazioni)?