dependency injection
Post on 09-Apr-2017
738 Views
Preview:
TRANSCRIPT
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
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()); ... }
}
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 Objektgraphen4 Gruppiert nach den Lebenszeiten der Objekte
4 möglich durch:
4 Dependency Injection Framworks
4 Assembler-Klassen selber bauen
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 });
Zum Schluss der ganze Rest4 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
Quellen4 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"
top related