confoo 2011 - advanced oo patterns

124
Advanced OO Patterns ConFoo 2011 Tobias Schlitt <[email protected]> March 9, 2011

Upload: bachkoutou-toutou

Post on 20-May-2015

1.499 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Confoo 2011 - Advanced OO Patterns

Advanced OO PatternsConFoo 2011

Tobias Schlitt <[email protected]>

March 9, 2011

Page 2: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 2 / 44

Outline

Introduction

Lazy Initialization

Dependency Injection

Service Locator

Data Storage

Page 3: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 3 / 44

About me

I Degree in computer sience

I More than 10 years ofprofessional PHP

I Open source enthusiastI Apache Zeta ComponentsI ArbitI PHPUnitI . . .

Page 4: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 3 / 44

About me

I Degree in computer sience

I More than 10 years ofprofessional PHP

I Open source enthusiastI Apache Zeta ComponentsI ArbitI PHPUnitI . . .

Page 5: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 3 / 44

About me

I Degree in computer sience

I More than 10 years ofprofessional PHP

I Open source enthusiastI Apache Zeta ComponentsI ArbitI PHPUnitI . . .

Page 6: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 3 / 44

About me

I Degree in computer sience

I More than 10 years ofprofessional PHP

I Open source enthusiastI Apache Zeta ComponentsI ArbitI PHPUnitI . . .

Co-Founder ofQafoo GmbH

http://qafoo.com

Qafoopassion for software quality

Page 7: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 3 / 44

About me

I Degree in computer sience

I More than 10 years ofprofessional PHP

I Open source enthusiastI Apache Zeta ComponentsI ArbitI PHPUnitI . . .

Co-Founder ofQafoo GmbH

http://qafoo.com

Qafoopassion for software quality

We help people to producehigh quality PHP code.

Page 8: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 4 / 44

Disclaimer

I This talk cannot be in depth

I This talk shall inspire you

I This talk will not show UML diagrams

I This talk will show you quite some code

I This talk can seriously harm your coding habbits

Page 9: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 4 / 44

Disclaimer

I This talk cannot be in depth

I This talk shall inspire you

I This talk will not show UML diagrams

I This talk will show you quite some code

I This talk can seriously harm your coding habbits

Page 10: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 4 / 44

Disclaimer

I This talk cannot be in depth

I This talk shall inspire you

I This talk will not show UML diagrams

I This talk will show you quite some code

I This talk can seriously harm your coding habbits

Page 11: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 4 / 44

Disclaimer

I This talk cannot be in depth

I This talk shall inspire you

I This talk will not show UML diagrams

I This talk will show you quite some code

I This talk can seriously harm your coding habbits

Page 12: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 4 / 44

Disclaimer

I This talk cannot be in depth

I This talk shall inspire you

I This talk will not show UML diagrams

I This talk will show you quite some code

I This talk can seriously harm your coding habbits

Page 13: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 14: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 15: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 16: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 17: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 18: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

Page 19: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 5 / 44

Patterns are . . .

I . . . universal solutions.

I . . . good habbits.

I . . . coding templates.

. . . names for proven ideas how a certain class of problemscan be solved.

Page 20: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 6 / 44

Patterns are not . . .

I . . . appliable to every problem.

I . . . directly transferable to code.

I . . . always the best solution.

Page 21: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 7 / 44

Pattern classification

I Creational

I Structural

I Behavioural

I Architectural

Page 22: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 8 / 44

Well known patterns

Factory

Adapter

Iterator

Singleton

Signal / Observer

Visitor

Page 23: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 8 / 44

Well known patterns

Factory

Adapter

Iterator

Singleton

Signal / Observer

Visitor

Page 24: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 9 / 44

Outline

Introduction

Lazy Initialization

Dependency Injection

Service Locator

Data Storage

Page 25: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 10 / 44

Motivation

I Building a full object graph isI ComplexI Time consumingI Memory consuming

I Do you use all objects in every request?

I Idea: Initialize object when needed for the first time

Page 26: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 10 / 44

Motivation

I Building a full object graph isI ComplexI Time consumingI Memory consuming

