Ich habe kürzlich eine Website über die Entwicklung von sauberem Code gelesen (ich habe hier keinen Link eingefügt, da dieser nicht auf Englisch ist).
Eines der auf dieser Website beworbenen Prinzipien ist das Open-Closed-Prinzip : Jede Softwarekomponente sollte zur Erweiterung geöffnet und zur Änderung geschlossen sein. Wenn wir beispielsweise eine Klasse implementiert und getestet haben, sollten wir sie nur ändern, um Fehler zu beheben oder neue Funktionen hinzuzufügen (z. B. neue Methoden, die die vorhandenen nicht beeinflussen). Die vorhandene Funktionalität und Implementierung sollte nicht geändert werden.
Normalerweise wende ich dieses Prinzip an, indem ich eine Schnittstelle I
und eine entsprechende Implementierungsklasse definiere A
. Wenn die Klasse A
stabil geworden ist (implementiert und getestet), ändere ich sie normalerweise nicht zu stark (möglicherweise überhaupt nicht), d. H.
- Wenn neue Anforderungen eintreffen (z. B. Leistung oder eine völlig neue Implementierung der Schnittstelle), die große Änderungen am Code erfordern, schreibe ich eine neue Implementierung
B
und verwende sieA
so lange, wie sieB
nicht ausgereift ist. WennB
es ausgereift ist, muss nur noch geändert werden, wieI
instanziiert wird. - Wenn die neuen Anforderungen auch eine Änderung der Schnittstelle vorschlagen, definiere ich eine neue Schnittstelle
I'
und eine neue ImplementierungA'
. AlsoI
,A
sind gesperrt und bleibt die Umsetzung für das Produktionssystem solangeI'
undA'
ist nicht stabil genug , um sie zu ersetzen.
Angesichts dieser Beobachtung war ich ein wenig überrascht, dass die Webseite dann die Verwendung komplexer Refactorings vorschlug , "... weil es nicht möglich ist, Code direkt in seiner endgültigen Form zu schreiben."
Gibt es nicht einen Widerspruch / Konflikt zwischen der Durchsetzung des Open / Closed-Prinzips und dem Vorschlag, komplexe Refactorings als Best Practice zu verwenden? Oder die Idee hier ist, dass man während der Entwicklung einer Klasse komplexe Refactorings verwenden kann A
, aber wenn diese Klasse erfolgreich getestet wurde, sollte sie eingefroren werden?