Dependency Injection

29
Dependency Injection Unser Code soll schöner wer den

Transcript of Dependency Injection

Dependency InjectionUnser 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 Objektgraphen4 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 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"