api-design für java-entwickler - jug-da.de · kai spichale, api-design demnächst im handel j §...

77
API-Design für Java-Entwickler Kai Spichale @kspichale 14.07.2016

Upload: others

Post on 13-Sep-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

API-Designfür Java-Entwickler

KaiSpichale@kspichale

14.07.2016

Page 2: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Demnächst im Handel J

§ Java-APIs§ RESTful HTTP, Web-APIs§ Messaging§ Skalierbarkeit§ API-Management

2

Page 3: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design3

Page 4: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design4

Client-Code

De-Facto-API

Potentielle API

Page 5: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design5

LesbarerClient-Code

Kompatible API,Geheimnisprinzip

Änderbarkeit

Page 6: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design6

impliziteObjekt-API

Page 7: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Für wen ist API-Design relevant?

7

Page 8: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

APIs sind allgegenwärtig!

8

Page 9: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Anti-Pattern:

API-Design aus Versehen

9

Page 10: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

API-Design ist eine Frage derPriorität!

10

Page 11: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design11

Page 12: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kommunikationsproblem bei Softwarewiederverwendung

Lösung: Kommunikation durch API§ APIs werden für Menschen geschrieben§ Perspektive ist beim API-Design entscheidend

12

?

Page 13: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Entwurf mit Benutzerperspektive

13

Page 14: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Empfohlene Vorgehensweise

Anwendungs-fälle

API schreibenFeedback

14

§ Klein mit den wichtigsten Anforderungen beginnen

§ API häufig schreiben,mit Beispielen entwerfen

§ Regelmäßiges Feedback

Page 15: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

§ Tests für Entwurf, Dokumentation und Kompatibilitätsprüfung nutzen

§ Consumer-driven Contract Testing

15

Empfohlene Vorgehensweise

Page 16: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Qualitätsmerkmale

16

Page 17: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design17

Page 18: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Entwurfsziele

§ Konsistent§ Intuitiv verständlich§ Dokumentiert§ Einprägsam und leicht zu lernen§ Lesbaren Code fördernd§ Minimal§ Stabil§ Einfach erweiterbar

18

Grundvoraussetzung:Nützlich und korrekt implementiert :-)

Page 19: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Konsistent

19

§ Konzeptionelle Integrität bedeutetkohärentes Designmit der Handschrift eines Architekten

Page 20: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Konsistent

java.util.zip.GZIPInputStreamjava.util.zip.ZipOutputStream

java.awt.TextField.setText();java.awt.Label.setText();javax.swing.AbstractButton.setText();java.awt.Button.setLabel();java.awt.Frame.setTitle();

20

Page 21: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Inkonsistent vs semantisch genau

arr = [1, 2, 3]

arr.length # => 3 arr.size # => 3arr.count # => 3

§ length: Anzahl der Elemente im Array in konstanter Zeit(unabhängig der Länge), z.B. String

§ size: z.B. Collections§ count: Aufruf typischerweise mit Parameter,

traversiert das Objekt und zählt die Matches

21

Page 22: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Intuitiv verständlich

§ Idealerweise ist Client-Code ohne Dokumentation verständlich

§ Vorwissen ausnutzen und bekannte Konzepte wiederverwenden

§ Starke Begriffe etablieren und diese konsequent wiederverwenden

22

Page 23: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Java Collection API

23

java.util.List java.util.Set

add add

addAll addAll

contains contains

containsAll containsAll

remove remove

removeAll removeAll

java.util.Map

put

putAll

containsKey, containsValue

-

remove

-

Page 24: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Dokumentiert

§ Gute Dokumentation ist unverzichtbar

24

Page 25: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Dokumentationsaufbau

25

Page 26: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Entwickler lernen und verstehen mit Beispielen

26

Page 27: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Einprägsam und leicht zu lernen

Einflussfaktoren> Konsistenz, Verständlichkeit und Dokumentation> Größe (Anzahl der Konzepte)> Vorwissen der Benutzer> Time to First Hello World

27

Page 28: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Führt zu leicht lesbaren Code

28

EntityManager em = ...;

CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery<Order> cq = builder

.createQuery(Order.class);

