29
Dependency Injection Unser Code soll schöner wer den

Dependency Injection

  • Upload
    hybr1s

  • View
    737

  • Download
    0

Embed Size (px)

Citation preview

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"