28
An Event-Driven Approach for the Separation of Concerns Hayim Makabee Yahoo! Labs Haifa, Israel

An Event-Driven Approach for the Separation of Concerns

Embed Size (px)

Citation preview

Page 1: An Event-Driven Approach for the Separation of Concerns

An Event-Driven Approachfor the Separation of Concerns

Hayim MakabeeYahoo! Labs Haifa, Israel

Page 2: An Event-Driven Approach for the Separation of Concerns

- 2 -

Separation of Concerns

Definition: Separation of Concerns

A software system must be decomposed into parts that overlap in functionality as little as possible.

YAHOO! CONFIDENTIAL

Page 3: An Event-Driven Approach for the Separation of Concerns

- 3 -

Coupling and Cohesion

• Coupling: The degree of dependency between two modules.

 • Cohesion: The measure of how strongly-related is the

set of functions performed by a module.

YAHOO! CONFIDENTIAL

Page 4: An Event-Driven Approach for the Separation of Concerns

- 4 -

OOP and AOP

• OOP reduces coupling:– Encapsulation– Dynamic binding and polymorphism

• AOP increases cohesion:– Separates cross-cutting concerns

YAHOO! CONFIDENTIAL

Page 5: An Event-Driven Approach for the Separation of Concerns

- 5 -

Event-Driven Programming (EDP)

• Reactive Systems are essentially event-driven.

• Hybrid systems use EDP only to implement a specific part of their functionality:– Graphical User Interface– Publish-Subscribe– Observer pattern

• In general EDP is not used to separate concerns. It is a modelling tool.

YAHOO! CONFIDENTIAL

Page 6: An Event-Driven Approach for the Separation of Concerns

- 6 -

EDP and the Separation of Concerns

• Our claim: EDP should be adopted as an alternative tool for the Separation of Concerns.

• An EDP approach can be used to reduce coupling and increase cohesion.

• Should be based on the explicit definition of Events and Event Handlers.

YAHOO! CONFIDENTIAL

Page 7: An Event-Driven Approach for the Separation of Concerns

- 7 -

The EventJ Framework

• Events:– Immutable objects.– Have state and getter functions.– Have type and are organized in an inheritance hierarchy.

YAHOO! CONFIDENTIAL

Page 8: An Event-Driven Approach for the Separation of Concerns

- 8 -

EventHandlers

• EventHandlers:– Execute some action in response to an Event.– May subscribe to different types of Events.– May be stateless or stateful.– May trigger Events themselves.– Receive Events asynchronously.– Do not depend on the results of other EventHandlers.– Run on their own threads.– Manage their own queue of Events.

YAHOO! CONFIDENTIAL

Page 9: An Event-Driven Approach for the Separation of Concerns

- 9 -

Event Dispatcher

• EventDispatcher:– Singleton.– Propagates Events to the appropriate EventHandlers.– Events are initially stored in the EventDispatcher’s central

queue.– Each Event is asynchronously propagated to all the

EventHandlers that have subscribed to its type.– EventHandlers call the EventDispatcher to subscribe to Event

types.– The EventDispatcher runs on a separate thread.

YAHOO! CONFIDENTIAL

Page 10: An Event-Driven Approach for the Separation of Concerns

- 10 -

Separating Concerns with Events

• Identification: Identify the concerns that may be separated from the main functionality (specific pieces of code that can be moved to some other module).

• Triggering: For each concern, define an appropriate type of Event and insert the triggering of this Event in the suitable places in the code.

• Handling: For each type of Event, implement the associated EventHandler(s). Explicitly separate the pieces of code from the Identification step and move them to the respective handlers.

YAHOO! CONFIDENTIAL

Page 11: An Event-Driven Approach for the Separation of Concerns

- 11 -

Pre-Conditions to Separate Concerns

• Concurrency: Since Events are handled asynchronously, it must be possible to execute this separated piece of code in parallel with the rest of the original code.

 • Non-dependency: Since EventHandlers should not

modify any external data, the execution of the original code must not depend on the results of the execution of the piece of code that was separated.

YAHOO! CONFIDENTIAL

Page 12: An Event-Driven Approach for the Separation of Concerns

- 12 -

Example: An Instant-Messaging System

• Each user has a list of contacts (friends).• Must know who among his contacts is available to chat.• The system must manage the user status.• Whenever there is a change in this status the system

must notify all his contacts that are currently online.• Uses a subscription model, in which each online user is

subscribed to all his friends.

YAHOO! CONFIDENTIAL

Page 13: An Event-Driven Approach for the Separation of Concerns

- 13 -

Login and Logout

Login(User u)

{

u.SetStatus(Online);

NotificationMgr.NotifyContacts(u);

SubscriptionMgr.SubscribeContacts(u);

}

 

Logout(User u)

{

u.SetStatus(Offline);

NotificationMgr.NotifyContacts(u);

SubscriptionMgr.UnsubscribeContacts(u);

}

YAHOO! CONFIDENTIAL

Page 14: An Event-Driven Approach for the Separation of Concerns

- 14 -

Timeout

Timeout(User u)

{

u.SetStatus(Offline);

NotificationMgr.NotifyContacts(u);

SubscriptionMgr.UnsubscribeContacts(u);

}