I Do you use all objects in every request?

I Idea: Initialize object when needed for the first time

Page 27: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 10 / 44

Motivation

I Building a full object graph isI ComplexI Time consumingI Memory consuming

I Do you use all objects in every request?

I Idea: Initialize object when needed for the first time

Page 28: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 11 / 44

Simple lazy initialization

1 <?php23 c l a s s D a t a b a s e I n i t i a l i z e r4 {5 p r o t e c t e d $dsn ;67 p r o t e c t e d $db ;89 p u b l i c f u n c t i o n c o n s t r u c t ( $dsn )

10 {11 $ t h i s−>dsn = $dsn ;12 }1314 p u b l i c f u n c t i o n getDatabase ( )15 {16 i f ( $ t h i s−>db === n u l l )17 {18 $ t h i s−>db = new Database ( $ t h i s−>dsn ) ;19 }20 r e t u r n $ t h i s−>db ;21 }22 }

Page 29: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 11 / 44

Simple lazy initialization

1 <?php23 c l a s s D a t a b a s e I n i t i a l i z e r4 {5 p r o t e c t e d $dsn ;67 p r o t e c t e d $db ;89 p u b l i c f u n c t i o n c o n s t r u c t ( $dsn )

10 {11 $ t h i s−>dsn = $dsn ;12 }1314 p u b l i c f u n c t i o n getDatabase ( )15 {16 i f ( $ t h i s−>db === n u l l )17 {18 $ t h i s−>db = new Database ( $ t h i s−>dsn ) ;19 }20 r e t u r n $ t h i s−>db ;21 }22 }

Page 30: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 11 / 44

Simple lazy initialization

1 <?php23 c l a s s D a t a b a s e I n i t i a l i z e r4 {5 p r o t e c t e d $dsn ;67 p r o t e c t e d $db ;89 p u b l i c f u n c t i o n c o n s t r u c t ( $dsn )

10 {11 $ t h i s−>dsn = $dsn ;12 }1314 p u b l i c f u n c t i o n getDatabase ( )15 {16 i f ( $ t h i s−>db === n u l l )17 {18 $ t h i s−>db = new Database ( $ t h i s−>dsn ) ;19 }20 r e t u r n $ t h i s−>db ;21 }22 }

Page 31: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 12 / 44

Outline

Introduction

Lazy Initialization

Dependency Injection

Service Locator

Data Storage

Page 32: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 13 / 44

Goals of good OO design

I Modular

I Flexible

I Reusable

I Testable

I S.O.L.I.D.(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)

Page 33: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 13 / 44

Goals of good OO design

I Modular

I Flexible

I Reusable

I Testable

I S.O.L.I.D.(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)

Page 34: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 13 / 44

Goals of good OO design

I Modular

I Flexible

I Reusable

I Testable

I S.O.L.I.D.(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)

Page 35: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 13 / 44

Goals of good OO design

I Modular

I Flexible

I Reusable

I Testable

I S.O.L.I.D.(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)

Page 36: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 13 / 44

Goals of good OO design

I Modular

I Flexible

I Reusable

I Testable

I S.O.L.I.D.(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)

Page 37: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 14 / 44

What’s the problem here?

1 <?php23 c l a s s MessageD i spatche r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( )6 {7 $ t h i s−>messenge r s [ ] = new

JabberMessenger ( ) ;8 $ t h i s−>messenge r s [ ] = new

Mai lMessenger ( ) ;9 }

10 }1112 c l a s s Mai lMessenger implements Messenger13 {14 p u b l i c f u n c t i o n sendMessage ( $ t e x t )15 {16 myLogger : : g e t I n s t a n c e ( )−>l og ( $ t e x t

) ;17 $ t h i s−>sendMa i l ( /∗ . . . ∗/ ) ;18 }19 }

I Inflexible

I Not reusable

I Hardly testable

Page 38: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 14 / 44

What’s the problem here?

1 <?php23 c l a s s MessageD i spatche r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( )6 {7 $ t h i s−>messenge r s [ ] = new

JabberMessenger ( ) ;8 $ t h i s−>messenge r s [ ] = new

Mai lMessenger ( ) ;9 }