Root<Order> order = cq.from(Order.class);

order.join(Order_.positions);

cq.groupBy(order.get(Order_.id)).having(

builder.gt(builder.count(order), 1));

TypedQuery<Order> query = em.createQuery(cq);

List<Order> result = query.getResultList();

Page 29: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Führt zu leicht lesbaren Code

29

EntityManager em = ...;

List<Order> list = new JPAQuery(em)

.from(QOrder.order)

.where(order.positions.size().gt(1))

.list(order).getResults();

Page 30: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Schwer falsch zu benutzen

new java.util.Date(2016, 11, 17);

30

int year = 2016 – 1900;

int month = 11 - 1;

new java.util.Date(year, month, 17);

Page 31: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Minimal

§ Hinzugefügte Elemente können nachträglich nur schwer entfernt werden

§ Im Zweifel Elemente weglassen

§ Trade-off: Minimalität vs. Komfort§ Gut: java.util.List.removeAll()§ Schlecht: java.util.List.removeAllEven()

31

Page 32: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Minimal

§ Auslagerung in Hilfsklassen§ z.B.: java.util.Arrays, java.util.Collections

§ Nachteile:§ Performance und Nebenläufigkeit

(putIfAbsent() wäre in separater Hilfsklasse nicht threadsicher)§ Schlechter OO-Stil§ Hilfsklassen oft Sammelsuirum

32

Page 33: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Stabil

§ API-Änderungen sollten nur mit Sorgfalt durchgeführt werden

33

Client

API v1

Client Client

Vertrag

Page 34: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Open Closed Principle

§ Laut Bertrand Meyer sollen Module nicht verändert, sondern nur durch Vererbung erweitert werden (kein gutes OO-Design-Prinzip)

§ Refactorings sind einfach, falls die Änderungen nur die eigene Codebasis betreffen

§ Bessere Idee von Martin Fowler: Published Interface(http://martinfowler.com/ieeeSoftware/published.pdf)

34

Page 35: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Einfach erweiterbar

§ Welche Änderungen wird es in Zukunft geben?

§ Erweiterung idealerweise abwärtskompatibel, sonst neue API-Version notwendig

§ Anpassungsaufwand für Clients minimieren

35

Page 36: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Abwärtskompatibilität

36

Page 37: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kompatibilität

§ Trade-off: Abwärtskompatibilität vs. Flexibilität

§ Code-Kompatibilität§ Schwächste Form der Kompatibilität§ Konflikte beim Entfernen und Verändern von API-Elementen

§ Konflikte eventuell bei Vererbung

37

Page 38: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kompatibilität

38

/*** @since 1.0*/

class ApiBaseClass {}

class MyOwnClass extends ApiBaseClass {List<ResultItem> getResults() {

...}

}

Page 39: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kompatibilität

39

class ApiBaseClass {/*** @since 1.1*/

List<String> getResults() {...

}}

class MyOwnClass extends ApiBaseClass {List<ResultItem> getResults() {

...}

}

Page 40: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kompatibilität

§ Binär-kompatibel: Programm kann neue Version ohne erneute Kompilierung verwenden

§ Beispiel:> Kompilieren mit log4j 1.2.15> Linken gegen log4j 1.2.17

§ Grundvoraussetzung: Dynamisches Linken> Einsprungadresse von virtuellen Methoden wird zur Laufzeit

bestimmt

40

Page 41: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Funktionale Kompatibilität

41

Erwartetes Verhalten Tatsächliches Verhalten Tatsächliches Verhaltender neuen Version

Bekannt als Amöben-Effekt (Jaroslav Tulach)

§ Version kann gelinkt werden und erfüllt ihre erwartete Funktion

Page 42: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Wie wird Kompatibilität sichergestellt?

42

Page 43: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Versionierte Regressionstests

§ Offizielles (dokumentiertes) API-Verhalten muss getestet werden

§ Automatisierte Tests stellen Verhaltenskompatibilität sicher§ Niemals vollständig, Erweiterungen nach Rücksprache mit

Clients

Was gehört zu API ?com.company.foo.api

com.company.foo.internal

43

Page 44: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Umgang mit inkompatiblenÄnderungen

44

Page 45: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design45

public interface FinanceService {/*** Returns brutto sum.* @since 1.0*/

int getSum();}

API in Version 1.0

Page 46: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design46

public interface FinanceService {/*** Returns brutto sum.* @since 1.0*/

int getSum();}

API in Version 1.0

Page 47: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design47

public interface FinanceService {/*** Returns netto sum.* @since 1.0 // 1.1 ?*/

int getSum();}

API in Version 1.1 mit semantischer Änderung

Page 48: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design48

Semantische und syntaktische Änderungen verbinden

public interface FinanceService {/*** Returns netto sum.* @since 1.1*/

int getNettoSum();}

API in Version 1.1

Page 49: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design49

Rückwärtskompatibilität beachten

public interface FinanceService {/*** Returns brutto sum.* @since 1.0*/

int getSum();

/*** Returns netto sum.* @since 1.1*/

int getNettoSum();}

API in Version 1.1

Page 50: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design50

public interface FinanceService {/*** Returns brutto sum.* @since 1.0* @deprecated As of version 1.1 for* API improvements, use* {@link #getBruttoSum()* instead. Will be removed in* version 1.2.*/

@Deprecated int getSum();

/*** Returns brutto sum.* @since 1.1*/

int getBruttoSum();}

Page 51: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Design-Repertoire

51

Page 52: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Erzeugungsmuster

§ Factories und Builder statt Konstruktoren

entityManager.createNamedQuery(queryName).getResultList();

CalculatePriceCommand.new(order).run();

Vorteil§ Verwendung unterschiedlicher Subtypen§ Erzeugung komplexer Objekte vereinfachen§ Keine Konstruktoren mit vielen Parametern

52

Page 53: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Effective Java 2nd Edition

53

► Static Factory, statt Konstruktoren nutzen

Page 54: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Alternative: Class Clusters

54

Page 55: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Beispiel: Class Clusterpublic class Widget {

private Widget body;

public Widget(Params p) {

if (p.featureToggle().enabled()) {body = new WidgetA();

} else {body = new WidgetB();

}

}

public void performAction() {

body.performAction(); }

}

}

