Rolf B: Perl & LWP::UserAgent & Cookie setzen

Beitrag lesen

Hallo pl,

eins hast Du erreicht: Ich weiß nicht mehr, ob ich zu dumm bin um dir zu folgen, oder ob Du einfach Themenwiesel spielst und bewusst kreuz und quer hüpfst.

Also: Doch, es geht bei DI gerade darum, Abhängigkeiten zu anderen Klassen nicht innerhalb einer Klasse herzustellen. Maximale Entkoppelung ist nicht nur eine Modeerscheinung, die von irgendwelchen geldgeilen Anzugträgern als neues Paradigma verkauft wird. Die ganze Entwicklung der Programmiertechnik läuft darauf hinaus, immer stärker abstrahieren zu können und feste Abhängigkeiten aufzulösen. Nur so kann ich nach Bedarf unterschiedliche Implementierungen eines Interface bereitstellen. Das brauche ich, um die Klasse in unterschiedlichen Kontexten einsetzen zu können. Zum Beispiel weil irgendein Stück Code abhängig vom verwendeten Webserver oder Betriebssystem ist. Dann verberge ich diese Plattformspezialität hinter einem Interface und gebe ich dem Request-Worker eine pro Plattform passende Implementierung mit. Oder ich will unittesten, dann gibt's einen Mock.

Oder ich will nicht, dass eine bestimmte Komponente initialisiert wird, bevor ich sie tatsächlich nutze. Dann injiziere ich meiner Klasse einen generischen LazyInitializer. Die Klasse muss dann in den meisten Sprachen wissen, dass sie einen LazyInitializer bekommt, und wenn die fragliche Komponente gebraucht wird, ruft sie auf dem getComponent() oder getValue() oder wie auch immer man das nennt auf[1]. Und der LazyInitializer erzeugt dann einmalig die Komponente und cached die Instanz. In .net, mit der Unity DI Library, kann Unity das automatisch. Es ist aber auch nicht so schwierig, das von Hand zu bauen (solange man keine Multithreading-Themen hat, die können tricky sein) :). Ich baue aber KEINESFALLS den LazyInitializer direkt in meine Klasse ein.

Rolf


  1. Ich kenne Perl nicht, aber vermutlich gelingt da mit bless der gleiche Trick wie ich es in den 90ern in Smalltalk erlebt habe: Der LazyInitializer tut so, als wäre er das eigentliche Objekt, aber beim ersten Zugriff auf Properties oder Methoden beschafft er es und verwandelt sich dann in das Objekt (re-bless). Dummerweise auch dann, wenn man das Ding mit dem Debugger betrachten will. Irgendwie cool, aber trotzdem brrr... ↩︎