Design Patterns Application in UML
Design Patterns Application in UML
1 Introduction
Elisa Bertino (Ed.): ECOOP 2000, LNCS 1850, pp. 44–62, 2000.
c Springer-Verlag Berlin Heidelberg 2000
Design Patterns Application in UML 45
The UML community succumbed to the first temptation: the latest version
of the Unified Modeling Language [25] has improved the collaboration design
construct in order to provide better support for design patterns. Indeed, the two
conceptual levels provided by collaborations (i.e. parameterized collaboration
and collaboration usage) fit perfectly to model design patterns. At the general
level, a parameterized collaboration is able to represent the structure of the solu-
tion proposed by a pattern, which is enounced in generic terms. The application
of this solution i.e. the terminology and structure specification into a particular
context (so called instance or occurrence of a pattern) can be represented by
collaboration usages.
However, UML parameterized collaborations suffer from a lack of precision,
which constrains the effective benefits of tool support and makes the second
temptation less seductive.
Section 2 is dedicated to the representation of design patterns in UML, and
tackle a number of ambiguities that hinder tool support: Pattern occurrences
are presented in Sect. 2.1, and it is explained how the occurrences of a pattern
are linked to its general description in a precise way. The general description of
patterns is supported in UML through the notion of parameterized collaborati-
ons, and Sect. 2.2 is dedicated to the syntactic and semantic issues arising from
the use of collaborations in the context of design pattern. The limits of UML
collaborations are carefully analyzed in Sect. 2.3. Ideas to overcome the short-
comings of collaborations are sketched in Sect.2.4, providing some guide-lines to
model the “essence” of design patterns more accurately.
Once the most important issues pertaining to the presentation of design pat-
terns in UML have been pointed out, better modeling of design pattern becomes
possible. Effective tool support for UML design patterns is proposed in Sect. 3.
Section 3.1 presents the main features that a user is likely to expect from an
effective design pattern tool. Relying on the transformation framework provi-
ded by the UMLAUT prototype (presented in Sect. 3.2), we show in Sect. 3.3
how a metaprogramming approach allows for powerful manipulations of design
patterns, easing the task of designers significantly.
Had it not provided some support for the notion of pattern, it would have been
hardly possible for UML to sustain its role as a unifying notation for object-
oriented modeling. Therefore the abundant documentation on UML has sections
wholly dedicated to patterns. Figure 1 presents an example of what represents
an occurrence of the Composite design pattern, as given in the UML Reference
Guide [26]:
The UML 1.3 notation for occurrences of design patterns is in the form of
a dashed ellipse connected by dashed lines to the classes that participate in the
pattern.
46 G. Sunyé, A. Le Guennec, and J.-M. Jézéquel
Graphic
Component
Component
Leaf
Rectangle Picture
Composite
The interpretation of this model seems obvious, even though the Composite
design pattern has been (erroneously) renamed as “Component”: a Picture is
composed of a set of Graphics (Rectangles or other Pictures). Objects instances
of class Rectangle can only play the role of a Leaf, and hence cannot contain other
Graphics. An experienced designer will also understand that Picture implements
methods that will forward every message it receives to its components. In the
context of this pattern occurrence, adding another class (say Circle) that also
plays the Leaf role looks simple: Figure 28-4 in the UML User Manual [3] shows
an example of a similar pattern occurrence, where a same role is assigned to
different classes, by simply using as many dashed lines with the same label as
necessary.
However, a small remark on that same page explains that “these [two] classes
are bound a little differently than the others”. This is an evidence that the
apparent simplicity actually hides a lot of complex representation issues (see
section 2.3 for a detailed discussion). Of course, the user should be shielded
from those details, but the UML tool designer is not.
Note that Fig. 1 does not explain how implementation trade-offs are set
and what the benefits of representing an occurrence of a design pattern are,
other than for documentation purposes. Actually, UML does not support the
representation of implementation trade-offs. The designer has no other choice
but using comments to point these out.
Of course, the designer can reuse the pattern occurrence symbol for a given
pattern any number of times, with a different binding for each new context in
which the pattern appears (UML User Manual [3], p.388).
So far we have only seen how a pattern occurrence is made explicit in a model
thanks to the dashed ellipse symbol. Two fundamental issues still remain to be
solved:
Design Patterns Application in UML 47
Although this is not strictly required (as explained in [25] p.2-113) any object
that is an instance of a role’s base classifier will by definition conform to this
role.
On page 199 of [26], the authors propose a model for the Composite design
pattern [11] (cf Fig. 2). This model is composed of three roles (Component,
Component
Required
generalization
Leaf Composite
The parameterized collaborations cannot however be bound with just any actual
classes. The participant classes must respect the fundamental constraints of the
pattern. Several kinds of constraints can be imposed by the collaboration using
a set of constraining elements:
UML version of constraint genericity. For example, the classes acting as bases
for the role Composite and Leaf must be specializations of the class acting
as base for the role Component. The inheritance relationship between actual
classifiers imposed by such a constraint need not be direct, though.
– An association among two (formal generic) base classifiers means that a
similar association must also exist between the two corresponding actual
classifiers used in any binding of the collaboration. Such associations among
base classifiers are very likely to act as bases for association roles within the
collaboration.
(...) for the common case of parameterized roles, the template is bound
by specifying a class for each role.
This can lead the readers to think that the template parameters are the classifier
roles, when only base classifiers of the roles actually are template parameters (if
a role were a template parameter, then the corresponding actual argument of
the binding should also be a role, not simply a classifier. This is possible only if
the binding is nested within a broader collaboration that will provide the actual
role).
Unfortunately, this is not as obvious as one can think. Indeed, the normal
mapping of the pattern occurrence symbol is to bind exactly one actual class
to exactly one template parameter (which is the base for a role). With bindings
as defined in UML 1.3, it does not make any sense to provide several actual
arguments for one template parameter. Moreover, templates have a fixed num-
ber of template parameters. As already mentioned in section 2.1, [3] avoids the
problem by saying that the binding is different in this case: the dashed lines
are supposed to map to generalization links which automatically turn all ac-
tual arguments into subclasses of a common class (respectively named Leaf and
Command) provided by the collaboration itself. This exception to the normal
mapping rule is rather confusing: note how the Leaf and Command classes are
still represented in the upper-right corner of the collaboration symbol, as if they
were still template parameters.
We argue that this proposed solution is more an ad-hoc workaround than a
generalizable principle: it is applicable only because adding new classes during
the binding for the Leaf or the Command roles does not really add any supple-
mentary constraints on the structure of the design pattern solution. The only
new information provided is that new kinds of objects can play these roles in the
collaborations at run-time. It is remarkable that all examples of design patterns
that we found in the UML literature are patterns for which this workaround is
applicable.
But let us think about modeling the Visitor design pattern [11] in UML, an
occurrence of which is given in Fig. 4. A parameterized collaboration will not be
sufficient to represent “the” general solution, because the number of template
parameters representing the nodes of the structure to be visited is frozen. But
this number of nodes impacts the whole structure of the pattern, since the Visitor
class must have the right number of accept operations.
We cannot address this problem with a simple workaround. We need to ex-
press constraints on the pattern that require full reflexive capability (if only to
check the number of operations for example). Giving OCL expressions access to
the meta-level (which is not normally accessible from user models) is a promising
way to resolve the issue. The standard <<metaclass>> and <<powertype>>
UML stereotypes might also prove useful as hooks into the meta-level.
The notion of base is ad hoc We have seen that the notion of base classifier of
a role was at the heart of design pattern definition in UML, since roles are defined
with respect to their base, and reusability is provided by making these bases
formal parameters of the collaboration which then becomes a generic template.
We have also just seen that this use of bases as template parameters seriously
complicates the way roles are specified in terms of available features, and suffers
from the inherent limitations of template instantiations (e.g., fixed number of
parameters in a UML Binding).
These problems suggest that the notion of base is probably not the right way
to relate roles and classifiers of objects that will conform to the roles. Making
roles dependent on pre-existing, “external”, base classifiers when they could have
stood on their own, looks suspicious. These dependencies impair the reusability
of the collaborations, since they can’t be reused without the corresponding bases,
and they require clairvoyance on the part of the designer if several design patterns
are to be combined (they might need shared bases).
The dependency between roles and classifiers should actually be in the oppo-
site direction, as it is very likely that the classifier of an object will be designed
by first carefully considering all the roles that the object may play in the various
collaborations of the system. Hence the classifier of this object will be obtained
by merging the roles’ specifications, not the other way round.
Design Patterns Application in UML 53
The UML notion of Realization would be more appropriate than the notion of
Binding of template parameters to express the fact that a given classifier realizes
a set of roles. Moreover, realizations can specify a mapping expression to describe
precisely how the classifier should realize the roles. We are investigating how the
transformation functions proposed in section 3.3 would fit in this context.
On the one hand, the various limitations listed above make it impossible for
UML parameterized collaborations to precisely specify some of the more inte-
resting constraints of design patterns. Their expressive power is limited to the
prescription of associations and generalization links, and to a certain extent, the
availability of features. Undoubtedly, more sophisticated constraints need access
to the UML meta-model.
On the other hand, the static structure of collaborations (and of associated
interactions if they are not considered as constraints) entails many choices that
are not fundamental to a pattern itself, but are specific of some of its reified
solutions. This prevents UML collaborations from representing only the essence
of a pattern, free of any premature choices. All diagrams representing patterns
or pattern occurrences in the UML literature fall short of this ambitious goal
because of the over-specification side-effect of collaborations.
The essence of a pattern is what Eden [8] calls a “leitmotiv”, that is, the
intrinsic properties of a pattern and nothing more. These properties are common
to all variants of a given pattern reification. Therefore, they should be expressed
as general constraints over such reifications, which presumably involves meta-
level OCL-like expressions and temporal logics.
How an enhanced OCL would fit together with UML collaborations and gene-
ricity to fully represent the essence of a pattern is at the heart of accurate UML
specifications of patterns, and is still an active research topics of the authors.
A transformation tool would ideally provide this level of pattern modeling,
and would help the user solve the corresponding constraints (or offer trans-
formations implementing them, with meta-programs). The next section further
elaborate on this idea of sophisticated tool support for UML design patterns.
The goal behind the above study of parameterized collaborations (and their li-
mits) is to provide effective support for design patterns in a UML tool. But before
extending the description of automatic design patterns implementation, let us
dispel some possible misunderstanding concerning the integration of pattern in
a CASE tool. According to James Coplien [7] p. 30 - patterns should not, can not
and will not replace programmers - , our goal is not to replace programmers nor
designers but to support them. We are not attempting to detect the need of a
design pattern application but to help designers to explicitly manifest this need
and therefore abstract intricate details. We are also not trying to discover which
54 G. Sunyé, A. Le Guennec, and J.-M. Jézéquel
– Recognition: In this approach, the tool recognizes that a set of classes, me-
thods and attributes corresponds to a design pattern application and points
this out to the designer;
– Generation: Here, the designer chooses a pattern she wants to apply, the
participant classes and some implementation trade-off and receives the cor-
responding source code;
– Reconstruction: The former approaches can be merged into this third ap-
proach. Here, the tool modifies a set of classes that looks like a pattern
application into an effective pattern application. This modification implies
the addition or modification of classes, attributes and methods.
Since our goal is to integrate design patterns into a UML tool and therefore
adopt a generative approach, our present interest concerns only the last two
approaches.
The idea behind the second approach is that the pattern solution could be
seen as a sequence of steps. Therefore, a pattern implementation would be obtai-
ned if the tool follows these steps. Actually, the implementation is more compli-
cated than that since the tool should verify if the pattern has not already been
partially implemented. Moreover, the solution is not unique, the implementation
may change according to certain trade-offs.
The third approach is very close to Opdyke’s refactorings [19], i.e. operations
that modify the source code of an application without changing its behavior.
One of the many difficulties of this approach is that design patterns specify a set
of solutions to a problem, but do not (or rarely do) specify a common situation
to which the pattern should be applied. This seems to be reasonable, since the
problem described by a pattern can be solved in several other manners and it
would be impossible to catalog each manner.
Another approach, which was not enumerated by Florijn et al. concerns de-
sign patterns validation. More precisely, design patterns have implicit constraints
that could be automatically verified. For instance, in the Observer pattern, a tool
could verify if every method that modifies the subject also notifies its observers.
In our perspective, a design tool that support design patterns should, on
one hand, provide high level transformations that help designers to apply a
design pattern and, on the other hand, ensure that the applied solution remains
consistent during the design process. In the next sections, we will further explain
what exactly we want our tool to do.
Design Patterns Application in UML 55
In order to further describe the rationale behind our pattern tool, let us take
the role of a designer using her favorite UML CASE tool. More specifically, she
is in the middle of the design of her application and her model contains many
classes and operations.
Suppose that she now decides to apply a specific design pattern to her model.
This could be done in two different ways.
The first way is to select a class and choose the transformation she wants to
apply to this class. In this case, the designer knows exactly what she wants to do
and uses the pattern application as a macro. This transformation could be, for
instance, the creation of a Composite class (i.e. the application of the Composite
pattern). The tool will automatically create a new class, an association between
the new class and the selected one and a set of forwarding methods in the
new class. At the same time, the tool will create an usage of the Composite
collaboration (defined previously) and assign the composite role to the new class
and the component role to the selected class. This approach will be further
explained in section 3.3.
The second way consists in creating an usage of a collaboration, which cor-
responds to the pattern she wants to use. In this case, she has already applied
(partially or not) this pattern to her classes and wants to document it. She
will manually determinate which classes participate to this pattern occurrence.
Then, the tool will try to automatically bind non-specified participants (clas-
ses, features, associations, etc.) to the collaboration, and ask for the designer
validation.
From then on, all the constraints inherent to the chosen pattern should be
continuously checked as a background process. Any unsatisfied constraint should
be clearly indicated: For each of them, an item would appear in a “to-do list”,
describing the action the user should take in order to make the pattern appli-
cation complete and correct. To the extent that it is possible, the tool should
propose some semi-automatic steps, to relief the user as much as possible. As
soon as all constraints are satisfied, the user can proceed with code generation
to obtain the final application.
In the context of the theory of lists, it has been shown that any operation
can be expressed as the algebraic composition of a small number of polymorphic
operations like map, filter and reduce [2].
The transformation process can be generalized into three stages: element
selection, element processing and reductive validation. We can re-apply the first
two stages repeatedly using composition of map and filter to achieve the desired
results.
ParseNode
+ opti mi ze()
+ generate()
One may accurately notice that this transformation approach is not valid
for every design pattern, since only a few patterns (e.g. Bridge, Proxy) mention
an existing situation to which the pattern should be applied. This is true, this
approach is not and does not intend to be universal. Our prime intent here is
to provide UML designers meta-programming facilities that we believe every
software designer should have [24].
The above reference to Smalltalk refactorings is not naive; we are strongly
convinced that every development tool should have such facility and that this fa-
cility can help developers to apply design patterns. However, refactorings cannot
be directly translated to UML for two reasons. First, refactorings were defined
for programming languages and UML has several modeling constructs other than
Design Patterns Application in UML 57
ParseNode
+ acceptVisitor(pnv : ParseNodeVisitor)
ParseNodeVisitor
+ acceptFromVariableNode(pn : VariableNode)
+ acceptFromConstantNode(pn : ConstantNode)
+ acceptFromAssignmentNode(pn : AssignmentNode)
+ acceptFromLoopNode(pn : LoopNode)
OptimizeVisitor GenerateVisitor
classes, methods and variables. Second, the behavior of a UML method is de-
scribed by a few diagrams and constraints whilst refactorings operate directly
over Smalltalk code. Hence, some refactorings should be changed and new ones
must be defined. Nevertheless, there is at least one advantage of using UML:
OCL [29] can easily be used to define refactorings pre and post conditions. For
instance, the addClass() refactoring [22] can be defined as:
Package : : a d d C l a s s ( newClass : Name , s u p e r c l a s s e s ,
s u b c l a s s e s : Set ( Class ) ) : Class
pre :
not s e l f . a l l C l a s s e s ()−> e x i s t s ( name=newClass ) and
s u b c l a s s e s−>f o r A l l ( each | each . a l l S u p e r T y p e s ()−>
includesAll ( superclasses ))
post :
r e s u l t . name = newClass
s e l f . a l l C l a s s e s ()−> i n c l u d e s ( r e s u l t ) and
s e l f . c l a s s R e f e r e n c e s ( r e s u l t )−>isEmpty and
r e s u l t . a l l S u p e r T y p e s ()−> i n t e r s e c t i o n ( s u p e r c l a s s e s )−> s i z e ( ) =
r e s u l t . a l l S u p e r T y p e s ()−> s i z e ( ) and
r e s u l t . a l l S u b T y p e s ()−> i n t e r s e c t i o n ( s u b c l a s s e s )−> s i z e ( ) =
r e s u l t . a l l S u b T y p e s ()−> s i z e ( )
This function is interpreted as follows: a new class can be added to a package
if this package does not already have a class named as the new one and if the
future subclasses of the new class are subclasses of its future super-classes. After
the class addition, the package will contain a class named as the new class, there
58 G. Sunyé, A. Le Guennec, and J.-M. Jézéquel
will be no references to the new class and the list of the new class super-classes
will be exactly the same as the super-class list provided as a parameter.
We intend to allow designers to combine multiple refactorings in order to
represent design pattern applications. UMLAUT currently provides a transfor-
mation framework [13], where UML model transformations can be specified.
However, since this framework cannot be specialized at run-time (some compila-
tion is needed), we expect to use a syntax close to OCL to describe refactorings
and combine them.
To illustrate a transformation function, we present below a function which
specifies the application of the Visitor pattern. This example was copied, with a
few changes, from [23]. These changes were necessary since the original example
applies to Smalltalk code whilst here it applies to UML models:
Class : : addVisitor ()
actions :
l e t a b s t r a c t V i s i t o r :=
s e l f . package . addClass ( s e l f . name+’ V i s i t o r ’ , n i l , n i l ) .
s e l f . a l l O p e r a t i o n s ()−> f o r A l l ( o p e r a t i o n |
l e t c o n c r e t e V i s i t o r : = s e l f . package . addClass (
o p e r a t i o n . name+’ V i s i t o r ’ , a b s t r a c t V i s i t o r , n i l ) .
s e l f . a l l S u b T y p e s ()−> f o r A l l ( s u b c l a s s |
s u b c l a s s . a l l O p e r a t i o n s ()−> s e l e c t ( subop |
subop . h a s S a m e S i g n a t u r e ( o p e r a t i o n)−> f o r A l l ( op |
op . move ( c o n c r e t e V i s i t o r , ’ acceptFrom ’+ s u b c l a s s . name ) .
op . rename ( ’ a c c e p t V i s i t o r ’ ) .
op . pullUp ( ) ) ) ) ) .
This transformation applies to the class that is to play the role of element in
the Visitor pattern. Its application to the ParseNode class operates as follows.
At first, an abstract visitor class named ParseNodeVisitor is created. Then, for
each method of the ParseNode class, the transformation will:
4 Related Work
The rapid evolution of design patterns has been followed by several research
efforts on pattern-based tool development. These efforts pursue different goals,
such as: design pattern recognition [15] [5]); formal specification [18] [16] [1];
code reuse [27] [17]; and code generation [6] [28].
Design Patterns Application in UML 59
the pattern description and participant classes of this occurrence. After this,
Fred proposes a set of template methods (also presented by a working-list) that
should be completed to fully implement the pattern. Template methods describe
constraints concerning the behavior of participant classes.
Finally, Jan Bosch proposes LayOM [4], a layered object model. LayOM in-
tends to integrate design patterns, using an extended object model that supports
the concept of layers. More specifically, the layers encapsulate a set of objects
that intercept and treat sent messages. LayOM integrates two more concepts,
category and state. A category is an expression that describes the characteri-
stics of a set of possible clients, that should be treated likewise. A state is the
abstraction of the internal state of an object. Message interception, provided by
layers are appropriate to the implementation of some patterns, such as Adapter,
for instance. LayOM generates C++ code.
5 Conclusion
The extensive study of the solutions proposed throughout the UML literature
evidences many ambiguities in the use of parameterized collaborations and a
lack of semantic foundation preventing systematic analysis and manipulation of
design patterns in UML. We still consider however that sophisticated support
for design patterns in a UML tool is not out of reach.
The knowledge that we acquired throughout the former development of a
pattern implementation tool [28] and the implementation of the full UML meta-
model in UMLAUT was extremely valuable when we started working on tool
support for design patterns in UML. It helped us point out the crucial difficulties
paving the way of automatic implementation of design pattern.
Getting a good grasp of the complexity underlying UML parameterized colla-
borations is definitely not a simple task, especially when they are used in the
context of design patterns. We promptly searched for solutions in the abundant
UML literature, but did not get complete, unambiguous, authoritative answers.
Section 2 brings new insights on this topic, and also raises several issues for
which there is no satisfying solution yet.
Since parameterized collaborations are not totally adapted to model design
patterns, we now face a delicate choice between adapting the present semantics of
collaborations or extending the UML meta-model with new constructs to bridge
current semantic gaps. We are investigating this latter approach. in order to
provide a more accurate way of binding Design Patterns and their occurrences,
and a better support for implementation trade-offs and feature roles. In addition,
we are specifying a set of UML specific refactorings and implementing them using
our transformation framework.
In spite of our efforts, some questions are still left open:
First, keeping the binding between a general pattern description and the
participants in a particular occurrence up-to-date might be problematic if the
user is allowed to dynamically change the variant applied. Indeed, the set of
Design Patterns Application in UML 61
participants may also have to be changed, and so will the set of actual constraints
to be satisfied.
Second, checking for constraint satisfaction is likely to be largely undecidable,
or prohibitively expensive in term of computational resources. Model-checking
techniques might however provide useful results to check some behavioral con-
straints.
Third, automation of the step needed to satisfy a constraint is possible in
isolation, but when a modeling element takes part in more than one pattern
occurrence, the number of possibilities the tool could suggest quickly becomes
unmanageable.
At the present time, a working version of UMLAUT is freely available for
download1 . This version provides some model construction facilities, Eiffel code
generation and evaluation of OCL constraints.
References
1. P. S. C. Alencar, D. D. Cowan, and C. J. P. Lucena. A formal approach to archi-
tectural design patterns. In J. Woodcock M. C. Gaudel, editor, FME’96: Industrial
Benefit and Advances in Formal Methods, pages 576–594. Springer-Verlag LNCS
1051, 1996.
2. R. S. Bird. An introduction to the theory of lists. In M. Broy, editor, Logic of
Programming and Calculi of Discrete Design, pages 3–42. Springler-Verlag, 1987.
3. Grady Booch, James Rumbaugh, and Ivar Jacobson. The Unified Modeling Lan-
guage User Guide. Addison-Wesley, 1998.
4. Jan Bosch. Language support for design patterns. In TOOLS Europe’96, pages
197–210. Prentice-Hall, 1996.
5. K. Brown. Design reverse-engineering and automated design patterns detection in
Smalltalk. Technical Journal, 1995.
6. F. J. Budinsky, M. A. Finnie, J. M. Vlissides, and P. S. Yu. Automatic code
generation from design patterns. IBM Systems Journal, 35(2), 1996.
7. James O. Coplien. Software Patterns. SIGS Management Briefings. SIGS Books
& Multimedia, 1996.
8. Amnom H. Eden. Precise Specification of Design Patterns and Tool Support in
Their Application. PhD thesis, University of Tel Aviv, 1999.
9. Amnon H. Eden, Amiram Yehudai, and Joseph Gil. Patterns of the agenda. In
LSDF97: Workshop in conjunction with ECOOP’97, 1997.
10. Gert Florijn, Marco Meijers, and Pieter van Winsen. Tool support for object-
oriented patterns. In Mehmet Akşit and Satoshi Matsuoka, editors, ECOOP ’97 —
Object-Oriented Programming 11th European Conference, Jyväskylä, Finland, vo-
lume 1241 of Lecture Notes in Computer Science, pages 472–495. Springer-Verlag,
New York, N.Y., June 1997.
11. Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns:
Elements of Reusable Object-Oriented Software. Professional Computing Series.
Addison-Wesley, Reading, MA, 1995.
12. Markku Hakala, Juha Hautamäki, Jyrki Tuomi, Antti Viljamaa, and Jukka Volja-
maa. Pattern-oriented framework engineering using FRED. In ECOOP ’98—
Workshop reader on Object-Oriented Technology, Lecture Notes in Computer
Science, pages 105–109. Springer-Verlag, 1998.
1
http://www.irisa.fr/pampa/UMLAUT/
62 G. Sunyé, A. Le Guennec, and J.-M. Jézéquel
13. Jean-Marc Jézéquel, Wai Ming Ho, Alain Le Guennec, and François Pennaneac’h.
UMLAUT: an extendible UML transformation framework. In Robert J. Hall and
Ernst Tyugu, editors, Proc. of the 14th IEEE International Conference on Auto-
mated Software Engineering, ASE’99. IEEE, 1999.
14. Jung J. Kim and Kevin M. Benner. A design patterns experience: Lessons learned
and tool support. In Position Paper, Workshop on Patterns, ECOOP’95, Aarhus,
Denmark, 1995.
15. C. Krämer and L. Prechelt. Design recovery by automated search for structural
design patterns in object-oriented software. In Working Conference on Reverse
Engineering (WCRE’96). IEEE CS Press, 1996.
16. Anthony Lauder and Stuart Kent. Precise visual specification of design patterns.
In Eric Jul, editor, ECOOP ’98—Object-Oriented Programming, volume 1445 of
Lecture Notes in Computer Science, pages 114–134. Springer, 1998.
17. Marco Meijers. Tool Support for Object-Oriented Design Patterns. PhD thesis,
Utrecht University, 1996.
18. Tommi Mikkonen. Formalizing design patterns. In ICSE’98, pages 115–124. IEEE
CS Press, 1998.
19. William F. Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, Uni-
versity of Illinois, 1992.
20. Gunnar Övergaard. A formal approach to collaborations in the unified modeling
language. In Robert France and Bernhard Rumpe, editors, UML’99 - The Uni-
fied Modeling Language. Beyond the Standard. Second International Conference,
Fort Collins, CO, USA, October 28-30. 1999, Proceedings, volume 1723 of LNCS.
Springer, 1999.
21. S Ramakrishnan and J McGregor. Extending OCL to support temporal opera-
tors. In Proceedings of the 21st International Conference on Software Engineering
(ICSE99) Workshop on Testing Distributed Component-Based Systems (WM3),
Los Angeles, California, USA, May 1999. ACM press.
22. Don Roberts. Practical Analysis for Refactoring. PhD thesis, University of Illinois,
1999.
23. Don Roberts, John Brant, and Ralph Johnson. A refactoring tool for Smalltalk.
Theory and Practice of Object Systems, 3(4), 1997.
24. Don Roberts, John Brant, and Ralph Johnson. A refactoring tool for Smalltalk -
why every Smalltalker should use the Refactoring Browser. The Smalltalk Report,
14(10):4–11, 1997.
25. UML RTF. OMG Unified Modeling Language Specification, Version 1.3, UML
RTF proposed final revision. OMG, June 1999.
26. James Rumbaugh, Ivar Jacobson, and Grady Booch. The Unified Modeling Lan-
guage Reference Manual. Addison-Wesley, 1998.
27. Jiri Soukup. Implementing patterns. In J. O. Coplien and D. C. Schmidt, editors,
Pattern Languages of Program Design, pages 395–412. Addison-Wesley, Reading,
MA, 1995.
28. Gerson Sunyé. Génération de code à l’aide de patrons de conception. In Jacques
Malenfant and Roger Rousseau, editors, Langages et Modèles à Objets - LMO’99,
pages 163–178, Villeneuve s/ mer, 1999. Hermes. In French.
29. Jos Warmer and Anneke Kleppe. The Object Constraint Language: Precise Mode-
ling with UML. Addison-Wesley, 1998.