55

Page 56: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Fluent Interface

§ Interne DSL zur Verbesserung der Lesbarkeit des Quellcodes

§ Umsetzung mit:§ Methodenketten§ (und Methodenschachtelung)

56

Page 57: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Fluent Interface (Beispiel)

Grammar ::= 'assertThatString' '('[a-z]+')'( 'notNull'| 'isLowerCase'| 'startsWith' '('[a-z]+')'| 'endsWith' '('[a-z]+')'

)+

57

Page 58: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Fluent Interface (Beispiel)

58

Page 59: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Fluent Interface (Beispiel)

// ohne Fluent InterfaceassertNotNull(text);assertTrue(text.startsWith("a"));assertTrue(text.endsWith("z"));assertTrue(text.isLowerCase());

// mit Fluent InterfaceassertThatString(text)

.notNull()

.startsWith("a")

.endsWith("z")

.isLowerCase();

59

Page 60: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Vererbung

Kontroverse Ansätze:> Open Inheritance> Designed Inheritance

Standardmäßig alle konkreten Klassen final machen> Vererbung verletzt Datenkapselung> Klassen müssen speziell für Vererbung entworfen werden> Für Wiederverwendung Kompositionen nutzen

Beispiele:> Richtig: Set extends Collection> Falsch: Stack extends List

60

Page 61: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Template-Methode

