3. About the speaker
• Senior Software Architect, Mentor, Technical Writer
• Fourteen years of Java experience (JSE, JEE, JME, etc...)
• Sun partner since 1998, Oracle consultant since 2010
• Author of a number of open source projects
• Speaker at JavaOne, Devoxx, Jazoon, JAX and other events
• Member of the NetBeans Dream Team
• Co-leader of JUG Milano
• Java.Net blogger at http://www.java.net/blogs/fabriziogiudici
DCI 2
Wednesday, April 20, 2011 2
5. Agenda
• Two real world examples
DCI 3
Wednesday, April 20, 2011 3
6. Agenda
• Two real world examples
• DCI - Basic concepts
DCI 3
Wednesday, April 20, 2011 3
7. Agenda
• Two real world examples
• DCI - Basic concepts
• DCI - How to implement?
DCI 3
Wednesday, April 20, 2011 3
8. Agenda
• Two real world examples
• DCI - Basic concepts
• DCI - How to implement?
• Some simple examples
DCI 3
Wednesday, April 20, 2011 3
9. Agenda
• Two real world examples
• DCI - Basic concepts
• DCI - How to implement?
• Some simple examples
• Abstracting and sweetening
DCI 3
Wednesday, April 20, 2011 3
12. Shameless Plug
• Exercises of Design - my design book...
DCI 5
Wednesday, April 20, 2011 5
13. Shameless Plug
• Exercises of Design - my design book...
• Just started!
DCI 5
Wednesday, April 20, 2011 5
14. Shameless Plug
• Exercises of Design - my design book...
• Just started!
• http://exercisesofdesign.java.net
DCI 5
Wednesday, April 20, 2011 5
15. The Observation API
• A core component of blueBill Mobile
• An application about recording bird observations
• Designed with a high degree of abstraction
DCI 6
Wednesday, April 20, 2011 6
16. The Observation API
• A core component of blueBill Mobile
• An application about recording bird observations
• Designed with a high degree of abstraction
DCI 6
Wednesday, April 20, 2011 6
17. The Observation API
• A core component of blueBill Mobile
• An application about recording bird observations
• Designed with a high degree of abstraction
DCI 6
Wednesday, April 20, 2011 6
19. The Taxonomy API
• Models the taxonomy of a philogenetic tree
• The standard way of biology for representing living beings species
DCI 8
Wednesday, April 20, 2011 8
23. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
DCI 11
Wednesday, April 20, 2011 11
24. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
• The formalizer of MVC
DCI 11
Wednesday, April 20, 2011 11
25. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
• The formalizer of MVC
• Seen as an evolution of MVC
DCI 11
Wednesday, April 20, 2011 11
26. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
• The formalizer of MVC
• Seen as an evolution of MVC
• But it doesn’t replace it
DCI 11
Wednesday, April 20, 2011 11
27. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
• The formalizer of MVC
• Seen as an evolution of MVC
• But it doesn’t replace it
• It rather broadens the analysis scope
DCI 11
Wednesday, April 20, 2011 11
28. Data, Context and Interaction
• OOD best practice invented by Trygve Reenskaug
• The formalizer of MVC
• Seen as an evolution of MVC
• But it doesn’t replace it
• It rather broadens the analysis scope
• http://www.artima.com/articles/dci_vision.html
DCI 11
Wednesday, April 20, 2011 11
30. DCI - aims
• Improve readability of a OO system
DCI 12
Wednesday, April 20, 2011 12
31. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
DCI 12
Wednesday, April 20, 2011 12
32. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
• Recover readability of system properties on the whole
DCI 12
Wednesday, April 20, 2011 12
33. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
• Recover readability of system properties on the whole
• Separate responsibilities for behaviour and domain
DCI 12
Wednesday, April 20, 2011 12
34. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
• Recover readability of system properties on the whole
• Separate responsibilities for behaviour and domain
• Behaviour: what the system does
DCI 12
Wednesday, April 20, 2011 12
35. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
• Recover readability of system properties on the whole
• Separate responsibilities for behaviour and domain
• Behaviour: what the system does
• Domain: what the system is
DCI 12
Wednesday, April 20, 2011 12
36. DCI - aims
• Improve readability of a OO system
• Give system behaviour first-class status
• Recover readability of system properties on the whole
• Separate responsibilities for behaviour and domain
• Behaviour: what the system does
• Domain: what the system is
• Be close to people’s mental model
DCI 12
Wednesday, April 20, 2011 12
37. DCI - Data
DCI 13
Wednesday, April 20, 2011 13
38. DCI - Data
• What the system is
DCI 13
Wednesday, April 20, 2011 13
39. DCI - Data
• What the system is
• Relatively static with relations
DCI 13
Wednesday, April 20, 2011 13
40. DCI - Data
• What the system is
• Relatively static with relations
• Domain structure implemented with “conventional” classes
DCI 13
Wednesday, April 20, 2011 13
41. DCI - Data
• What the system is
• Relatively static with relations
• Domain structure implemented with “conventional” classes
• Typically it includes persistence
DCI 13
Wednesday, April 20, 2011 13
42. DCI - Data
• What the system is
• Relatively static with relations
• Domain structure implemented with “conventional” classes
• Typically it includes persistence
• Comes from the mental model of system stakeholders
DCI 13
Wednesday, April 20, 2011 13
43. DCI - Data
• What the system is
• Relatively static with relations
• Domain structure implemented with “conventional” classes
• Typically it includes persistence
• Comes from the mental model of system stakeholders
• Close to the “model” in MVC
DCI 13
Wednesday, April 20, 2011 13
44. DCI - Data
• What the system is
• Relatively static with relations
• Domain structure implemented with “conventional” classes
• Typically it includes persistence
• Comes from the mental model of system stakeholders
• Close to the “model” in MVC
• Example: BankAccount with increase(), decrease(); no deposit()
DCI 13
Wednesday, April 20, 2011 13
46. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
DCI 14
Wednesday, April 20, 2011 14
47. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
DCI 14
Wednesday, April 20, 2011 14
48. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
• Assign to each object one or more stateless roles
DCI 14
Wednesday, April 20, 2011 14
49. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
• Assign to each object one or more stateless roles
• Objects can have multiple roles at the same time
DCI 14
Wednesday, April 20, 2011 14
50. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
• Assign to each object one or more stateless roles
• Objects can have multiple roles at the same time
• Decompose the use case (etc...) into roles, not objects
DCI 14
Wednesday, April 20, 2011 14
51. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
• Assign to each object one or more stateless roles
• Objects can have multiple roles at the same time
• Decompose the use case (etc...) into roles, not objects
• Contrast this with polymorphism and classic OO decomposition
DCI 14
Wednesday, April 20, 2011 14
52. DCI - Context (and Roles)
• Associated to a use case, user story, scenario, or algorithm
• Identifies objects participating in a scenario
• Assign to each object one or more stateless roles
• Objects can have multiple roles at the same time
• Decompose the use case (etc...) into roles, not objects
• Contrast this with polymorphism and classic OO decomposition
• Example: MoneyTransfer with SrcAccount and DestAccount
DCI 14
Wednesday, April 20, 2011 14
59. DCI - Interaction
• What the system does
DCI 16
Wednesday, April 20, 2011 16
60. DCI - Interaction
• What the system does
• Occurs among roles, which act as adapters to objects
DCI 16
Wednesday, April 20, 2011 16
61. DCI - Interaction
• What the system does
• Occurs among roles, which act as adapters to objects
• Roles are bound in different ways for each context
DCI 16
Wednesday, April 20, 2011 16
62. DCI - Interaction
• What the system does
• Occurs among roles, which act as adapters to objects
• Roles are bound in different ways for each context
• Roles should be generic
DCI 16
Wednesday, April 20, 2011 16
63. DCI - Interaction
• What the system does
• Occurs among roles, which act as adapters to objects
• Roles are bound in different ways for each context
• Roles should be generic
• Roles life cycle is likely to be bound to a given interaction
DCI 16
Wednesday, April 20, 2011 16
64. DCI - Interaction
• What the system does
• Occurs among roles, which act as adapters to objects
• Roles are bound in different ways for each context
• Roles should be generic
• Roles life cycle is likely to be bound to a given interaction
• Interaction should be explicit given role nature, rather than
emergent as in (agile) OOD
DCI 16
Wednesday, April 20, 2011 16
66. DCI - Execution Model
• The Context finds object participants
DCI 17
Wednesday, April 20, 2011 17
67. DCI - Execution Model
• The Context finds object participants
• Then, it assigns (injects?) roles to them
DCI 17
Wednesday, April 20, 2011 17
68. DCI - Execution Model
• The Context finds object participants
• Then, it assigns (injects?) roles to them
• Roles find each other by type (methodless)
DCI 17
Wednesday, April 20, 2011 17
69. DCI - Execution Model
• The Context finds object participants
• Then, it assigns (injects?) roles to them
• Roles find each other by type (methodless)
• What about static languages and designs?
DCI 17
Wednesday, April 20, 2011 17
70. DCI - Execution Model
• The Context finds object participants
• Then, it assigns (injects?) roles to them
• Roles find each other by type (methodless)
• What about static languages and designs?
• Then, it invokes a method on the first role
DCI 17
Wednesday, April 20, 2011 17
71. DCI - Execution Model
• The Context finds object participants
• Then, it assigns (injects?) roles to them
• Roles find each other by type (methodless)
• What about static languages and designs?
• Then, it invokes a method on the first role
• Interaction goes on among other roles
DCI 17
Wednesday, April 20, 2011 17
72. DCI - How to
implement?
Wednesday, April 20, 2011 18
74. Some design issues
• Static vs dynamic
DCI 19
Wednesday, April 20, 2011 19
75. Some design issues
• Static vs dynamic
• Traits, Mix-ins
DCI 19
Wednesday, April 20, 2011 19
76. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
DCI 19
Wednesday, April 20, 2011 19
77. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
DCI 19
Wednesday, April 20, 2011 19
78. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
• Which is the identity of an object that becomes a cluster of roles
DCI 19
Wednesday, April 20, 2011 19
79. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
• Which is the identity of an object that becomes a cluster of roles
• Partly solved by the clear separation object (stateful) / role
(stateless)
DCI 19
Wednesday, April 20, 2011 19
80. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
• Which is the identity of an object that becomes a cluster of roles
• Partly solved by the clear separation object (stateful) / role
(stateless)
• What about equals() / hashcode()?
DCI 19
Wednesday, April 20, 2011 19
81. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
• Which is the identity of an object that becomes a cluster of roles
• Partly solved by the clear separation object (stateful) / role
(stateless)
• What about equals() / hashcode()?
• Problem: anemic objects
DCI 19
Wednesday, April 20, 2011 19
82. Some design issues
• Static vs dynamic
• Traits, Mix-ins
• AOP, annotations (e.g. Qi4J)
• Problems: schizophrenia
• Which is the identity of an object that becomes a cluster of roles
• Partly solved by the clear separation object (stateful) / role
(stateless)
• What about equals() / hashcode()?
• Problem: anemic objects
• Really a problem in this perspective?
DCI 19
Wednesday, April 20, 2011 19
84. Designing with DCI
• First, acknowledge that DCI is a best practice
DCI 20
Wednesday, April 20, 2011 20
85. Designing with DCI
• First, acknowledge that DCI is a best practice
• Some languages can fit better than others
DCI 20
Wednesday, April 20, 2011 20
86. Designing with DCI
• First, acknowledge that DCI is a best practice
• Some languages can fit better than others
• Frameworks might help... but they force a new nature
DCI 20
Wednesday, April 20, 2011 20
87. Designing with DCI
• First, acknowledge that DCI is a best practice
• Some languages can fit better than others
• Frameworks might help... but they force a new nature
• My point: DCI must be addressed in design
DCI 20
Wednesday, April 20, 2011 20
96. Abstracting and sweetening
• Would be nice to be technology independent
• Would be nice to have some syntactic sugar
DCI 29
Wednesday, April 20, 2011 29
98. as()
• From Role role = object.getLookup().lookup(Role.class) ...
DCI 30
Wednesday, April 20, 2011 30
99. as()
• From Role role = object.getLookup().lookup(Role.class) ...
• ... to Role role = object.as(Role);
DCI 30
Wednesday, April 20, 2011 30
100. as()
• From Role role = object.getLookup().lookup(Role.class) ...
• ... to Role role = object.as(Role);
• As a wrapper around Lookup
DCI 30
Wednesday, April 20, 2011 30
101. as()
• From Role role = object.getLookup().lookup(Role.class) ...
• ... to Role role = object.as(Role);
• As a wrapper around Lookup
• With annotations and Lombok
DCI 30
Wednesday, April 20, 2011 30
102. as()
• From Role role = object.getLookup().lookup(Role.class) ...
• ... to Role role = object.as(Role);
• As a wrapper around Lookup
• @AsCapable
With annotations and Lombok
public class MyObject
{
@Role
private Role1 r1 = new Role1();
@Role // lazy
private Provider<Role> r2 = ...;
DCI
} 30
Wednesday, April 20, 2011 30
103. Q &A
• Question Time
DCI 31
Wednesday, April 20, 2011 31