Je comprends l'intention du principe ouvert-fermé. Il est destiné à réduire le risque de casser quelque chose qui fonctionne déjà en le modifiant, en vous disant d'essayer de l'étendre sans le modifier.
Cependant, j'ai eu du mal à comprendre comment ce principe est appliqué dans la pratique. À ma connaissance, il existe deux façons de l'appliquer. Avant et après un éventuel changement:
Avant: programmez les abstractions et «prédisez l'avenir» autant que vous le pouvez. Par exemple, une méthode
drive(Car car)
devra changer si desMotorcycle
s sont ajoutés au système à l'avenir, donc elle viole probablement OCP. Mais la méthodedrive(MotorVehicle vehicle)
est moins susceptible de devoir changer à l'avenir, elle adhère donc à l'OCP.Cependant, il est assez difficile de prédire l'avenir et de savoir à l'avance quels changements vont être apportés au système.
Après: lorsqu'une modification est nécessaire, étendez une classe au lieu de modifier son code actuel.
La pratique n ° 1 n'est pas difficile à comprendre. Cependant, c'est la pratique n ° 2 que j'ai du mal à comprendre comment postuler.
Par exemple (je l'ai pris à partir d' une vidéo sur YouTube): disons que nous avons une méthode dans une classe qui accepte des CreditCard
objets: makePayment(CraditCard card)
. Un jour Voucher
s est ajouté au système. Cette méthode ne les prend pas en charge, elle doit donc être modifiée.
Lors de la mise en œuvre de la méthode, nous n'avons pas réussi à prédire l'avenir et à programmer en termes plus abstraits (par exemple makePayment(Payment pay)
, nous devons donc maintenant modifier le code existant.
La pratique # 2 dit que nous devrions ajouter la fonctionnalité en étendant au lieu de modifier. Qu'est-ce que ça veut dire? Dois-je sous-classer la classe existante au lieu de simplement changer son code existant? Dois-je faire une sorte de wrapper juste pour éviter de réécrire du code?
Ou le principe ne fait-il même pas référence à «comment modifier / ajouter correctement des fonctionnalités», mais plutôt à «comment éviter d'avoir à apporter des modifications en premier lieu (c'est-à-dire programmer des abstractions)?