abstract class OrderSorter {

public void sort(List<Order> orders) {

if(compare(o1, o2)) {

}

abstract compare(Order o1, Order o2);

}

61

Page 62: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Service Provider Interfaces (SPI) von der sonstigen API trennen

62

Page 63: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Template-Methode

public class OrderSorter {

private final Comparator<? super Order> comp;

public OrderSorter(Comparator<? super Order> comp) {

this.comp = comp;

}

public void sort(List<Order> orders) {

Collections.sort(orders, comp);

}

}

63

Page 64: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kontextobjekt als Parameter für SPI

§ Schlechter Stil:public interface MyServiceProviderInterface {

void callbackMethod(String param);

}

§ Besser:public interface ServiceProviderInterface {

void callbackMethod(Context param);

}

public class Context {

String message();

Integer id();

}64

Page 65: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Interface-Evolution

§ Hinzufügen einer neuen abstrakten Methode war vor Java 8 eine inkompatible Änderung

interface NewInterface extends OldInterface {void newMethod();

}

§ Ab Java 8 Default-Methoden§ Bevorzuge Klassen vor Interfaces

65

Page 66: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Checked Exceptions

void submit( Abstract abstract )throws IOException {

...}

66

Falsches Abstraktionsniveau

Page 67: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Checked Exceptions

void submit( Abstract abstract )throws TooLongAbstractException {

...}

67

Kann diese Ausnahmesituation im „korrekten“ Programm

auftreten?

Kann sich ein Client davon erholen?

Page 68: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Anwendungsfälle fürChecked Exceptions sind selten

(konservative Formulierung :-)

68

Page 69: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Unchecked Exceptions

void submit( Abstract abstract ) {if( abstract == null ) {

throw new NullPointerException("abstract must not be null.");

}....

}

69

Gehört eine UncheckedException zur API?

Page 70: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Unchecked Exceptions

/*** * @throws NullPointerException* if abstract is null*/

void submit( Abstract abstract ) {if( abstract == null ) {

throw new NullPointerException("abstract must not be null.");

}....

}

70

Dokumentiere alleExceptions, die von

einer Methodegeworfen werden

(Vorbedingungen).

Page 71: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Invarianten und Bedingungen

§ Klassen sind selbst für die Einhaltung ihrer Invariantenverantwortlich (nicht Client)

§ Klassen sollten ihre Vorbedingungen möglichst gut überprüfen

§ Nachbedingungen werden mit Tests überprüft

71

Page 72: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Immutability / Minimale Änderbarkeit

§ Klassen, die public und konkret sind, sollten standardmäßig final und immutable sein

Vorteile:> Thread-safe> Wiederverwendbar> Einfach

Nachteile:> Separates Objekt für jeden Wert

§ Falls änderbar, dann sollte Zustandsraum klein sein

72

Page 73: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Sinnvolle Defaults

§ Vermeidung von Boilerplate-Code§ Geringe Einstiegshürden und Unterstützung für Neueinsteiger

§ Defaults müssen dokumentiert sein§ Boolean sind standardmäßig false (entsprechende Namen

wählen)

// Tests werden standardmäßig ausgeführt

// skipTests=false

73

Page 74: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Globaler Zustand / Konfiguration

Globaler Zustand ist problematisch weil:> Schwer testbar, nicht flexibel> Fehleranfällig, schwer verständlich

Empfehlung:> Sei funktional, vermeide Zustand> Einbindung einer Bibliothek sollte keine Änderungen des globalen

Zustand notwendig machen> Falls doch, dann ist es eine Applikation und keine Bibliothek

Beispiel:> Log4j wird beim Laden automatisch konfiguriert> Unterschiedliche Konfigurationen für Log4j in einem Prozess nicht

möglich

74

Page 75: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Bedeutung von Typen & Namen

String findAddress( String userId );Address foo( UserId blah );

75

Namen sind wie Kommentare (nützlich, aber schnell veraltet)

Typen sindaussagekräftiger und

verlässlicher als Namenund Kommentare

Page 76: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Bedeutung von Typen

Mit Typen Dokumentieren

int compare( Object o1 );

Result compare( Object o1 );

enum Result {LESS_THEN,EQUAL,GREATER_THEN;

}

76

Gibt -1, 0 oder 1 zurück

Rückagebtypen und Argumente mitbenannten Alternativen

einschränken

Page 77: API-Design für Java-Entwickler - jug-da.de · Kai Spichale, API-Design Demnächst im Handel J § Java-APIs § RESTful HTTP, Web-APIs § Messaging § Skalierbarkeit § API-Management

Kai Spichale, API-Design

Kai Spichale@kspichalehttp://spichale.blogspot.de/https://www.xing.com/profile/Kai_Spichale

77