Ich bin etwas verwirrt darüber, wie das Open-Closed-Prinzip im wirklichen Leben angewendet werden kann. Die Anforderungen an geschäftliche Änderungen ändern sich im Laufe der Zeit. Nach dem Open-Closed-Prinzip sollten Sie die Klasse erweitern, anstatt die vorhandene Klasse zu ändern. Jedes Mal, wenn ich eine Klasse erweitere, scheint es mir nicht praktisch zu sein, die Anforderung zu erfüllen. Lassen Sie mich ein Beispiel mit dem Zugbuchungssystem geben.
Im Zugbuchungssystem gibt es ein Ticketobjekt. Es kann verschiedene Arten von Tickets geben. Regular Ticket, Concession Ticket usw. Ticket ist eine abstrakte Klasse und RegularTicket und ConcessionTickets sind konkrete Klassen. Da alle Tickets über die übliche PrintTicket-Methode verfügen, wird sie in Ticket geschrieben, einer abstrakten Basisklasse. Nehmen wir an, das hat ein paar Monate lang gut funktioniert. Jetzt kommt eine neue Anforderung hinzu, die besagt, dass das Format des Tickets geändert werden muss. Möglicherweise werden dem gedruckten Ticket nur noch wenige Felder hinzugefügt oder das Format wird geändert. Um diese Anforderung zu erfüllen, habe ich folgende Möglichkeiten
- Ändern Sie die PrintTicket () -Methode in der abstrakten Ticketklasse. Dies verstößt jedoch gegen das Open-Closed-Prinzip.
- Überschreiben Sie die PrintTicket () -Methode in untergeordneten Klassen. Dadurch wird jedoch die Drucklogik dupliziert, die gegen das DRY-Prinzip (Wiederholen Sie sich nicht) verstößt.
Fragen sind also
- Wie kann ich die oben genannten Geschäftsanforderungen erfüllen, ohne das Open / Closed-Prinzip zu verletzen?
- Wann soll die Klasse wegen Änderung geschlossen werden? Nach welchen Kriterien ist die Klasse wegen Änderung geschlossen? Ist es nach der ersten Implementierung der Klasse oder kann nach der ersten Bereitstellung in der Produktion sein oder kann etwas anderes sein.