Es gibt viele Heuristiken, die mit objektorientiertem Design verbunden sind. Beispiel: "Alle Mitgliedsvariablen sollten privat sein", "Globale Variablen sollten vermieden werden" oder "Die Verwendung der RTTI (Runtime Type Identification) ist gefährlich". Woher stammen diese Heuristiken? Was macht sie wahr? Sind sie immer wahr Diese Kolumne untersucht das Designprinzip, das diesen Heuristiken zugrunde liegt - das Open-Closed-Prinzip.
Wie Ivar Jacobson sagte: „Alle Systeme ändern sich während ihres Lebenszyklus. Dies muss berücksichtigt werden, wenn Systeme entwickelt werden, die voraussichtlich länger als die erste Version halten. “Wie können wir Designs erstellen, die angesichts von Änderungen stabil sind und die länger als die erste Version halten werden? Bertrand Meyer gab uns bereits 1988 Orientierung, als er das mittlerweile berühmte Open-Closed-Prinzip prägte. Um ihn zu umschreiben:
SOFTWARE-EINHEITEN (KLASSEN, MODULE, FUNKTIONEN usw.) SOLLTEN ZUR ERWEITERUNG GEÖFFNET, ABER ZUR ÄNDERUNG GESCHLOSSEN WERDEN.
Wenn eine einzelne Änderung an einem Programm zu einer Kaskade von Änderungen an abhängigen Modulen führt, weist dieses Programm die unerwünschten Attribute auf, die wir mit „schlechtem“ Design assoziieren. Das Programm wird zerbrechlich, starr, unvorhersehbar und nicht wiederverwendbar. Das Open-Closed-Prinzip greift dies auf sehr einfache Weise an. Es heißt, dass Sie Module entwerfen sollten, die sich nie ändern . Wenn sich die Anforderungen ändern, erweitern Sie das Verhalten solcher Module, indem Sie neuen Code hinzufügen und nicht indem Sie alten Code ändern, der bereits funktioniert.
Beschreibung
Module, die dem Open-Closed-Prinzip entsprechen, weisen zwei Hauptattribute auf.
- Sie sind "Open For Extension".
Dies bedeutet, dass das Verhalten des Moduls erweitert werden kann. Dass wir das Modul auf neue und unterschiedliche Weise dazu bringen können, dass sich die Anforderungen der Anwendung ändern oder die Anforderungen neuer Anwendungen erfüllt werden.
- Sie sind „wegen Änderungen geschlossen“.
Der Quellcode eines solchen Moduls ist unverletzt. Niemand darf Änderungen am Quellcode vornehmen.
Es scheint, dass diese beiden Attribute im Widerspruch zueinander stehen. Die normale Art, das Verhalten eines Moduls zu erweitern, besteht darin, Änderungen an diesem Modul vorzunehmen. Es wird normalerweise angenommen, dass ein Modul, das nicht geändert werden kann, ein festes Verhalten aufweist. Wie können diese beiden gegensätzlichen Attribute gelöst werden?
Abstraktion ist der Schlüssel ...