Law of Demeter

advertisement
Law of Demeter
Law of Demeter
• What is it: Style Rule for building systems.
• Proposed by my research group: The
Demeter Research Group in 1987,
published in 1988.
• Covered in many major books on OO
design and programming.
Law of Demeter Principle
• Each unit should only use a limited set
of other units: only units “closely”
related to the current unit.
• “Each unit should only talk to its friends.”
“Don’t talk to strangers.”
• Main Motivation: Control information
overload. We can only keep a limited set
of items in short-term memory.
Law of Demeter
FRIENDS
“closely related”
Application to OO
• Unit = method
– closely related =
• methods of class of this/self and other
argument classes
• methods of immediate part classes (classes that
are return types of methods of class of
this/self)
• In the following we talk about this
application of the Law of Demeter
Principle to OO: example follows in a few
slides.
Citibank Quote: Law of Demeter
• The Law of Demeter forms one of the
cornerstones of the design approach of
the Global Finance Application
Architecture (quote from: Global Finance
Application Architecture: Business Elements
Analysis, Oct. 1991, Citibank confidential
document)
• Widely used in big projects, for example, at
JPL for the Mars exploration software.
Jet Propulsion Laboratory(JPL)
Quote: Law of Demeter
• The Law of Demeter … has taken a firm
hold in many areas of JPL. Major systems
which have used LoD extensively include …
Mars Pathfinder Software (begun in 1993).
We are going to use LoD as a foundational
software engineering principle for the
X2000 Europa orbiter mission.
What others say about the Law
of Demeter
• Two examples:
– Booch
– Rumbaugh
Booch and the Law of Demeter
Context
Chapter: Classes and Objects, Section: On
Building Quality Classes and Objects,
Subsection: Choosing Relationships
Booch and the Law of Demeter
Quote: The basic effect of applying this Law
is the creation of loosely coupled
classes, whose implementation secrets
are encapsulated. Such classes are fairly
unencumbered, meaning that to
understand the meaning of one class, you
need not understand the details of
many other classes.
Rumbaugh and the Law of
Demeter
Context
Chapter: Programming Style, Section:
Extensibility
Rumbaugh and the Law of
Demeter
Quote: Avoid traversing multiple links or
methods. A method should have limited
knowledge of an object model. A method
must be able to traverse links to obtain its
neighbors and must be able to call
operations on them, but it should not
traverse a second link from the neighbor to
a third class.
Law of Demeter
(alternative formulation)
A method should have limited knowledge
of an object model.
Leads to another Demeter favorite: Use
grammars to define both class structure and
an application-specific language. See the
Structure-Shy Object Pattern.
Agreement that LoD Good Idea
• How to follow LoD: good solutions exist
but not widely known. Two approaches to
following LoD:
– OO approach
– Adaptive approaches
• Traversal support
• APPC
• DemeterJ
The Law of Demeter (cont.)
Violation of the Law
class A {public: void m(); P p(); B b; };
class B {public: C c; };
class C {public: void foo(); };
class P {public: Q q(); };
class Q {public: void bar(); };
void A::m() {
this.b.c.foo(); this.p().q().bar();}
Violations: Dataflow Diagram
m
B
A
foo()
2:c
1:b
C
4:q()
bar()
3:p()
P
Q
OO Following of LoD
m
foo2
B
A
foo()
c
1:b
C
2:foo2()
4:bar2()
bar2
bar()
3:p()
q()
P
Q
Adaptive Following of LoD
void A::m() {
(C)
Traversal.long_get(this,”A->C”).foo();
(Q)
Traversal.long_get(this,”A->Q”).bar();}
void A::m() {
this.b.c.foo(); this.p().q().bar();} // violation
Law of Demeter
FRIENDS
What if your friends are far
away?
• You pay them to travel to you or you send
an agent to them to collect the information
you need.
– Approximate Directions: You give them or
your agent directions about what kind of
information to collect but you don’t care about
accidental details of the travel.
– Detailed Directions: You give them or your
agent detailed travel directions.
Adaptive Following LoD
A
C
FRIENDS
a
S
X
b
a:From S to A
b:From S to B
c:From S via X to C
c
Traversal strategies create
friends
• Class Traversal is an intermediate class
between classes that need to
communicate
Traversal.long_get(Object o, Strategy s)
Are not friends for accidental
reasons
• Other classes exist for other reasons
• Ideal class graph: all are friends, even “far”
away classes.
Download