Digging into Use Case Relationships Gonzalo Génova, Juan Llorens, Víctor Quintana Computer Science Department, Carlos III University of Madrid, Avda. Universidad 30, 28911 Leganés (Madrid), Spain {ggenova, llorens}@inf.uc3m.es, victorq@ie.inf.uc3m.es http://www.inf.uc3m.es/ Abstract. Use case diagrams are one of the key concepts in the Unified Modeling Language, but their semantics and notation have some gaps that lead to frequent misunderstandings among practitioners, even about very basic questions. In this paper we address some issues regarding the relationships in which use cases may take part. The Include and Extend relationships between two use cases have presently an inconsistent definition, since they are represented as stereotyped dependencies, but they are not true dependencies in the metamodel. Besides, the direction of the dependency arrow in the Extend relationship can be misleading, unnatural and difficult to understand for the common practitioner. Finally, we show also some conceptual problems regarding the included or extending use cases, which in our opinion are not true use cases. Introduction There are two kinds of relationships in which use cases may take part in a use case diagram: relationships between two use cases, and relationships between a use case and an actor1. They are always binary relationships. There is something strange about relationships between two use cases, which are directed relationships from a source use case to a target use case. In the first versions of UML, up to version 1.1, they were modeled as stereotyped generalizations, named "uses" and "extends", following Jacobson’s original ideas [5]. After adoption by the OMG (Object Management Group) UML went through two revisions, and the old stereotyped «uses» and «extends» generalizations were quietly replaced in version 1.3 by the new stereotyped «include» and «extend» dependencies2, which have survived without change in version 1.4. Both the names and the semantics of the relationships were deliberately changed by the UML authors, but the whys and the hows were never widely explained to the general public [13, 15]. In fact, this change has introduced a conflict between the notation and the metamodel. The new relationships are graphically represented as stereotyped dependencies but, as we will show, they are not true dependencies in the metamodel, 1 A previous version of this paper contained a Section on the relationships between use cases and actors, but it had to be supressed due to space problems. 2 Whether they are dependencies, or not, is one of the main subjects of this paper. but direct subclasses of the Relationship metaclass. This is in itself a source of confusion about the true nature of these relationships. What kind of relationships are really «include» and «extend»? Should the metamodel or the notation prevail, or neither? There are other common misunderstandings about use case models that are induced by a lack of definition and a misleading notation in use case relationships. Even though some authors suggest that use case relationships should be confirmed as usage-dependencies [7], we think that dependency in itself is not a clear concept, used in UML rather as a supertype for everything that is neither generalization nor association [UML 2-33]. Practitioners very often complain about the perplexing direction of the «extend» dependency. Besides, we have observed a general tendency towards misinterpreting use case dependencies as control flow relationships between processes, leading to a confusion between use case diagrams and activity diagrams. Our rather drastic proposal is to avoid at all the decomposition of use cases by means of use case relationships, allowing only self-contained use cases that are directly connected with actors. The remainder of this paper is organized as follows. Section 2 explains in detail the conflict between notation and metamodel for use case relationships in the current version of UML. Section 3 examines the directionality of use case relationships, exposing some conceptual problems about the nature of these relationships. Finally, Section 4 proceeds by showing the risks of use case relationships for a correct understanding of a use case model. Since this is a conceptual research about the nature of use case relationships and their official definition, our main source has been The OMG Unified Modeling Language Specification [9], more briefly referred to as "The Standard". This document is properly the only one which is truly "official", but there are many semantic questions that are poorly explained in it, so that we have turned to the works of the original authors of the UML in search for a clarification: The Unified Modeling Language Reference Manual [12], which seemed an obvious choice, and The Unified Modeling Language User Guide [2]3. On the other side, we cite the User Guide not because we consider it a particularly reliable source, but because it is probably the main source for many modelers, so that we think it is important to show its virtues and deficiencies. We quote version 1.4 of the Standard, and we have checked that there have been no significant changes from version 1.3 regarding these topics. 3 In the remaining of this paper, these three references will be cited as "UML" for the UML Specification, "RM" for the UML Reference Manual, and "UG" for the UML User Guide, followed by page numbers. 1. A misleading notation for use case relationships 1.1. In UML version 1.1 In UML (up to version 1.1 [10, 11], before adoption by the OMG) there were two kinds of relationships between use cases: "extends" and "uses". They were both represented by generalization arrows, respectively labeled with the stereotypes «extends» or «uses» (see Figure 1). Place Order extension points «extends» additional requests «uses» «uses» «uses» Supply Customer Data Order Product Request Catalog Arrange Payment Figure 1. An example of use case relationships as stereotyped generalizations, extracted from UML Notation v1.1 [11] (p. 79) The metamodel for use cases (see Figure 2) was not very developed in version 1.1, so that these two relationships had not any prominent place in it: there didn’t exist any special metaclasses for them. Therefore, we must conclude that they were true stereotyped generalizations, available to the UseCase metaclass because it is a subclass of Classifier, which is a subclass of GeneralizableElement. The third wellformedness rule for use cases imposed that these were the only relationships allowed between use cases [10] (p. 92). realization * (From Core) classifier (From Common Behavior) specification * extensionPoint: list of String Figure 2. Metamodel of use cases, extracted from UML Semantics v1.1 [10] (p. 90) 1.2. In UML version 1.4 Because of the conceptual problems caused by the definition of relationships between use cases as generalizations, and the fact that developers completely disregarded the generalization semantics in the way they employed them [13, 14], UML later abandoned this approach in version 1.3 in favor of a more plausible definition, based on a notion of dependency which has survived without change in version 1.4. Nevertheless, this definition has not been made at all clear in the current version, as we are going to show: use case relationships are shown as dependencies, but they are not true dependencies. The former «uses» and «extends» stereotyped generalizations have supposedly evolved into «include» and «extend» stereotyped dependencies, whereas a new plain generalization is also allowed. In Figure 3 we can see the equivalent of Figure 1 in the new notation. Solid lines with hollow arrowheads (generalization) have been substituted by dashed lines with open arrowheads (dependency). Supply Customer Data Order Product «include» «include» Arrange Payment «include» Place Order Extension Points 1 Salesperson * additional requests : after creation of the order «extend» the salesperson asks for the catalog Request Catalog Figure 3. An example of use case relationships as stereotyped dependencies, extracted from UML Specification v1.4, p. 3-99. Compare with Figure 1. We have respected the original layouts in both diagrams, even though they are upside down and this could mislead the eye of the reader. Notice the differences in the descriptions of extensions and in the addition of an actor to the diagram. Indeed, this notation states that we are dealing now with some kind of dependency, as we were dealing before with some kind of inheritance. The User Guide defines these use case relationships as stereotypes of dependencies [UG 227, 228]. The Reference Manual also says that "an extend relationship is a kind of dependency" [RM 490], that an include relationship "is a dependency, not a generalization" [RM 491], and that "an extend relationship or an include relationship is shown by a dependency arrow" [RM 493]. Everything seems clear. What is the problem, then? Let’s have a closer look at the definitions in the Standard. Remarkably, the description of the notation for these two relationships carefully avoids either the word "dependency" or defining them as dependencies [UML 3-98]: "An extend relationship between use cases is shown by a dashed arrow with an open arrow-head from the use case providing the extension to the base use case. The arrow is labeled with the keyword «extend»." "An include relationship between use cases is shown by a dashed arrow with an open arrow-head from the base use case to the included use case. The arrow is labeled with the keyword «include»." A similar caution is not observed when describing the other possible relationship between use cases plainly as a generalization [UML 3-98]. These remarks could be disdained as non-significant subtleties, and a pragmatic position could be assumed: "they are represented as dependencies, so they are dependencies", but the point is that the metamodel itself does not define the use case relationships as dependencies. In fact, the metaclasses Extend and Include are direct subtypes of the metaclass Relationship (see Figure 4 and compare with Figure 2). ./ / 0 0 classifier (From Core) (From Common Behavior) !" # "$ . addition . 0 . 0 base include extension . extend )!" 0 0 extensionPoint . 0 (From Core) base #&% '('" location: LocationReference ./ / 0 extensionPoint {ordered} #*%! 0 condition: BooleanExpression + ," (From Core) Figure 4. Metamodel of use cases, extracted from UML Specification v1.4, p. 2-135. The Relationship metaclass did not yet exist in v1.1, it was introduced later as a supertype of all kinds of relationships (Flow, Generalization, Association, Dependency, etc.). The Dependency metaclass has its own subtypes; Include and Extend are not subtypes of Dependency, but direct subtypes of Relationship (see Figure 5). ! " #$%& ' ($ ) ,- . *+ (0/)%1) 2 3. 4%56 Figure 5. The Relationship metaclass and its subtypes, extracted from UML Specification v1.4, pp. 2-14, 2-15, 2-135. Aside from the graphical presentation of the metamodel, the Standard does not say that Include and Extend are dependencies, neither in the Abstract Syntax section [UML 2-136, 2-137], nor in the Detailed Semantics section [UML 2-143, 2-144], and the list of kinds of Dependency does not include them [UML 2-33, 3-91]. A stereotype is used in UML to extend the language with new modeling elements, which are derived from existing ones [UML 2-78] [8]. Predefined stereotypes are equivalent to subclasses in the metamodel [16] that inherit, among others, the notation of the parent class. For example, a «use» dependency in a model is possible because Usage is a subclass of Dependency in the metamodel, and it is represented with the same notation, a dashed arrow with open arrowhead, adding the stereotype’s keyword. In the case of Include and Extend, they are direct subtypes of Relationship, but they use the notation of Dependency instead, creating a conflict. From this scrutiny we can conclude that: According to the Standard, Include and Extend are intentionally not dependencies, but relationships on their own (direct subtypes of Relationship). The Standard is contradicted by the User Guide and the Reference Manual, where Include and Extend are defined as stereotyped dependencies. The Standard proposes a misleading notation, since it represents Include and Extend graphically as stereotyped dependencies; this is in itself a source of confusion. This conflict could be easily solved by changing the metamodel and making Include and Extend subtypes of Dependency. But, before taking this step, the true nature and convenience of these relationships must be enlightened. Besides, if Include and Extend are finally not dependencies, then the direction of the arrow should be established with a criterion that is not that of a dependency. 2. A misleading direction of dependency in the Extend relationship Include and Extend are said to be directed relationships [UML 2-136, 2-137], which is conveniently represented by an arrowhead on the corresponding end of the relationship. "The include relationship points at the use case to be included; the extend relationship points at the use case to be extended" [RM 66]. In other words, UML tells us to draw the arrow from the base to the inclusion (or addition, in terms of the metamodel, see Figure 4), and from the extension to the base (see Figure 7). Thus, in the «extend» relationship, the base of the relationship is not the base of the arrow. addition B base «include» A base «extend» C extension Figure 7. Include and Extend relationship arrows confronted with the underlying metamodel Perhaps not surprisingly, most people think intuitively that the «extend» arrow should go the same way round as the «include» arrow [17], that is, both arrows should point from the base case towards the inclusion or the extension. This is probably due to a poor understanding of the difference between these relationships by practitioners, a problem which has been denounced long ago, and about which even the experts disagree [4]. This difficulty is not completely solved by assuming that Include means reuse while Extend means insertion, or alternative, or exception, since these concepts are not that clearly independent: if B is reused by A, then in some way B is being inserted into A; if C is inserted into A, or is an alternative to A, or an exception, then in some way C is being reused by A (or, at least, "used"). We understand practitioners when they find difficulties in deciding whether they should use Include or Extend in their models. The difference between Include and Extend is understood by some authors as conditional versus unconditional insertion: a use case is inserted into another use case, in analogy with subroutine call semantics [1, 7]. In this way, the inserted use case is easily seen as an independent reusable, encapsulated module, while the base use case in which the insertion is made is seen as dependent on the insertion. With this notion in mind, practitioners are perplexed when they are told that they must draw the «extend» arrow in reverse direction: they do not see a true dependency in it. As a rule of thumb, one can think that the arrow goes from the "grammatical subject" to the "grammatical object" of the corresponding verb "include" or "extend". For example, in Figure 3 the Request Catalog use case extends the Place Order use case, which in turn includes the Order Product use case. But this "grammatical rule" that helps in drawing the arrows does not seem adequate to understand the true underlying dependencies between use cases. In fact, the same authors mentioned above [1, 7] think that there is not any fundamental difference between the Include and Extend relationships: they would be semantically equivalent. Extend would be considered "if (condition) then ...", whereas Include would be considered "if (TRUE) then ..." [7]; this would be consistent with the original idea of an extension being a guarded block of functionality that could be inserted into a main use case upon fulfillment of a certain condition [13], although Jacobson viewed the extensions as interrupts rather than branches [5]. If they were truly equivalent, both relationships could be collapsed into a single relationship analogous to what the OPEN/OML approach calls the "invokes" relationship [3], and of course they should be drawn in the same direction. In order to establish the rightness of this approach, the true dependencies underlying Include and Extend must be exposed, which will lead to a better understanding of these relationships, their similarities, and their differences. Include. According to the Reference Manual, "the base use case can see the inclusion and can depend on the effects of performing the inclusion, but neither the base nor the inclusion may access each other’s attributes" [RM 297]. This indicates a dependency from the base to the inclusion, as the arrow accordingly states4. Extend. On the other side, "an extension use case in an extend relationship may access or modify attributes defined by the base use case. The base use case, however, cannot see the extensions and may not access their attributes or operations. The base use case defines a modular framework into which extensions can be added, but the base does not have visibility of the extensions" [RM 273]. That is, the base use case defines the extension points in which it would accept extensions, but it knows nothing more about these extensions. This indicates a dependency from the extension to the base, as the UML authors advocate. In consequence with these definitions, the dependencies seem to be rightly expressed in UML: the base use case sees the inclusion and is seen by the extension. We can compare Include to a go-to instruction (Place Order performs a go-to Order Product), whereas Extend is to be compared rather with a come-from instruction (Request Catalog performs a come-from Place Order). Even if we accepted that the dependencies are right, the whole scheme is rather unnatural and difficult to understand for the common practitioner. Nevertheless, in the Extend dependency the base use case must define the extension points, which makes it not completely independent of the extending use cases. In addition, other authors [13, 14] think that making the variant or exceptional behavior depend on the normal behavior is not a logical dependency, but an artifact of the order followed in the analysis procedure (first write the normal cases, then write the extensions on separate sheets and state where in the normal cases they should be 4 Unfortunately, some lines below in the same page, we read: "The inclusion use case may access attributes or operations of the base use case", which contradicts the previous statement and would induce a dependency from the inclusion to the base. We think this is a weird error in the text, since it prevents the desired encapsulation and reuse semantics, as stated right after: "The inclusion represents encapsulated behavior that potentially can be reused in multiple base use cases". inserted): this is like saying that all branches of a multi-branch statement depend logically on one distinguished branch. In this view the «extend» arrow points in the wrong direction (from the extensions to the base) but the right direction would not be the reverse one (from the base to the extensions). Instead, a radically different scheme must be followed: from a superordinate selection node to the base and all the extensions equally. Unfortunately, this scheme is adequate for modeling alternatives, but it is less adequate for insertions, and it is not adequate for exceptions. Strangely, the current version of the metamodel does not provide an InclusionPoint metaclass for the Include relationship, to represent the place where the inclusion takes place, equivalent to the ExtensionPoint for the Extend relationship (see Figure 4), even though this is a natural concept and it is even mentioned in the Reference Manual [RM 297, 491]. There is another more fundamental difference between the inclusion and the extension that prevents a true equivalence among them. In the «include» relationship, the included use case is inserted at one location in the base use case and represents encapsulated behavior [UML 2-143]; it follows a subroutine call semantics [6]. Conversely, in an «extend» relationship, upon fulfillment of a single condition, the different fragments of behavior defined in the extension are inserted simultaneously and coordinatedly at different locations in the base use case [UML 2144]; therefore, it follows interleaving semantics [6], and consequently the extension does not define any encapsulated behavior. The problems of interleaving semantics have already been exposed [6]: interleaving violates encapsulation and other fundamental principles of object-orientation, a fault that should be more than enough to discard interleaving and promote subroutine call semantics (that is, encapsulation) also for extend relationships. In the kingdom of encapsulation, interleaving semantics is not easy to understand. 3. The risks of use case relationships A use case execution is commonly considered a use case instance [5, 6, 13, 14], that is, "the performance of a sequence of actions specified in a use case" [UML 2138]. In earlier works on use cases [5], inclusions and extensions were called "abstract" use cases, because they were not instantiable (that is, they were not full and independent external software services), in contrast with "concrete" use cases, which were directly connected with actors and represented a complete service offered to an actor. That is, when an actor requires a service from a concrete use case that has an abstract use case included in it or extending it, there is only one running instance, that of the concrete use case. The concrete use case completes its description with that of the included or extending abstract use case; this "usage dependency" exists only at the classifier level, there isn’t any relationship between use case instances. The term "abstract use case" is reminiscent of the time in which use case relationships were stereotyped generalizations, and it has been abandoned in the current version of UML5. Therefore, in order to avoid this term, which is particularly misleading, we are 5 That is, the term "abstract use case" does not mean any more an included or extending use case. Of course, since use cases are classifiers, there may exist "abstract" use cases in the going to use the terms "primary use case" and "secondary use case". Primary use cases are directly connected to actors, whereas secondary use cases are inclusions and extensions. In this section we are going to challenge the notion of "use case relationship". The noble intention behind inclusions and extensions is removing redundancy from the documentation: "Organizing your use cases by extracting common behavior (through include relationships) and distinguishing variants (through extend relationships) is an important part of creating a simple, balanced, and understandable set of use cases for your system" [UG 228]. However, this intention fails due to several reasons. First of all, secondary use cases are not true use cases. Let’s have a look at some definitions. A use case is "a description of a set of sequences of actions, including variants, that a system performs to yield an observable result of value to an actor" [UG 222], "the specification of sequences of actions, including variant sequences and error sequences, that a system, subsystem, or class can perform by interacting with outside actors" [RM 488]. "Each use case specifies a service the entity provides to its users; that is, a specific way of using the entity. The service, which is initiated by a user, is a complete sequence" [UML 2-141]. "A pragmatic rule of use when defining use cases is that each use case should yield some kind of observable result of value to (at least) one of its actors. This ensures that the use cases are complete specifications and not just fragments" [UML 2-145]. Let’s see why these definitions are not satisfied by "secondary use cases": Included use case. Its purpose is to factor out and reuse common behavior among use cases. As a description of encapsulated behavior [UML 2-143], it could be designed to be a complete sequence that yields an observable result to the actor. However, it is more probable that it is an incomplete sequence that yields only a partial result, more easily reused by several primary use cases: "A use case can simply incorporate the behavior of other use cases as fragments of its own behavior. This is called an include relationship" [RM 66]. It is not that easy that a fragment of behavior can be at the same time a complete behavior. Typically, an included use case is not directly connected to an actor, but only indirectly through a primary use case6. An included use case does not interact with the actor, it does not specify a full service (a complete sequence of interactions), and it does not yield an observable result, therefore it is not a true use case. Extending use case. Its purpose is to distinguish variant behavior from the primary use case. Originally, the extend relationship was intended to represent insertions as well as alternatives and exceptions, but it has been general sense applied to any classifier, but these abstract use cases must not be confounded with included or extending use cases. A true abstract use case would be indirectly instantiable via its subclasses, but this is not the pretended meaning for inclusions or extensions. 6 However, the Reference Manual contains an example [RM 27] of an included use case "make charges" that is simultaneously connected to an actor "credit card service", that is, a use case that is both primary and secondary, being therefore instantiable and non-instantiable at the same time. We doubt that this example is realistic. We think rather that this actor should be connected to a different primary use case, which would include the "make charges" secondary use case. shown that insertion semantics is inadequate to model exceptions and alternatives [13, 14]. In addition to the arguments given for the included use case, which are valid here too, an extending use case may contain different fragments of behavior to be inserted into different locations (interleaving semantics), what makes it even harder to consider the extending use case as an independent external service. Summing up, secondary use cases are not true use cases simply because they do not specify a service that a system gives to an actor. If, having observed "commonalities between use cases" [UML 2-143] or variant behaviors, we want to organize and simplify the set of use cases, a different concept must be defined in the metamodel, such as "common functionality" or "variant functionality"; otherwise, the definition of "use case" as "a coherent unit of functionality" [UML 3-96] must be changed to admit services or functions that are incomplete or that are not directly related to the actors. Finally, the representation of secondary use cases in a model, or "common functionalities", has other, maybe worse, risks. In our opinion, the use of dependencylike use case relationships and, consequently, use cases that are not complete and selfcontained, convey a dangerous twist towards the expression of sequential processing, or flow of control, in a use case diagram. We think that the goal of use cases is to express self-contained functionality, without expressing any sequence between those functionalities. Otherwise, these functionalities become processes that invoke one another. We have observed this phenomenon in many practitioners: they fail to understand a use case diagram because they see rather an activity diagram, or a process decomposition diagram. Conclusions In our experience in using and teaching UML we have learned that, against what it would seem at first sight, it is not that easy to represent a system’s functionality by means of use case diagrams. There are some very basic questions about the meaning of the symbols in the diagram that do not have an easy answer, such as what is the meaning of a use case that is not directly connected to an actor, what is the meaning of the arrows between use cases, why is the arrow for the Extend relationship "in the reverse" direction, and so on. After the last revisions of UML (currently 1.4), use case relationships have been put in an inconsistent state: they have the notation of stereotyped dependencies, but the semantics defined in the metamodel is not that of a dependency. It seems that a simple change in the metamodel would amend this contradiction, but before taking this step the true nature and convenience of use case relationships must be examined. The direction of the dependency in the Extend relationship is misleading. Even if it were shown to be correct, it is nevertheless unnatural and difficult to understand for the common practitioner. Some authors propose a fundamental equivalence between Extend and Include, understood as conditional versus unconditional insertion. But this cannot be true in the present state of the language, since Extend’s direction is opposite to Include’s, and more fundamentaly because of the interleaving semantics of the Extend relationship. An InclusionPoint metaclass should be added to the metamodel to complete the equivalence, too. Moreover, we have challenged the utility of these relationships. We have shown that included or extending use cases are not true use cases, because they are not complete and coherent units of functionality that yield an observable result to the actor. Besides, there is a danger to take the intended dependencies for control-flow relationships, leading to the confusion between use case diagrams and activity diagrams. Acknowledgements The authors would like to give thanks to Anthony Simons and especially to Pierre Metz for the interesting personal communications that have served as food for thought in conceiving and writing this paper. The anonymous reviewers have also provided valuable ideas and suggestions. References 1. Klaas van der Berg, Anthony J.H. Simons. "Control-Flow Semantics of Use Cases in UML". Information and Software Technology, 41(10):651-659, July 1999. 2. Grady Booch, James Rumbaugh, Ivar Jacobson. The Unified Modeling Language User Guide. Addison-Wesley, 1998. 3. Donald Firesmith, Brian Henderson-Sellers, Ian Graham. The OPEN Modeling Language (OML) Reference Manual. Cambridge University Press, 1998. 4. Martin Fowler, Alistair Cockburn, Ivan Jacobson, Bruce Anderson, Ian Graham. "Question Time! Abount Use Cases", Proceeding of the 13th ACM Conference on Object-Oriented Programming, Systems, Languages and Applications-OOPSLA’98, October 18-22, 1998, Vancouver, British Columbia, Canada. ACM SIGPLAN Notices, 33(10):226-229. 5. Ivar Jacobson, M. Christerson, P. Jonsson, G. Övergaard, Object-Oriented Software Engineering: a Use Case Driven Approach, Addison Wesley, 1992. 6. Pierre Metz. "Against Use Case Interleaving", The Fourth International Conference on the Unified Modeling Language-UML’2001, October 1-5, 2001, Toronto, Ontario, Canada. Springer Verlag, Lecture Notes in Computer Science 2185, pp. 472-486. 7. Pierre Metz. Personal communications to the authors, October 28th and December 16th, 2001. 8. Joaquin Miller. Post to the Precise UML Group Mailing List (http://www.cs.york.ac.uk/puml/), January 12th, 2002. 9. Object Management Group. Unified Modeling Language Specification, Version 1.4, September 2001 (Version 1.3, June 1999). 10. Rational Software Corporation, Unified Modeling Language Semantics, Version 1.1, September 1997. 11. Rational Software Corporation, Unified Modeling Language Notation Guide, Version 1.1, September 1997. 12. James Rumbaugh, Ivar Jacobson, Grady Booch. The Unified Modeling Language Reference Manual. Addison-Wesley, 1998. 13. Anthony J.H. Simons. "Use cases considered harmful", Proceedings of the 29th Conference on Technology of Object-Oriented Languages and Systems-TOOLS Europe’99, June 7-10, 1999, Nancy, France. IEEE Computer Society Press, 1999, pp. 194-203. 14. Anthony J.H. Simons, Ian Graham: "30 Things that go wrong in object modelling with UML 1.3", chapter 17 in Kilov, H., Rumpe, B., Simmonds, I. (eds.): Behavioral Specifications of Businesses and Systems. Kluwer Academic Publishers, 1999, 237-257. 15. Anthony J.H. Simons. Personal communication to the authors, December 5th, 2001. 16. Anthony J.H. Simons. Post to the Precise UML Group Mailing List (http://www.cs.york.ac.uk/puml/), January 31st, 2002. 17. Perdita Stevens, Rob Pooley. Using UML: Software Engineering with Objects and Components. Addison-Wesley, 2000.