In Meyers Object-Oriented Software Construction (1988) definiert er das Open / Closed-Prinzip wie folgt:
- Ein Modul gilt als offen, wenn es noch zur Erweiterung zur Verfügung steht. Beispielsweise sollte es möglich sein, Felder zu den enthaltenen Datenstrukturen oder neue Elemente zu den von ihnen ausgeführten Funktionen hinzuzufügen.
- Ein Modul gilt als geschlossen, wenn es anderen Modulen zur Verfügung steht. Dies setzt voraus, dass das Modul eine genau definierte, stabile Beschreibung erhalten hat (die Schnittstelle im Sinne des Versteckens von Informationen).
Er fährt fort zu sagen:
Wenn Sie ein Modul erneut öffnen, müssen Sie auch alle seine Clients erneut öffnen, um sie zu aktualisieren, da sie auf der alten Version basieren. … [Dieses Problem] tritt jedes Mal auf, wenn ein Modul um eine neue Funktion oder ein neues Datenelement erweitert werden muss, wodurch Änderungen in direkten und indirekten Clients ausgelöst werden. ... Mit klassischen Ansätzen für Design und Programmierung gibt es keine Möglichkeit, offene und geschlossene Module zu schreiben.
Meyers Lösung für dieses Dilemma lautet: Erweitern Sie niemals ein Bibliotheksmodul, indem Sie vorhandene Klassen ändern. Schreiben Sie stattdessen ein neues Modul, das die vorhandenen Klassen unterordnet, und lassen Sie neue Clients von diesem neuen Modul abhängen.
Jetzt, 1988, habe ich (prozedurale) Spielzeugprogramme in Turbo Pascal und Blankenship Basic geschrieben. Meine Berufserfahrung im 21. Jahrhundert liegt in der JVM, der CLR und in dynamischen Sprachen. Ich weiß also nicht, was Meyer meint durch "klassische Ansätze für Design und Programmierung".
Meyers einziges konkretes Beispiel dafür, warum Client-Module erneut geöffnet werden müssen (eine switch-Anweisung in einer Enumeration, die jetzt mehr Mitglieder hat und mehr Fälle erfordert), scheint vernünftig zu sein, aber er rechtfertigt die Behauptung nicht annähernd, dass jedes Mal , wenn Sie einer Bibliothek Funktionen hinzufügen Modul müssen Sie alle seine Clients aktualisieren .
Gibt es einen historischen Grund, warum diese Behauptung 1988 offensichtlich schien? Hat das Hinzufügen von Funktionen oder Datenstrukturen zu einer statischen C-Bibliothek beispielsweise das Layout dahingehend geändert, dass Clients auch bei abwärtskompatiblen APIs neu kompiliert werden mussten? Oder spricht Meyer wirklich nur von einem Mechanismus zur Durchsetzung der API-Abwärtskompatibilität?