Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
roth_stephan_clean_c20_sustainable_software_development_patt-1.pdf
Скачиваний:
25
Добавлен:
27.03.2023
Размер:
7.26 Mб
Скачать

Appendix A Small UML Guide

Table A-2.  Multiplicity Examples

Multiplicity Meaning

1

Exactly one. If no multiplicity is shown on an association end, this is the default.

1..10

An inclusive interval between 1 and 10.

0..*

An inclusive interval between 0 and any number (zero-to-many). The star character (*)

 

is used to represent the unlimited (or infinite) upper bound.

*Abbreviated form of 0..*.

1..*

An inclusive interval between 1 and any number (one-to-many).

 

 

In programming languages, associations and the mechanism of navigation from one class to another can be implemented in various ways. In C++, associations are usually implemented by members having the other class as its type, for example, as a reference or a pointer, as shown in Listing A-3.

Listing A-3.    Sample Implementation of a Navigable Association Between Classes A and B

class B; // Forward declaration

class A { private:

B* b; // ...

};

class B {

// No pointer or any other reference to class A here!

};

Generalization

A central concept in object-oriented software development is the so-called inheritance. In UML there is a different and better fitting term for this concept: generalization. What is meant by this is the generalization of, for instance, classes or components.

462

Appendix A Small UML Guide

GENERALIZATION

A generalization is a taxonomic relationship between a general class and a more specific class.

The generalization relationship is used in UML diagrams to represent the concept of inheritance: the specific class (subclass) inherits attributes and operations of the more general class (base class). The UML syntax of the generalization relationship is a solid arrow with a closed but not filled arrowhead, as depicted in Figure A-11.

Figure A-11.  An abstract base class called Shape and three concrete classes that are specializations of it

In the direction of the arrow, this relationship is read as the following: “<Subclass> is a kind of <Baseclass>,” for example, “Rectangle is a kind of Shape.”

Dependency

In addition to the already mentioned associations, classes (and components) can have further relationships with other classes (and components). For instance, if a class is used as a type for a parameter of a member function, this is not an association, but it is a kind of dependency to that used class.

463

Appendix A Small UML Guide

DEPENDENCY

A dependency is a relationship that signifies that a single or a set of elements requires other elements for their specification or implementation.

As depicted in Figure A-12, a dependency is shown as a dashed arrow between two elements, for example, between two classes or components. It implies that the element at the arrowhead is required by the element at the tail of the arrow, for example, for implementation purposes. In other words, the dependent element is incomplete without the independent element.

Figure A-12.  Miscellaneous dependencies

In addition to its simple form (see the first example in Figure A-12), two special types of dependency can be distinguished:

•\

The usage dependency («use») is a relationship in which one

 

element requires another element (or set of elements) for its full

 

implementation or operation.

•\

The creation dependency («Create») is a special kind of usage

 

dependency indicating that the element at the tail of the arrow

 

creates instances of the type at the arrowhead.

464

Appendix A Small UML Guide

Template and Template Binding

In C++, templates are well known as the foundation of generic programming. In contrast, the possibility of depicting class templates in UML class diagrams is largely unknown, as is the possibility to show how template parameters are substituted with concrete types or values.

The example in Figure A-13 shows a class template named std::vector with two formal template parameters named T and Allocator. Template parameters of a Class template are shown in a dashed rectangle that overlaps the class’ rectangle in the upper-­ right corner. In our example, there is even a default value (std::allocator) with which the Allocator template parameter is substituted.

Figure A-13.  The class template std::vector and a bound class ProductList

There is also a bound class (named ProductList) that substitutes the template parameter T with the type Product (which is another class that is not shown here). The TemplateBinding is depicted with a dashed arrow («bind») showing the substitution of template parameters (T -> Product).

465