10 }1112 c l a s s Mai lMessenger implements Messenger13 {14 p u b l i c f u n c t i o n sendMessage ( $ t e x t )15 {16 myLogger : : g e t I n s t a n c e ( )−>l og ( $ t e x t

) ;17 $ t h i s−>sendMa i l ( /∗ . . . ∗/ ) ;18 }19 }

I Inflexible

I Not reusable

I Hardly testable

Page 39: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 14 / 44

What’s the problem here?

1 <?php23 c l a s s MessageD i spatche r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( )6 {7 $ t h i s−>messenge r s [ ] = new

JabberMessenger ( ) ;8 $ t h i s−>messenge r s [ ] = new

Mai lMessenger ( ) ;9 }

10 }1112 c l a s s Mai lMessenger implements Messenger13 {14 p u b l i c f u n c t i o n sendMessage ( $ t e x t )15 {16 myLogger : : g e t I n s t a n c e ( )−>l og ( $ t e x t

) ;17 $ t h i s−>sendMa i l ( /∗ . . . ∗/ ) ;18 }19 }

I Inflexible

I Not reusable

I Hardly testable

Page 40: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 14 / 44

What’s the problem here?

1 <?php23 c l a s s MessageD i spatche r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( )6 {7 $ t h i s−>messenge r s [ ] = new

JabberMessenger ( ) ;8 $ t h i s−>messenge r s [ ] = new

Mai lMessenger ( ) ;9 }

10 }1112 c l a s s Mai lMessenger implements Messenger13 {14 p u b l i c f u n c t i o n sendMessage ( $ t e x t )15 {16 myLogger : : g e t I n s t a n c e ( )−>l og ( $ t e x t

) ;17 $ t h i s−>sendMa i l ( /∗ . . . ∗/ ) ;18 }19 }

I Inflexible

I Not reusable

I Hardly testable

Page 41: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 42: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 43: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 44: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 45: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 46: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 15 / 44

Injecting dependencies