YAHOO! CONFIDENTIAL

Page 15: An Event-Driven Approach for the Separation of Concerns

- 15 -

Separating Cross-cutting Concerns with Events

Login(User u)

{

u.SetStatus(Online);

}

 

Logout(User u)

{

u.SetStatus(Offline);

}

 

Timeout(User u)

{

u.SetStatus(Offline);

}

YAHOO! CONFIDENTIAL

Page 16: An Event-Driven Approach for the Separation of Concerns

- 16 -

User

User.SetStatus(Status status)

{

this.status = status;

EventDispatcher.Trigger(new UserStatusChangedEvent(this));

}

YAHOO! CONFIDENTIAL

Page 17: An Event-Driven Approach for the Separation of Concerns

- 17 -

Handlers

NotificationHandler.Handle(UserStatusChangedEvent e)

{

NotificationMgr.NotifyContacts(e.getUser());

}

 

SubscriptionHandler.Handle(UserStatusChangedEvent e)

{

if (e.getUser().isOnline()) {

SubscriptionMgr.SubscribeContacts(e.getUser());

} else {

SubscriptionMgr.UnsubscribeContacts(e.getUser());

}

}

YAHOO! CONFIDENTIAL

Page 18: An Event-Driven Approach for the Separation of Concerns

- 18 -

Comparison: EDP vs. AOP

• Encapsulation• Inheritance• Coupling• Order of Execution• Invocation• Extensibility• Reusability• Concurrency

Page 19: An Event-Driven Approach for the Separation of Concerns

- 19 -

Encapsulation

Encapsulation:• EDP does not violate encapsulation. Event Handlers

have no access to the data members of other classes.

• AOP allows the violation of encapsulation. An advice may change the value of any variable anywhere in the code.

YAHOO! CONFIDENTIAL

Page 20: An Event-Driven Approach for the Separation of Concerns

- 20 -

Inheritance

Inheritance:• EDP can use inheritance. Event types and

EventHandlers can be organized in hierarchies.

• AOP does not use inheritance. Pointcuts cannot be organized in a hierarchy, since they are defined by name. Aspects cannot inherit from other aspects.

YAHOO! CONFIDENTIAL

Page 21: An Event-Driven Approach for the Separation of Concerns

- 21 -

Coupling

Coupling:• EDP supports coupling by type. An EventHandler is

coupled to a type of Event.

• AOP allows coupling by name. An aspect can execute over a specific function or variable, by name. If the name of this variable is changed, the aspect must be changed as well.

YAHOO! CONFIDENTIAL

Page 22: An Event-Driven Approach for the Separation of Concerns

- 22 -

Order of Execution

Order of Execution:• EDP uses EventHandlers which are executed

asynchronously and in no particular order, since their execution should be independent of each other and should not directly affect the rest of the system.

• AOP has aspects whose execution order is not well-defined and thus if several aspects execute as a consequence of the same code, the results may be unpredictable.

YAHOO! CONFIDENTIAL

Page 23: An Event-Driven Approach for the Separation of Concerns

- 23 -

Invocation

Invocation:• EDP is based on explicit invocations. The Events are

triggered explicitly. For each method it is possible to know which Events are triggered by it, and for each Event type it is clear which EventHandlers handle it.

• AOP uses implicit invocations. By observing a piece of code there is nothing that indicates that an aspect may be executed. Given an aspect, it is hard to find in the system all pieces of code affected by it.

YAHOO! CONFIDENTIAL

Page 24: An Event-Driven Approach for the Separation of Concerns

- 24 -

Extensibility

Extensibility:• EDP makes it easy to add a new EventHandler for some

existing Event type or to trigger an Event of an existing type in some new function.

• AOP is not easily extensible. If a new advice must be added to some existing pointcut it is necessary to repeat the pointcut definition in a new aspect. If we want to extend an advice to be applied to more pointcuts, it is necessary to change the code of the original aspect.

YAHOO! CONFIDENTIAL

Page 25: An Event-Driven Approach for the Separation of Concerns

- 25 -

Reusability

Reusability:• EDP supports reusability of Events and EventHandlers.

Handlers are modular and reusable since they are coupled to Event types, and are independent of the rest of the system.

• AOP defines aspects which have small potential for reuse in other systems, since they are coupled to functions and variables by name.

YAHOO! CONFIDENTIAL

Page 26: An Event-Driven Approach for the Separation of Concerns

- 26 -

Concurrency

Concurrency:• EDP supports EventHandlers that can be executed in

parallel, since they are encapsulated and do not affect code outside them.

• AOP does not support concurrency. Advices cannot be executed in parallel. Their execution must be serialized since they can potentially affect the same piece of code.

YAHOO! CONFIDENTIAL

Page 27: An Event-Driven Approach for the Separation of Concerns

- 27 -

Conclusions

• We proposed the adoption of an Event-Driven approach for the Separation of Concerns.– Methodology to identify cross-cutting concerns and separate

them using events and event handlers.– Defined pre-requisites to perform this change.– Presented concrete example using the EventJ framework.– Compared our approach with AOP.

YAHOO! CONFIDENTIAL

Page 28: An Event-Driven Approach for the Separation of Concerns

- 28 -

Thank You!