Dependency Injection
Unser Code soll schöner werden
Dieser Vortrag kann
Spuren von Java enthalten!
Wayne interessierts?
Schöner = Modularer
Designprinzip
Globale Variablen sind
schlecht. Singletons sind
globale Variablen.
Global Mutable State
Karl und die Kreditkarte
Karl
Kreditkarte: Testbarkeit
CreditCard cc;
cc = new CreditCard("12345678901234");
cc.charge(100);
Karl hat Angst um sein Geld.
Kreditkarte: Fehler 1
CreditCard cc;
cc = new CreditCard("12345678901234");
cc.charge(100);
java.lang.NullPointerException at CreditCard.java:42
Karl fragt lieber mal einen Kollegen.
Kreditkarte: Fehler 2
CreditCardProcessor.init(...);
CreditCard cc;
cc = new CreditCard("12345678901234");
cc.charge(100);
java.lang.NullPointerException at CreditCardProcessor.java:146
Karl fragt lieber noch mal einen Kollegen.
Kreditkarte: Fehler 3
OfflineQueue.start();
CreditCardProcessor.init(...);
CreditCard cc;
cc = new CreditCard("12345678901234");
cc.charge(100);
java.lang.NullPointerException at OfflineQueue.java:22
Karl traut sich nicht noch mal zu fragen und liest den
Code von OfflineQueue duch.
Kreditkarte: Die API lügt
Database.connect(...);
OfflineQueue.start();
CreditCardProcessor.init(...);
CreditCard cc;
cc = new CreditCard("12345678901234");
cc.charge(100);
Kreditkarte: Globaler Zustand
Database.connect(...);
OfflineQueue.start();
CreditCardProcessor.init(...);
CreditCard cc;
cc = new CreditCard("12345678901234");
System.out.println(cc.balance); // 100
UserManager.update();
System.out.println(cc.balance); // 120
Karl versucht
weniger Singletons
zu verwenden
Anderswo im Code
class OrderProcessor {
private CreditCardProcessor ccp;
public void OrderProcesser(CreditCardProcessor ccp){
this.ccp = ccp;
}
public void process(Order order){
CreditCard cc = new CreditCard(order.creditCardNumber, this.ccp);
cc.charge(order.sum());
...
}
}
Aufbau des Graphen vs.
Geschäftslogik
Dependency Injection
class Main {
public static void main(String[] args){
Database db = new Database();
OfflineQueue oq = new OfflineQueue(db);
CreditCardProcessor cpp = new CreditCardProcessor(oq);
CreditCard cc = new CreditCard("12345678901234", ccp);
}
}
Schrittweiser Aufbau des
Objektgraphen
4 Gruppiert nach den Lebenszeiten der Objekte
4 möglich durch:
4 Dependency Injection Framworks
4 Assembler-Klassen selber bauen
Don't call us, we call you!
Inversion of Control
console.log("test") // kein IoC
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('hello world'); // IoC
});
Beispiel IoC Allgemein
Dependency Injection ist
Inversion of Control beim
Aufbau des Objektgraphen
Zum Schluss der ganze Rest
4 Dependency Injection != Dependency Inversion
4 DI-Arten
4 Constructor Injection FTW
4 Setter Injection (manchmal unvermeidbar)
4 Interface Injection (machen manche DI-Container,
eher meiden)
4 Service Locator aka. Context
Quellen
4 Vorträge: Google Clean Code Talks (Youtube Playlist)
4 Artikel: Martin Fowler - "Inversion of Control
Containers and the Dependency Injection pattern"
4 Buch: Robert C. Martin - "Clean Code"

Dependency Injection