1 <?php23 $messenger = new MessageDi spatche r (4 a r r a y (5 new JabberMessenger ( ’ j a b b e r . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,6 new Mai lMessenger (7 new Mai lSmtpTransport ( ’ ma i l . example . org ’ , ’ u s e r ’ , ’ pa s s ’ ) ,8 $ l o g g e r = new Logger (9 new Logg i ngD i spa t che r (

10 a r r a y (11 new Sys l ogLogge r ( ) ,12 new F i l eSy s t emLogge r ( ’ l o g / e r r o r s . l o g ’ )13 )14 )15 )16 )17 ) ,18 $ l o g g e r19 ) ;

Page 47: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 16 / 44

What is desired?

I Don’t have ctors all over the place

I Manage dependencies

I Replace dependencies fine grained

I Lazy initialization

Page 48: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 17 / 44

The Arbit DIC

I Exemplary for a high-end DICI Shared objects (initialized once)I Closures for lazy initializationI Inherent dependency resolution

I Base class for custom DICs

I Heavy use of interceptors

I No implementation details,see here: http://bit.ly/arbitDIC

Page 49: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 17 / 44

The Arbit DIC

I Exemplary for a high-end DICI Shared objects (initialized once)I Closures for lazy initializationI Inherent dependency resolution

I Base class for custom DICs

I Heavy use of interceptors

I No implementation details,see here: http://bit.ly/arbitDIC

Page 50: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 17 / 44

The Arbit DIC

I Exemplary for a high-end DICI Shared objects (initialized once)I Closures for lazy initializationI Inherent dependency resolution

I Base class for custom DICs

I Heavy use of interceptors

I No implementation details,see here: http://bit.ly/arbitDIC

Page 51: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 17 / 44

The Arbit DIC

I Exemplary for a high-end DICI Shared objects (initialized once)I Closures for lazy initializationI Inherent dependency resolution

I Base class for custom DICs

I Heavy use of interceptors

I No implementation details,see here: http://bit.ly/arbitDIC

Page 52: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 18 / 44

Managing dependencies

3 c l a s s a rb i tEnv i ronmentDIC ex t end s a r b i tD e p e n d e n c y I n j e c t i o nCon t a i n e r4 {

13 p u b l i c f u n c t i o n i n i t i a l i z e ( )14 {

38 }39 }

Page 53: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 18 / 44

Managing dependencies

3 c l a s s a rb i tEnv i ronmentDIC ex t end s a r b i tD e p e n d e n c y I n j e c t i o nCon t a i n e r4 {

13 p u b l i c f u n c t i o n i n i t i a l i z e ( )14 {

38 }39 }

Page 54: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 19 / 44

Managing dependencies

3 c l a s s a rb i tEnv i ronmentDIC ex t end s a r b i tD e p e n d e n c y I n j e c t i o nCon t a i n e r4 {

13 p u b l i c f u n c t i o n i n i t i a l i z e ( )14 {

15 $ t h i s−>cache = f u n c t i o n ( $d i c )16 {17 r e t u r n new a r b i t F i l e s y s t emCa c h e ( $d ic−>r eque s t−>c o n t r o l l e r ) ;18 } ;

38 }39 }

Page 55: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 20 / 44

Managing dependencies

3 c l a s s a rb i tEnv i ronmentDIC ex t end s a r b i tD e p e n d e n c y I n j e c t i o nCon t a i n e r4 {

13 p u b l i c f u n c t i o n i n i t i a l i z e ( )14 {

20 $ t h i s−>messenger = f u n c t i o n ( $d i c )21 {22 r e t u r n new a rb i tMe s s eng e r ( a r r a y (23 ’ ema i l ’ => $d ic−>mai lMessenger ,24 ) ) ;25 } ;

38 }39 }

Page 56: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 21 / 44

Managing dependencies

3 c l a s s a rb i tEnv i ronmentDIC ex t end s a r b i tD e p e n d e n c y I n j e c t i o nCon t a i n e r4 {

13 p u b l i c f u n c t i o n i n i t i a l i z e ( )14 {

27 $ t h i s−>mai lMessenge r = f u n c t i o n ( $d i c )28 {29 r e t u r n new a rb i tMa i lMe s s e ng e r (30 $d ic−>mai lT ranspo r t ,31 $d ic−>c o n f i g u r a t i o n−>main ,32 $d ic−>c o n f i g u r a t i o n−>p r o j e c t ( $d ic−>r eque s t−>c o n t r o l l e r ) ,33 $d ic−>v iews−>d e c o r a t o r34 ) ;35 } ;

38 }39 }

Page 57: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 22 / 44

Dependency Injection Approaches

I Constructor injectionI We just saw that

I Setter injectionI Use set*()I Default instances?

I Interface injectionI Specific to some containers

Page 58: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 22 / 44

Dependency Injection Approaches

I Constructor injectionI We just saw that

I Setter injectionI Use set*()I Default instances?

I Interface injectionI Specific to some containers

Page 59: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 22 / 44

Dependency Injection Approaches

I Constructor injectionI We just saw that

I Setter injectionI Use set*()I Default instances?

I Interface injectionI Specific to some containers

Page 60: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 23 / 44

More about DIC

I Phemto - A dependency injector for PHP 5http://phemto.sourceforge.net/

I Pimple - A small PHP 5.3 dependency injection containerhttps://github.com/fabpot/Pimple

I Bucket - Basic di-container for phphttps://github.com/troelskn/bucket

I Symfony Dependency Injectionhttp://components.symfony-project.org/

dependency-injection/

I Martin Fowler on Dependency Injectionhttp://martinfowler.com/articles/injection.html

Page 61: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 23 / 44

More about DIC

I Phemto - A dependency injector for PHP 5http://phemto.sourceforge.net/

I Pimple - A small PHP 5.3 dependency injection containerhttps://github.com/fabpot/Pimple

I Bucket - Basic di-container for phphttps://github.com/troelskn/bucket

I Symfony Dependency Injectionhttp://components.symfony-project.org/

dependency-injection/

I Martin Fowler on Dependency Injectionhttp://martinfowler.com/articles/injection.html

Page 62: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 24 / 44

Outline

Introduction

Lazy Initialization

Dependency Injection

Service Locator

Data Storage

Page 63: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 25 / 44

Service Locator

I Object to retrieve a Service from

I Deliver locator instead of service directly

I Basically saves constructor parameters

Page 64: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 25 / 44

Service Locator

I Object to retrieve a Service from

I Deliver locator instead of service directly

I Basically saves constructor parameters

Page 65: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 26 / 44

Service Locator

1 <?php23 c l a s s Mes s ageSe r v i c eLoca to r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( a r r a y $messengers , Logger $ l o g g e r )6 { /∗ . . . ∗/ }78 p u b l i c f u n c t i o n ge tMes senge r s ( )9 { /∗ . . . ∗/ }

1011 p u b l i c f u n c t i o n ge tLogge r ( )12 { /∗ . . . ∗/ }13 }1415 c l a s s MessageDi spatche r16 {17 p u b l i c f u n c t i o n c o n s t r u c t ( Mes s ageSe r v i c eLoca to r $ s e r v i c e L o c )18 { /∗ . . . ∗/ }19 }2021 ?>

