Abhängigkeitsinjektionsframeworks wie Google Guice geben die folgende Motivation für ihre Verwendung ( Quelle ):
Um ein Objekt zu erstellen, erstellen Sie zuerst seine Abhängigkeiten. Aber um jede Abhängigkeit aufzubauen, benötigen Sie ihre Abhängigkeiten und so weiter. Wenn Sie also ein Objekt erstellen, müssen Sie wirklich ein Objektdiagramm erstellen.
Das Erstellen von Objektdiagrammen von Hand ist arbeitsintensiv (...) und erschwert das Testen.
Aber dieses Argument kaufe ich mir nicht: Selbst ohne ein Framework für die Abhängigkeitsinjektion kann ich Klassen schreiben, die einfach zu instanziieren und bequem zu testen sind. Das Beispiel auf der Guice-Motivationsseite könnte beispielsweise folgendermaßen umgeschrieben werden:
class BillingService
{
private final CreditCardProcessor processor;
private final TransactionLog transactionLog;
// constructor for tests, taking all collaborators as parameters
BillingService(CreditCardProcessor processor, TransactionLog transactionLog)
{
this.processor = processor;
this.transactionLog = transactionLog;
}
// constructor for production, calling the (productive) constructors of the collaborators
public BillingService()
{
this(new PaypalCreditCardProcessor(), new DatabaseTransactionLog());
}
public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard)
{
...
}
}
Es kann also andere Argumente für Abhängigkeitsinjektions-Frameworks geben ( die für diese Frage nicht in Frage kommen !), Aber die einfache Erstellung testbarer Objektgraphen ist keines davon, oder?
new ShippingService()
.