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 desMotorcycles 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 CreditCardobjets: makePayment(CraditCard card). Un jour Vouchers 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)?