Page 66: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 26 / 44

Service Locator

1 <?php23 c l a s s Mes s ageSe r v i c eLoca to r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( a r r a y $messengers , Logger $ l o g g e r )6 { /∗ . . . ∗/ }78 p u b l i c f u n c t i o n ge tMes senge r s ( )9 { /∗ . . . ∗/ }

1011 p u b l i c f u n c t i o n ge tLogge r ( )12 { /∗ . . . ∗/ }13 }1415 c l a s s MessageDi spatche r16 {17 p u b l i c f u n c t i o n c o n s t r u c t ( Mes s ageSe r v i c eLoca to r $ s e r v i c e L o c )18 { /∗ . . . ∗/ }19 }2021 ?>

Page 67: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 26 / 44

Service Locator

1 <?php23 c l a s s Mes s ageSe r v i c eLoca to r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( a r r a y $messengers , Logger $ l o g g e r )6 { /∗ . . . ∗/ }78 p u b l i c f u n c t i o n ge tMes senge r s ( )9 { /∗ . . . ∗/ }

1011 p u b l i c f u n c t i o n ge tLogge r ( )12 { /∗ . . . ∗/ }13 }1415 c l a s s MessageDi spatche r16 {17 p u b l i c f u n c t i o n c o n s t r u c t ( Mes s ageSe r v i c eLoca to r $ s e r v i c e L o c )18 { /∗ . . . ∗/ }19 }2021 ?>

Page 68: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 26 / 44

Service Locator

1 <?php23 c l a s s Mes s ageSe r v i c eLoca to r4 {5 p u b l i c f u n c t i o n c o n s t r u c t ( a r r a y $messengers , Logger $ l o g g e r )6 { /∗ . . . ∗/ }78 p u b l i c f u n c t i o n ge tMes senge r s ( )9 { /∗ . . . ∗/ }

1011 p u b l i c f u n c t i o n ge tLogge r ( )12 { /∗ . . . ∗/ }13 }1415 c l a s s MessageDi spatche r16 {17 p u b l i c f u n c t i o n c o n s t r u c t ( Mes s ageSe r v i c eLoca to r $ s e r v i c e L o c )18 { /∗ . . . ∗/ }19 }2021 ?>

Page 69: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 27 / 44

Pattern purism

DIC vs. Service Locator

Page 70: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 28 / 44

Outline

Introduction

Lazy Initialization

Dependency Injection

Service Locator

Data Storage

Page 71: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 29 / 44

The situation

Model (application) Storage

Page 72: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 29 / 44

The situation

Model (application) Storage

store

restore

Page 73: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 74: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 75: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 76: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 77: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 78: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 79: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 30 / 44

Challenges

I Model and storage structure differI Object relational impedance mismatch

I Different access approachesI Query language differences

I Storage back end might change

I Back ends could even be mixed

I . . .

Page 80: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 31 / 44

Active Record

