Zitat von knotenpunkt
Beitrag anzeigen
Der Ablauf sieht in etwa so aus, wie du es beschreibst. Mit ein paar Abweichungen im Detail. Die Injektion erfolg nicht nach der Instanziierung, sondern während der Instanziierung (Constructor-Injection / Autowiring).
Autowiring funktioniert ein wenig wie Autoloading, mit dem Unterschied, dass ich nicht Zugriff auf Klassen bekomme, ohne sie explizit zu importieren, sondern fertig instanziierte Objekte bekomme, ohne was dafür tun zu müssen.
Lass mal die Perspektive wechseln. Wenn du in der prozeduralen Welt unterwegs bist, dann wirst du immer das Problem haben, State rumzureichen. Nehmen wir einfach mal einen Webshop. Da werden bestimmte Informationen im Bootstrap gesammelt:
- Ist der User eingeloggt?
- Hat der eingeloggte User irgendwelche speziellen Rabatte auf Produkte?
- Kann der eingeloggte User Elemente auf der Seite sehen, die andere User nicht sehen können?
- Oder: Kann der eingeloggt User Elemente auf der Seite nicht sehen...
- Was ist die aktuell ausgewählte Sprache?
- Befinden sich Elemente im Warenkorb?
- Haben die im Warenkorb befindlichen Elemente eine Auswirkung auf andere Elemente auf der Seite?
- Versandkostenfreie Artikel machen ggf. alles Versandkostenfrei, weil sie die Versandkosten schon finanzieren)
- Rabatte, die dadurch aktiviert werden, dass man Produkt X mit Produkt Y zusammen kaufen kann
- Haben die im Warenkorb befindlichen Elemente eine Auswirkung auf andere Elemente auf der Seite?
Mit DI ist das recht simpel. Du hast eine Klasse, die in ihrem Konstruktor andere Klassen erwartet. Die Objekte, die Methoden dieses Klassenobjekts aufrufen, wissen nicht, welche Hilfsmittel dieses Objekt benötigt, um seine Aufgabe zu erfüllen. In der Funktionalen Welt kann man das zum Teil durch Currying oder Monaden abbilden. Bei traditioneller prozeduraler Programmierung kannst du das so nicht abbilden. Da musst du möglichst flache Hierarchien schaffen, um nicht zu viel State durch Prozeduren zu schleifen, die diesen State selbst gar nicht benötigen. Oder du musst mit globalen Informationen arbeiten, was automatisiertes Testen extrem schwierig macht. Ich bilde zum Teil sogar scalare Werte in Form von Klassen ab, die dann dank Autowiring den Klassen zur Verfügung gestellt werden, die diese Werte benötigen.
Und ich kann in Objekten Informationen cachen. Ich muss ja nur einmal am Anfang die benötigten Informationen abfragen. In folgenden Calls werden diese Informationen bereits in den Objektinstanzen vorgehalten. Die Architektur ist simpel - ich muss die Informationen immer nur da einbinden, wo ich sie wirklich brauche. Wenn ich irgendwann das State-Modell meiner Applikation anpassen will, kann ich ggf. sogar Teile der Anwendung noch auf einem alten Modell weiterlaufen lassen und baue dann - wenn notwendig - Wrapper-Klassen, die mit das alte State-Modell in ein neues übersetzen.
Kommentar