"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
decoupling-ea
1. AMIR BARYLKO
DECOUPLING
USING THE
EVENT
AGGREGATOR
.NET USER GROUP
MAR 2011
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
2. WHO AM I?
• Quality Expert
• Architect
• Developer
• Mentor
• Great cook
• The one who’s entertaining you for the next hour!
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
3. RESOURCES
• Email: amir@barylko.com
• Twitter: @abarylko
• Blog: http://www.orthocoders.com
• Materials: http://www.orthocoders.com/presentations
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
4. INTRO
Coupling
Cohesion
Dependencies
Dependency Injection
IoC Containers
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
6. COUPLING
(WIKIPEDIA)
Degree to which
each program module relies
on each one
of the other modules
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
7. COUPLING II
Is usually contrasted
with cohesion
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
8. COUPLING III
Invented by Larry Constantine,
an original developer of
Structured Design
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
9. COUPLING IV
Low coupling is often a
sign of a well-structured
computer system and a
good design
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
10. COUPLING V
When combined with
high cohesion,
supports high
readability and
maintainability
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
11. COHESION
(WIKIPEDIA)
measure of how
strongly-related the
functionality expressed by the
source code of a
software module is
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
12. IS ALL ABOUT
DEPENDENCIES
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
13. HARDCODED
DEPENDENCIES
public MovieLibrary()
{
this._storage = new LocalStorage();
this._critic = new JaySherman();
this._posterService = new IMDBPosterService();
}
Impossible to test
or maintain!
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
14. EXTRACT INTERFACES
private JaySherman _critic;
private IMDBPosterService _posterService;
private LocalStorage _storage;
private IMovieCritic _critic;
private IMoviePosterService _posterService;
private IMovieStorage _storage;
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
15. DEPENDENCY INJECTION
public MovieLibrary(IMovieStorage storage,
IMovieCritic critic,
IMoviePosterService posterService)
{
this._storage = storage;
this._critic = critic;
this._posterService = posterService;
}
Better for testing... but who
is going to initialize them?
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
17. POOR’S MAN DI
public MovieLibrary()
{
this._storage = new LocalStorage();
this._critic = new JaySherman();
this._posterService = new IMDBPosterService();
}
Still testeable...
but smells!
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
18. USING IOC CONTAINER
Container.Register(
Component
.For<IMovieCritic>()
.ImplementedBy<JaySherman>(),
Component
.For<IMoviePosterService>()
.ImplementedBy<IMDBPosterService>(),
Component
.For<IMovieStorage>()
.ImplementedBy<LocalStorage>());
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
19. REFACTORING
What’s wrong?
Event Aggregator
Demo
Desktop &Web applications
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
22. LET’S THINK
• Why the critic has to know the library (or
viceversa)?
• Or the poster service?
• If I need more services, do I add more
dependencies to the library?
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
23. DECENTRALIZE
• Identify boundaries
• Identify clear responsibilities
• Reduce complexity
• Find notification mechanism
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
24. WHAT I’D LIKE
Reviews
Library ????
Posters
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
26. THE PATTERN
Channel events
from multiple
objects into a
single object to
s i m p l i f y
registration for
clients
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
27. TRAITS
• Based on subject - observer
• Centralize event registration logic
• No need to track multiple objects
• Level of indirection
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
28. DEMO
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
29. WHAT WE NEED
•Register events
•Raise events
•Subscribe to events
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
31. WHAT’S NEXT?
•Show movies
•Add notification to show posters
•Add notification to show reviews
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
33. RESOURCES
• Email: amir@barylko.com
• Twitter: @abarylko
• Presentation: http://www.orthocoders.com/presentations
• Source Code: https://github.com/amirci/decoupling_mar_11
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
34. RESOURCES II
•Coupling: http://en.wikipedia.org/wiki/Coupling_(computer_programming)
•Event Aggregator: http://martinfowler.com/eaaDev/EventAggregator.html
MavenThought Commons:https://github.com/amirci/mt_commons
•Bootstrapper:http://bootstrapper.codeplex.com/
•Windsor Container:http://www.castleproject.org/container/
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
35. TDD TRAINING
• When: May 26 & 27
• More info: http://www.maventhought.com
• Goal: Learn TDD with real hands on examples
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011
36. AGILE USER GROUP
• Check it out! : http://www.agilewinnipeg.com
• Apr 5: Agile Planning
• May: Agile Stories
• Jun: Testing?
Amir Barylko - .NET UG Mar ‘11 MavenThought Inc.
Wednesday, March 30, 2011