1 <?php23 c l a s s I n v o i c e e x t end s Ac t i v eReco rd4 {5 p r o t e c t e d $ i d ;6 p r o t e c t e d $ p o s i t i o n s ;7 p r o t e c t e d $vat ;8 // . . .9

10 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )11 { /∗ b u s i n e s s l o g i c ∗/ }12 }1314 c l a s s Ac t i v eReco rd15 {16 p u b l i c f u n c t i o n i n s e r t ( )17 { /∗ . . . ∗/ }18 p u b l i c f u n c t i o n update ( )19 { /∗ . . . ∗/ }20 }

Page 81: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 31 / 44

Active Record

1 <?php23 c l a s s I n v o i c e e x t end s Ac t i v eReco rd4 {5 p r o t e c t e d $ i d ;6 p r o t e c t e d $ p o s i t i o n s ;7 p r o t e c t e d $vat ;8 // . . .9

10 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )11 { /∗ b u s i n e s s l o g i c ∗/ }12 }1314 c l a s s Ac t i v eReco rd15 {16 p u b l i c f u n c t i o n i n s e r t ( )17 { /∗ . . . ∗/ }18 p u b l i c f u n c t i o n update ( )19 { /∗ . . . ∗/ }20 }

Page 82: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 31 / 44

Active Record

1 <?php23 c l a s s I n v o i c e e x t end s Ac t i v eReco rd4 {5 p r o t e c t e d $ i d ;6 p r o t e c t e d $ p o s i t i o n s ;7 p r o t e c t e d $vat ;8 // . . .9

10 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )11 { /∗ b u s i n e s s l o g i c ∗/ }12 }1314 c l a s s Ac t i v eReco rd15 {16 p u b l i c f u n c t i o n i n s e r t ( )17 { /∗ . . . ∗/ }18 p u b l i c f u n c t i o n update ( )19 { /∗ . . . ∗/ }20 }

Page 83: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 31 / 44

Active Record

1 <?php23 c l a s s I n v o i c e e x t end s Ac t i v eReco rd4 {5 p r o t e c t e d $ i d ;6 p r o t e c t e d $ p o s i t i o n s ;7 p r o t e c t e d $vat ;8 // . . .9

10 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )11 { /∗ b u s i n e s s l o g i c ∗/ }12 }1314 c l a s s Ac t i v eReco rd15 {16 p u b l i c f u n c t i o n i n s e r t ( )17 { /∗ . . . ∗/ }18 p u b l i c f u n c t i o n update ( )19 { /∗ . . . ∗/ }20 }

Page 84: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 32 / 44

Active Record

I Combines storage and business logic

I Commonly storage logic in base class

I Model class corresponds to database record

Page 85: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 86: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 87: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 88: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 89: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 90: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 91: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 92: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 33 / 44

Evaluation

Pros

I Very easy to use

I Very few code towrite

Cons

I Model structure = storagestructure

I Classes become complexI Business logicI Storage logic

I Broken object semantics

I Changes ripple over

I Hard to exchange storage logic

I Really hard to test!

Page 93: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 34 / 44

Lesson learned . . .

De-couple business and storage logic!

Page 94: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 35 / 44

Row Data Gateway

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $data ;6 // . . .78 p u b l i c f u n c t i o n c o n s t r u c t ( I nvo i c eGateway $data )9 { $ t h i s−>data = $data ; }

1011 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )12 { /∗ b u s i n e s s l o g i c ∗/ }13 }1415 c l a s s I nvo i c eGateway16 {17 p r o t e c t e d $ i d ;18 p r o t e c t e d $ p o s i t i o n s ;19 p r o t e c t e d $vat ;2021 p u b l i c f u n c t i o n i n s e r t ( )22 { /∗ . . . ∗/ }23 p u b l i c f u n c t i o n update ( )24 { /∗ . . . ∗/ }25 }

Page 95: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 35 / 44

Row Data Gateway

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $data ;6 // . . .78 p u b l i c f u n c t i o n c o n s t r u c t ( I nvo i c eGateway $data )9 { $ t h i s−>data = $data ; }

