event-getriebene programmierung in der praxis - … programmierung in der praxis ... domain driven...

58
Event-getriebene Programmierung in der Praxis Dipl.-Inf. (FH) Marco Emrich Oct. 2014 @ XP-Days

Upload: buinhi

Post on 17-May-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Event-getriebene Programmierung in der PraxisDipl.-Inf. (FH) Marco Emrich Oct. 2014 @ XP-Days

Page 2: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Wo?Wozu?Wer?

Page 3: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

GUIhttps://www.flickr.com/photos/joris/2410290034

Page 4: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://www.flickr.com/photos/11319126@N00/8270409318/in/photostream

Page 5: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Architektur

Page 6: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Evented-SOA

Page 7: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Microservices

http://martinfowler.com/articles/microservices.html

Page 8: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

GenerallesProgrammier-Modell

Page 9: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Method vs.

Event https://www.flickr.com/photos/gen/325927418

Page 10: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Sender ReceiverMessage

Method Call

Page 11: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Sender ReceiverListen

Raise Event

Event

Page 12: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Sender

ReceiverListen

Event

Raise Event Receiver

Listen

Receiver

Listen

Page 13: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://www.flickr.com/photos/caroslines/547184477

Wiring

Page 14: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Sender

Receiver

Listen

Raise Event

Receiver

Listen

Receiver

Listen

Event-BUS

Pub/Sub

Page 15: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Sender

Receiver

Listen

EventRaise Event

Receiver

Listen

ReceiverListen

Sender

Raise Event

Page 16: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Event vs. Method

Method

Sender tells Receiver

Sync

Fixed Coupling

New Receiver: change to Sender

Event

Receiver listens to Sender

(Pseudo-) Async

Loose Coupling

New Receiver: no change to Sender

Sometimes: Hard to Test/Debug

Page 17: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Testing?

Page 18: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Isolationhttps://www.flickr.com/photos/loufi/3500076/

Page 19: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Winner?https://www.flickr.com/photos/48424574@N07/5096035675

Page 20: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Domain Driven Design

Page 21: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

Page 22: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Vaughn Vernon

Alistair Cokburn

Page 23: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

DomainModel

Page 24: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Adapter

Page 25: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

Page 26: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

GUI

Page 27: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

GUI

Events

Events

Events

Events

Page 28: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

CQRSEven Sourcing

Page 29: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Domain Eventsvs.

Commandshttps://www.flickr.com/photos/stevedave/3566325269

Page 30: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Event Storming

Page 31: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

We want you for Kata

Page 32: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Code Retreat

Page 33: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Practice

Page 34: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

http://udoncrew.deviantart.com/art/UFS-Impossible-Contortion-109860059

Try Extremes

Page 35: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

TDD

Pair-Programming

Page 36: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

2 x 35 min

+ Retrospective

Page 37: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Callcenter Kata

Page 38: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

0911/123499040/456780171/3456789….

Phone Number / Caller ID

Page 39: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

0911/123499040/456780171/3456789….

Phone Number / Caller ID

0911 Nürnberg

040 Hamburg

0911/123499….

040/45678….

Page 40: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

0911/123499040/456780171/3456789….

Phone Number / Caller ID

0911 Nürnberg

0911/123499….

040/45678….

Statistik

040 Hamburg

Page 41: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Constraints

no Method-communication, Events only

Page 42: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Constraints

no Method-communication, Events only

Small Classes (SRP) max. 20-30 LOC / (Java: 50) max. 5 Methods

Page 43: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

http://nodejs.org/api/events.html#events_emitter_addlistener_event_listener

JavaScript / Node.JS

Page 44: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://github.com/asyncly/EventEmitter2

JavaScript / Browser

Page 45: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

JavaScript / Node.JS

var EventEmitter = require('events').EventEmitter

var PhoneNumberGenerator = function(numbers) { this.numbers = numbers; this.currentNumber = 0;};

PhoneNumberGenerator.prototype = new EventEmitter();

PhoneNumberGenerator.prototype.sendNextNumber = function() { this.emit('NewPhoneNumberCreated', this.numbers[this.currentNumber]);}

Page 46: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

var sleep = require('sleep');

PhoneNumberGenerator.prototype.start = function() { while(1) { sleep.sleep(n); this.sendNextNumber(); }}

JavaScript / Node.JS

Page 47: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

JavaScript / Node.JSdescribe('PhoneNumberGenerator', function() { it('should emit numbers', function(done) { var generator = new PhoneNumberGenerator(['012345678']); generator.on('NewPhoneNumberCreated', function(payload) { expect(payload).toEqual('012345678') done(); }); generator.sendNextNumber();

});});

Page 48: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

JavaScript / Node.JS

describe('PhoneNumberCounter', function() { it('should increase count on Number Events', function() { var emitterDummy = new EventEmitter; var counter = new PhoneNumberCounter(emitterDummy, 'NewPhoneNumberCreated'); emitterDummy.emit('NewPhoneNumberCreated', '1234'); emitterDummy.emit('NewPhoneNumberCreated', '4567'); expect(counter.value).toEqual(2); });});

Page 49: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://github.com/jcoglan/eventful

gem install eventful

Ruby

Page 50: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

class Watcher include Eventfulend

w = Watcher.new

w.on(:filechange) { |watcher, path| puts path }

w.fire(:filechange, '/path/to/file.txt')

Ruby - Eventful

Page 51: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

java.util.EventListener

or

https://github.com/micwin/ticino

Java

Page 52: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Ticino - Eventdefinition

public class IncomingXmlEvent {

private String xml;

public IncomingXmlEvent(String xml) { this.xml = xml; }

public String getXml() { return xml; }}

Page 53: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Ticino - Receiver

public class Receiver { public void doSomethingWithThisEvent( IncomingXmlEvent incomingXml) { System.out.println("incoming: " + incomingXml.getXml()); }}

Page 54: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

Ticino - Wiring

import net.micwin.ticino.Ticino;

public class Main { public static void main(String[] args) { Receiver rec = new Receiver(); Ticino.register(IncomingXmlEvent.class, rec); }}

Ticino.dispatch(new IncomingXmlEvent(newXml));

Page 55: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

JUnit Hint

@Test(timeout=1000)public void mytest() { callAsyncTask(); waitForAsyncTask(); AssertAsyncTaskResult();}

Page 56: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://github.com/marcoemrich/

@marcoemrich

Page 57: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

www.webmasters.de

Page 58: Event-getriebene Programmierung in der Praxis - … Programmierung in der Praxis ... Domain Driven Design. ... + Retrospective. Callcenter Kata. 0911/123499

https://www.flickr.com/photos/eilonwy77/6270262038/in/photostream/