2016-04-26 6 views
0

Ich habe einen Code, der Enge Kopplung & DI Schwelle

class A 
{ 
    public $b, $c; 

    //Inject D and E here? (B $b, C $c, D $d, E $e, ...) 
    public function __construct(B $b, C $c) 
    { 
     $this->b = $b; 
     $this->c = $c; 
    } 

    public function main() 
    { 
     if (rand(0,1)) { 
      new D(); 
     } else { 
      new E(); 
     } 
    } 
} 

Sollte ich die möglichen D und E Klassen in Konstruktor A wie

geht spritzen? Das Problem hierbei ist, dass die Hierarchie des Projekts dieser baumähnlichen Struktur folgt, wodurch der obere Knoten A alle Abhängigkeiten seiner untergeordneten Knoten enthält. Oder ist es vernünftig genug, irgendwann einmal stupid zu sein?

Antwort

1

Dies hängt davon ab, was D und E tatsächlich sind. Wenn es nur einfache Datenobjekte sind, wird es Ihnen gut gehen. Wenn sie zum Beispiel den Datenbankzugriff abstrahieren, ist es besser, sie zu injizieren.

Als Faustregel gilt: Wenn Sie einen Komponententest (zum Beispiel mit phpUnit) schreiben können, der auf jedem System funktioniert (also nicht nur Ihre lokale Entwicklungsumgebung), dann ist die Kopplung nicht so streng und Ihnen wird nichts passieren so wie du es gerade machst.

Wenn andererseits ein solcher Komponententest fehlschlägt, weil eine Ressource fehlt (z. B. eine Datenbankverbindung), die eine der Abhängigkeiten benötigt, sollten Sie diesen Dienst injizieren. Dann können Sie ein Testobjekt für den Test erstellen und es wird erneut ausgeführt.