1011 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )12 { /∗ b u s i n e s s l o g i c ∗/ }13 }1415 c l a s s I nvo i c eGateway16 {17 p r o t e c t e d $ i d ;18 p r o t e c t e d $ p o s i t i o n s ;19 p r o t e c t e d $vat ;2021 p u b l i c f u n c t i o n i n s e r t ( )22 { /∗ . . . ∗/ }23 p u b l i c f u n c t i o n update ( )24 { /∗ . . . ∗/ }25 }

Page 96: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 35 / 44

Row Data Gateway

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $data ;6 // . . .78 p u b l i c f u n c t i o n c o n s t r u c t ( I nvo i c eGateway $data )9 { $ t h i s−>data = $data ; }

1011 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )12 { /∗ b u s i n e s s l o g i c ∗/ }13 }1415 c l a s s I nvo i c eGateway16 {17 p r o t e c t e d $ i d ;18 p r o t e c t e d $ p o s i t i o n s ;19 p r o t e c t e d $vat ;2021 p u b l i c f u n c t i o n i n s e r t ( )22 { /∗ . . . ∗/ }23 p u b l i c f u n c t i o n update ( )24 { /∗ . . . ∗/ }25 }

Page 97: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 35 / 44

Row Data Gateway

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $data ;6 // . . .78 p u b l i c f u n c t i o n c o n s t r u c t ( I nvo i c eGateway $data )9 { $ t h i s−>data = $data ; }

1011 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )12 { /∗ b u s i n e s s l o g i c ∗/ }13 }1415 c l a s s I nvo i c eGateway16 {17 p r o t e c t e d $ i d ;18 p r o t e c t e d $ p o s i t i o n s ;19 p r o t e c t e d $vat ;2021 p u b l i c f u n c t i o n i n s e r t ( )22 { /∗ . . . ∗/ }23 p u b l i c f u n c t i o n update ( )24 { /∗ . . . ∗/ }25 }

Page 98: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 36 / 44

Row Data Gateway

I Decouples storage from business logic

I Still convenient OO interface for storage

I Still some objects coupled to storage

I (Table Data Gateway is a somewhat similar approach)

Page 99: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 36 / 44

Row Data Gateway

I Decouples storage from business logic

I Still convenient OO interface for storage

I Still some objects coupled to storage

I (Table Data Gateway is a somewhat similar approach)

Page 100: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 37 / 44

Evaluation

Pros

I Easy to useI Few code to write

I Gateways can begenerated

I Easier to test

Cons

I Some objects model DBstructure

I Changes still ripple over

I Still hard to exchangestorage logic

Page 101: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 37 / 44

Evaluation

Pros

I Easy to useI Few code to write

I Gateways can begenerated

I Easier to test

Cons

I Some objects model DBstructure

I Changes still ripple over

I Still hard to exchangestorage logic

Page 102: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 37 / 44

Evaluation

Pros

I Easy to useI Few code to write

I Gateways can begenerated

I Easier to test

Cons

I Some objects model DBstructure

I Changes still ripple over

I Still hard to exchangestorage logic

Page 103: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 37 / 44

Evaluation

Pros

I Easy to useI Few code to write

I Gateways can begenerated

I Easier to test

Cons

I Some objects model DBstructure

I Changes still ripple over

I Still hard to exchangestorage logic

Page 104: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 37 / 44

Evaluation

Pros

I Easy to useI Few code to write

I Gateways can begenerated

I Easier to test

Cons

I Some objects model DBstructure

I Changes still ripple over

I Still hard to exchangestorage logic

Page 105: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 38 / 44

Data Mapper

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $ p o s i t i o n s ;6 p r o t e c t e d $vat ;7 // . . .89 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )

