Warum die automatische Registrierung von Abhängigkeiten böse ist

Bild



Es gibt viele Projekte vom Typ Simple Injector für verschiedene Programmiersprachen, die es ermöglichen, unter dem Namen einer Klasse, Schnittstelle oder eines Namespace und manchmal eines Ordners eine Klasse oder eine ganze Gruppe von Klassen zu registrieren, die in einigen Fällen durch diese Funktion vereint sind. Dies dient dazu, ein Objekt automatisch zu instanziieren, ohne seine Abhängigkeiten explizit anzugeben. Diese Registrierung einer Gruppe von Objekten durch ein gemeinsames Merkmal im Register zum Zwecke der weiteren Instanziierung nenne ich automatische Registrierung von Abhängigkeiten.



Wenn Sie eine Klasse explizit instanziieren, wenn Sie sie im Abhängigkeitsregister registrieren, ist dies nicht das Thema dieses Artikels.



Und was ist daran falsch?



In diesem Beitrag werde ich meine Frustration mit Projekten teilen, die die automatische Registrierung von Abhängigkeiten verwenden. Lass uns in Ordnung gehen.



Laufzeit vs Kompilierungszeit



Mit dem automatischen Tool zur Registrierung von Abhängigkeiten verschieben wir die Prüfung auf Vollständigkeit registrierter Abhängigkeiten in die Laufzeit. Das heißt, wenn wir zum Zeitpunkt des Starts des Programms nicht über die für die Ausführung des Codes erforderliche Implementierung der Schnittstelle verfügen, werden wir dies bestenfalls zu Beginn der Anwendung und im schlimmsten Fall bereits während des Betriebs des Systems und von Benutzern erfahren.



Hier ist ein Beispiel. Wenn im Projekt einige Klassen beispielsweise anhand ihres Namespace registriert wurden und Sie die Klasse irgendwann daraus verschoben haben, erfahren Sie zur Laufzeit mehr über das Problem. Das Gleiche gilt für die automatische Registrierung über die Benutzeroberfläche. Der einzige Unterschied besteht darin, dass das Verschieben kein Problem darstellt. Das Entfernen der Benutzeroberfläche führt jedoch zu einem Problem, das Sie nach dem Starten der Anwendung kennenlernen werden.



Refactoring ist viel komplizierter



Nicht nur das Refactoring, sondern auch das Erlernen des Codes wird sehr schwierig. Dies liegt daran, dass bei Verwendung der automatischen Registrierung von Abhängigkeiten der Zugriff auf die modernen Funktionen von Entwicklungsumgebungen verloren geht, sodass wir mit einem Klick herausfinden können, wer diese Klasse verwendet (Referenz finden) und die folgenden Fragen beantworten können:



  • Kann ich diese Klasse entfernen?
  • Kann ich diese Klasse in einen anderen Namespace / Ordner verschieben?


etc.



Neben der Tatsache, dass wir nicht die Möglichkeit haben, die Vollständigkeit der erforderlichen Abhängigkeiten während der Kompilierung zu überprüfen, besteht bei jedem Refactoring die Hoffnung, dass wir über einen Laufzeitmechanismus in Form von Tests, Überprüfungen von Abhängigkeitsbäumen und dergleichen verfügen. Und die Hoffnung ist, dass es funktioniert. Es ist zu beachten, dass diese Mechanismen nicht nur nicht 100% garantieren, dass die Zusammensetzung des Codes korrekt ist, sondern auch viel langsamer als die Kompilierung.



Die wahre Komplexität des Systems verbergen



Wenn Sie Klassen und all ihre Abhängigkeiten manuell instanziieren, sind Sie möglicherweise ziemlich verängstigt über die Monstrosität der Datei, in der all diese Aktionen ausgeführt werden. Wenn ich mir Tausende von Codezeilen ansehe, um Klassen zu instanziieren und sie mit einem Dutzend zu vergleichen, wenn ich die automatische Abhängigkeitsregistrierung verwende, möchte ich wirklich der Versuchung erliegen und auf die "dunkle Seite" gehen.



Aber was sagen uns diese Tausenden von Codezeilen zum Instanziieren von Objekten? Die Tatsache, dass dieses Modul komplex und groß ist, und wir sollten darüber nachdenken, es entweder durch Zuweisung von Submodulen (die ihre Abhängigkeiten explizit instanziieren) zu strukturieren oder dieses Modul in mehrere zu unterteilen.



Es mag abstrakt erscheinen, aber das Entfernen von so unangenehmen Momenten wie dem Instanziieren von Hunderten von Objekten aus unseren Augen führt dazu, dass die Projektgröße unkontrolliert wächst und wir daher den Moment verpassen, in dem sie in mehrere Projekte unterteilt werden sollte.



Zusätzliche Abhängigkeiten



Indem wir Abhängigkeiten registrieren und ihre Verwendung nicht kontrollieren, kommen wir früher oder später zu einer Situation, in der beim Starten der Anwendung wesentlich mehr Klassen registriert werden, als tatsächlich erforderlich sind. Durch einfaches Hinzufügen zu einem Ordner oder Implementieren einer Schnittstelle kann diese Klasse im allgemeinen Fall registriert werden.



Zusammenfassung



Ist es möglich, mit all diesen Nachteilen zu leben und sie nicht zu bemerken? Sicher! Aber ich glaube, das entwickelt die falschen Entwicklungsgewohnheiten. Der Punkt ist, dass das Kompilieren und Eingeben von Code Werkzeuge zur Überprüfung der Richtigkeit des Systems sind. Wenn wir sie ablehnen, stellen wir fest, dass das System zerbrechlich wird, sodass Entwickler Angst haben, irgendetwas daran zu ändern. Und die Angst der Entwickler, den Code zu ändern, führt bereits dazu, dass sich die Qualität der Codebasis verschlechtert. Danach wird es zu einem teuren Prozess, Änderungen an diesem Code vorzunehmen.



Was ist gut an der automatischen Abhängigkeitsregistrierung?



Und was ist wirklich gut? Ich schlage vor, in den Kommentaren zu diskutieren, warum diese Methode an Popularität gewonnen hat. Sicher hat er Fans unter seinen Lesern.



All Articles