© saicle/Shutterstock.com
Mit Dependency Injection Klassenabhängigkeiten kontrollieren

In and out of Control


Symfony2 ist vor Kurzem erschienen, die Flow3-Version 1.0 ist auf dem Markt und das Zend Framework 2 steht ebenfalls in den Startlöchern. Sie alle haben eine Gemeinsamkeit: Sie bringen einen Dependency-Injection-Container mit, um Testbarkeit zu erhöhen und Komplexität zu minimieren. Was genau hinter diesem Muster steckt und wie man es anwenden kann, erläutert dieser Artikel.

Ein guter Softwareentwickler macht es sich zur Aufgabe, implizite Abhängigkeiten in seinen Projekten zu minimieren. Das liegt daran, dass die Anzahl der abhängigen Klassen linear zum Testaufwand steht. Steht man Qualität und Stabilität seiner Applikation eher gleichgültig gegenüber, kann man seine Systeme weiterhin stark koppeln. Legt man jedoch Wert darauf, sollte man sich mit dem Dependency-Injection-Entwurfsmuster auseinandersetzen. In der Softwareentwicklung kommt man häufig an den Punkt, dass Klassen Abhängigkeiten zu anderen Klassen besitzen. In der klassischen Programmierung kümmert sich dabei jede Klasse selbst um ihre Abhängigkeiten und instanziiert benötigte Objekte oder nutzt Singletons in ihrem lokalen Kontrollfluss. Dass es sich bei diesem Vorgehen um ein potenzielles Problem handelt, veranschaulicht Listing 1. Diese oder ähnliche Zeilen Quellcode sind in jedem größeren Projekt zu finden. In einer Zeit, in der Testbarkeit noch keinen hohen Stellenwert im PHP-Umfeld hatte, war das eine gut funktionierende Lösung. Aus der Sicht der Qualitätssicherung sieht es aber ganz anders aus.

Listing 1

class A { private $db; public function __construct( ) { $this->db = new Db( ); } public function store( ) { $this->db->store($this->getData()); } ... } $a = new A();

Bei dem Versuch die Klasse A mit Unit Tests abzudecken, wird schnell klar, dass hier eine Abhängigkeit aufgebaut wurde, die nicht so einfach von außen aufzulösen oder zu ersetzen ist. Für diesen Fall bedeutet das konkret, dass jedes Mal, wenn Klasse A getestet werden soll, eine reale Datenbank benötigt wird. Das ist nicht sehr aufwendig und kostspielig, sondern eigentlich sogar unnötig: Dass die Anbindung funktioniert, wird eigentlich in den Unit Tets für die Datenbank verifiziert und nicht an dieser Stelle. Das scheint im Kontext einer kleinen Webanwendung noch akzeptabel, steigt jedoch die Komplexität der Anwendung, steigt auch der Aufwand des Testens entsprechend. Damit es unter Projektdruck dann nicht heißt, dass man ab sofort auf Tests verzichten muss, sollte man es gar nicht erst so weit kommen lassen und diese Abhä...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang