Ein Beispiel für eine einfache Ruby on Rails-Anwendung. Es erstellt ein Logger
Objekt während des Ladevorgangs der Anwendung:
# in environment.rb
config.logger = Logger.new(<STDOUT | file | whatever>)
# and in our application we use this object
logger.warn "This process is taking too long to process. Optimization needed."
Meine Frage ist, warum wir nicht Klassenmethoden (oder statische Methoden) für die Protokollierung verwenden? Wird nicht Logger.warn
skalieren als Logger.new.warn
? Oder zumindest Logger.warn
scheint intuitiv als Logger.new.warn
.
Logger.new
Welche Vorteile bietet ein einzelnes Objekt, selbst wenn es sich um ein einzelnes Objekt handelt?
quelle
Logger.new ist eine Factory, in der das Ergebnis verwendet wird (Name der Klasse / Datei).
In den Konfigurationsdateien können Sie dann entscheiden, welche Ebene protokolliert werden soll, um Teile des Programms überhaupt nicht zu protokollieren, ohne das Projekt neu kompilieren zu müssen.
Auf diese Weise können Sie alle Protokollierungen (Fehler) außer der Protokollierung auf hoher Ebene für Release-Builds deaktivieren und nur die niedrigste Ebene für die zu debuggenden Teile aktivieren.
quelle
Der statische Methodenaufruf sollte nach Möglichkeit vermieden werden. Es ist eine veraltete Alternative zu Dependency Injection und in einer größeren Codebasis nicht hilfreich.
Betrachten Sie zum Beispiel die Testbarkeit. Durch das statische Aufrufen der Protokollierung wird der Prüfling unter Kontrolle gebracht, welche Protokollierungsklasse verwendet wird - es gibt keine Umkehrung der Kontrolle. Es gibt hier keine Möglichkeit, einen Scheingegenstand oder irgendeine Art von Fälschung zu injizieren. Wenn Sie den Logger in das SUT injizieren, haben Sie die Möglichkeit, den Logger zu verspotten und zu injizieren.
Die Vorteile der Verwendung von DI gegenüber der Art des in Rede stehenden statischen Methodenaufrufs gehen natürlich auch über die Testbarkeit hinaus. Überlegen Sie, was passieren würde, wenn Sie zwei verschiedene Logger in Ihrem System haben möchten, und die Option, das Anwendungsverhalten allein durch Konfiguration des Objektdiagramms zu ändern, ohne den vorhandenen Code zu bearbeiten.
Insgesamt würde ich vorschlagen, dass Sie einen DI-Ansatz versuchen, damit Sie Ihren Code später nicht als nicht testbar und unhandlich empfinden.
quelle