10 { /∗ b u s i n e s s l o g i c ∗/ }11 }1213 i n t e r f a c e Invo i ceMappe r14 {15 p u b l i c f u n c t i o n s t o r e ( I n v o i c e $ i n v o i c e ) ;16 p u b l i c f u n c t i o n update ( I n v o i c e $ i n v o i c e ) ;17 p u b l i c f u n c t i o n f indByCustomer ( Customer $customer ) ;18 }1920 c l a s s DbInvoiceMapper implements Invo i ceMappe r21 {22 // . . .23 }2425 ?>

Page 106: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 38 / 44

Data Mapper

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $ p o s i t i o n s ;6 p r o t e c t e d $vat ;7 // . . .89 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )

10 { /∗ b u s i n e s s l o g i c ∗/ }11 }1213 i n t e r f a c e Invo i ceMappe r14 {15 p u b l i c f u n c t i o n s t o r e ( I n v o i c e $ i n v o i c e ) ;16 p u b l i c f u n c t i o n update ( I n v o i c e $ i n v o i c e ) ;17 p u b l i c f u n c t i o n f indByCustomer ( Customer $customer ) ;18 }1920 c l a s s DbInvoiceMapper implements Invo i ceMappe r21 {22 // . . .23 }2425 ?>

Page 107: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 38 / 44

Data Mapper

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $ p o s i t i o n s ;6 p r o t e c t e d $vat ;7 // . . .89 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )

10 { /∗ b u s i n e s s l o g i c ∗/ }11 }1213 i n t e r f a c e Invo i ceMappe r14 {15 p u b l i c f u n c t i o n s t o r e ( I n v o i c e $ i n v o i c e ) ;16 p u b l i c f u n c t i o n update ( I n v o i c e $ i n v o i c e ) ;17 p u b l i c f u n c t i o n f indByCustomer ( Customer $customer ) ;18 }1920 c l a s s DbInvoiceMapper implements Invo i ceMappe r21 {22 // . . .23 }2425 ?>

Page 108: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 38 / 44

Data Mapper

1 <?php23 c l a s s I n v o i c e4 {5 p r o t e c t e d $ p o s i t i o n s ;6 p r o t e c t e d $vat ;7 // . . .89 p u b l i c f u n c t i o n c a l c u l a t eV a l u e ( )

10 { /∗ b u s i n e s s l o g i c ∗/ }11 }1213 i n t e r f a c e Invo i ceMappe r14 {15 p u b l i c f u n c t i o n s t o r e ( I n v o i c e $ i n v o i c e ) ;16 p u b l i c f u n c t i o n update ( I n v o i c e $ i n v o i c e ) ;17 p u b l i c f u n c t i o n f indByCustomer ( Customer $customer ) ;18 }1920 c l a s s DbInvoiceMapper implements Invo i ceMappe r21 {22 // . . .23 }2425 ?>

Page 109: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 39 / 44

Data Mapper

I Decouple storage from model

I No OO modelling of DB structure

I Model does not even know a database exists

Page 110: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 111: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 112: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 113: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 114: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 115: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 116: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 117: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 40 / 44

Evaluation

Pros

I Complete decoupling

I Model is not aware of storageI Clean storage interface

I Implement different storages!

I DB changes only affectmapping layer

I Model changes only affectmapping layer

I Nice for testing

Cons

I Quite some codeto write

I Mapping canbecome complex

Page 118: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 41 / 44

Attribution

Large parts of this talk are inspired by

Patterns of Enterprise Application Architectureby Martin Fowler

ISBN 978-0321127426 — http://amzn.to/PofEAA

Highy recommended!

Page 119: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 42 / 44

Conclusion

I Patterns are not the holy grail!

I They assign names to good ideas

I They help you to talk about concepts

I They can inspire you

Page 120: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 42 / 44

Conclusion

I Patterns are not the holy grail!

I They assign names to good ideas

I They help you to talk about concepts

I They can inspire you

Page 121: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 43 / 44

Q / A

Are there any questions left?

Page 122: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 44 / 44

Thanks for listening

Please rate this talk athttp://joind.in/2774

and / or give me some feedback right now!

Page 123: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 44 / 44

Thanks for listening

Please rate this talk athttp://joind.in/2774

and / or give me some feedback right now!

This is very important for . . .

I Speakers

I Organizers

I You!

Page 124: Confoo 2011 - Advanced OO Patterns

Advanced OO Patterns 44 / 44

Thanks for listening

Please rate this talk athttp://joind.in/2774

and / or give me some feedback right now!

Stay in touch

I Tobias Schlitt

I [email protected]

I @tobySen / @qafoo

Rent a PHP quality expert:http://qafoo.com