Frage

Gibt es eine Kehrseite?Ich fühle mich jetzt fast abhängig davon.Immer wenn ein Projekt eine bestimmte Größe überschreitet, verspüren Sie fast eine allergische Reaktion auf Standardmuster und vernetzen es sofort mit einem Dependency-Injection-Framework neu.

Das größte Problem, das ich gefunden habe, ist, dass es für andere Entwickler, die es gerade erst lernen, verwirrend sein kann.

Außerdem würde es mir viel besser gehen, wenn es Teil der Sprache wäre, die ich verwende.Zumindest für Java gibt es jedoch ein paar sehr einfache Bibliotheken, die recht gut sind.

Gedanken?Schlechte erfahrungen?Oder einfach aufhören, sich darüber Sorgen zu machen?


[BEARBEITEN] Betreff:Beschreibung der Abhängigkeitsinjektion selbst

Tut mir leid, dass ich vage bin. Martin Fowler Beschreibt es wahrscheinlich VIEL besser, als ich es jemals könnte ...Sie müssen sich keine Mühe geben.

Zufälligerweise bestätigt dies einen Punkt: Es ist immer noch nicht weit verbreitet und könnte bei der Arbeit mit Teams ein Hindernis darstellen, wenn nicht alle damit vertraut sind.

War es hilfreich?

Lösung

Ich habe versucht, einige der möglichen Nachteile in einem Blogbeitrag hier zu beschreiben: http://kevin-berridge.blogspot.com/2008/06/ioc-and-di-complexity.html

Andere Tipps

Das Problem, das ich mit DI habe, ist das gleiche Problem wie mit COM und mit jedem Code, der etwa so aussieht:

i = GetServiceOrInterfaceOrObject(...)

Das Problem besteht darin, dass ein solches System nicht aus dem Code verstanden werden kann.Es muss irgendwo [anders] eine Dokumentation geben, die definiert, welcher Dienst/welche Schnittstelle/welches Objekt von Dienst/Schnittstelle/Objekt X angefordert werden kann.Diese Dokumentation muss nicht nur gepflegt, sondern ebenso leicht verfügbar sein wie die Quelle.

Sofern das Dokument nicht sehr gut geschrieben ist, ist es oft immer noch nicht einfach, die Beziehungen zwischen Objekten zu erkennen.Manchmal sind Beziehungen zeitlich begrenzt, was es noch schwieriger macht, sie zu entdecken.

Mir gefällt das KISS-Prinzip und ich bin fest davon überzeugt, dass man das richtige Werkzeug für die jeweilige Aufgabe verwenden muss.Wenn der Nutzen von DI für ein bestimmtes Projekt größer ist als die Notwendigkeit, verständlichen Code zu schreiben, dann verwenden Sie es.

Außerdem würde ich mich viel besser fühlen, wenn es ein Teil der Sprache wäre, die ich benutzte.

Zu Ihrer Information, es gibt eine sehr einfache und funktionale Abhängigkeitsinjektion als Teil von JDK 6.Wenn Sie eine leichte, unkomplizierte Abhängigkeitsinjektion benötigen, dann verwenden Sie sie.

Benutzen ServiceLoader Klasse können Sie einen Dienst (oder viele Implementierungen des Dienstes) basierend auf einer Klasse anfordern:

 package dependecyinjection;  
 import java.util.ServiceLoader;  

 public abstract class FooService {  

     public static FooService getService() {  
         ServiceLoader<FooService> loader = ServiceLoader.load(FooService.class);  

         for (FooService service : loader) {  
             return provider;  
         }  

         throw new Exception ("No service");  
     }  

     public abstract int fooOperation();  

 }  

 package dependecyinjection;  
 public class FooImpl extends FooService {  
     @Override  
     public int fooOperation() {  
         return 2;  
     }  
 }  

Wie definiert ServiceLoader die zurückgegebenen Dienstimplementierungen?

Erstellen Sie in Ihrem Projektordner einen Ordner mit dem Namen META-INF/Dienste und erstellen Sie eine Datei mit dem Namen dependencyinjection.FooService.Diese Datei enthält eine Zeile, die auf die Dienstimplementierung verweist.In diesem Fall:dependecyinjection.FooImpl

Dies ist noch nicht allgemein bekannt.

Ich bin ein großer Anhänger von IO, habe jedoch einige Projekte mit riesigen XML-Konfigurationsdateien gesehen, die niemand versteht.Seien Sie also vorsichtig bei der Programmierung in XML.

Meiner Meinung nach sind die größten Nachteile die Lernkurve (wie Sie betonen) und die Möglichkeit, dass die zusätzliche Abstraktion das Debuggen erschwert (was eigentlich auch Teil der Lernkurve ist).

Meiner Meinung nach ist DI eher für größere, komplexe Systeme geeignet – bei kleinen, einmaligen Apps kann es dazu führen, dass die App überarchitektoniert ist, was im Grunde genommen mehr Entwicklungszeit in Anspruch nimmt als die Architektur kann den Wert, den es bietet, jemals wettmachen.

Hör einfach auf, dir darüber Sorgen zu machen.Ich bin der Meinung, dass IoC-Techniken mit der Zeit für die meisten Entwickler selbstverständlich sein werden.Ich versuche, den Entwicklern hier bei der Arbeit etwas darüber beizubringen, und es fällt mir schwer, die Botschaft zu vermitteln, weil es sich für die Art und Weise, wie wir Dinge immer gemacht haben, so unnatürlich anfühlt.was zufälligerweise der falsche Weg war.Außerdem haben es Entwickler, die sowohl neu bei IoC als auch neu bei einem Projekt sind, meiner Meinung nach noch schwerer.Sie sind es gewohnt, mit der IDE die Spur von Abhängigkeiten zu verfolgen, um zu verstehen, wie das Ganze „zusammenhängt“.Diese Informationen werden oft in geheimnisvolles XML geschrieben.

Könnten Sie für diejenigen von uns, die zu Hause mitspielen, ein oder zwei Links hinzufügen, um zu erklären, was Dependency Injection eigentlich ist?Der Wikipedia-Artikel ist unterhaltsam, aber nicht sehr aufschlussreich.

Der einzige Nachteil, der mir einfällt, ist ein geringfügiger Leistungsabfall durch ständige virtuelle Anrufe :)

@Blorgbeard: http://www.martinfowler.com/articles/injection.html ist wahrscheinlich einer der besten Artikel zu diesem Thema

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top