Ich verstehe die Absicht des Open-Closed-Prinzips. Es soll das Risiko verringern, dass etwas beschädigt wird, das bereits funktioniert, während es geändert wird, indem Sie versuchen, es ohne Änderung zu erweitern.
Ich hatte jedoch einige Probleme zu verstehen, wie dieses Prinzip in der Praxis angewendet wird. Meines Erachtens gibt es zwei Möglichkeiten, dies anzuwenden. Vor und nach einer möglichen Änderung:
Vorher: Programmiere auf Abstraktionen und sage die Zukunft voraus, so oft du kannst. Beispielsweise muss eine Methode
drive(Car car)
geändert werden, wennMotorcycle
dem System in Zukunft s hinzugefügt werden, sodass dies wahrscheinlich gegen OCP verstößt. Esdrive(MotorVehicle vehicle)
ist jedoch weniger wahrscheinlich, dass sich die Methode in Zukunft ändern muss, sodass sie an OCP festhält.Es ist jedoch ziemlich schwierig, die Zukunft vorherzusagen und im Voraus zu wissen, welche Änderungen am System vorgenommen werden.
After: Wenn eine Änderung erforderlich ist, erweitern Sie eine Klasse, anstatt den aktuellen Code zu ändern.
Übung 1 ist nicht schwer zu verstehen. In der zweiten Übung habe ich jedoch Probleme, die Bewerbung zu verstehen.
Zum Beispiel (ich nahm es von einem Video auf YouTube): Lassen Sie uns sagen , dass wir eine Methode in einer Klasse, die akzeptiert CreditCard
Objekte: makePayment(CraditCard card)
. Ein Tag Voucher
wird dem System hinzugefügt. Diese Methode unterstützt sie nicht und muss daher geändert werden.
Bei der ersten Implementierung der Methode ist es uns nicht gelungen, die Zukunft vorherzusagen und abstrakter zu programmieren (z. B. makePayment(Payment pay)
müssen wir jetzt den vorhandenen Code ändern.
In Übung 2 heißt es, wir sollten die Funktionalität erweitern, anstatt sie zu ändern. Was bedeutet das? Soll ich die vorhandene Klasse in Unterklassen unterteilen, anstatt nur den vorhandenen Code zu ändern? Sollte ich eine Art Wrapper erstellen, um zu vermeiden, dass Code neu geschrieben wird?
Oder bezieht sich das Prinzip nicht einmal auf das richtige Ändern / Hinzufügen von Funktionen, sondern vielmehr auf das Vermeiden von Änderungen an erster Stelle (dh Programmieren auf Abstraktionen)?