COMPONENT-AND-CONNECTOR VIEWS
There
is no single preferred strategy to document component-and-connector (C&C)
views in UML, but a number of alternatives. Each alternative has its advantages
and disadvantages. One natural candidate for representing
component-and-connector types begins with the UML class concept.
Figure
9.10 illustrates the
general idea using a simple pipe-and-filter system. Here, the filter
architectural type is represented as the UML class Filter. Instances
of filters, such as Splitter, are represented as
corresponding objects in an object instance diagram. To provide a namespace
boundary, we enclose the descriptions in packages. The representation of MergeAndSort,
denoted Details, would be shown as another
package elsewhere.
Figure 9.10. Types as classes, and instances as objects, exemplified
with a simple pipe and filter
We now
take a closer look at this strategy.
Components
The
type/instance relationship in architectural descriptions is a close match to
the class/object relationship in a UML model. UML classes, like component types
in architectural descriptions, are first-class entities and are rich structures
for capturing software abstractions. The full set of UML descriptive mechanisms
is available to describe the structure, properties, and behavior of a class,
making this a good choice for depicting detail and using UML-based analysis
tools. Properties of architectural components can be represented as class
attributes or with associations; behavior can be described using UML behavioral
models; and generalization can be used to relate a set of component types. The
semantics of an instance or type can also be elaborated by attaching one of the
standard stereotypes; for example, the «process»
stereotype can be attached to a component to indicate that it runs as a
separate process. Note that the relationship between MergeAndSort and
its substructure is indicated using a dependency relation.
Interfaces
Interfaces
to components, sometimes called ports, can be shown in five ways, as shown in Figure
9.11, described in increasing order of expressiveness.
However, as expressiveness rises so does complexity, so you should pick the
first strategy that will serve your purposes.
·
Option
1: No explicit representation. Leaving out interfaces leads to
the
simplest
diagrams but suffers from the obvious problem that there is no way to
characterize the names or the properties of the interfaces in the primary
presentation. Still, this choice might be reasonable if the components have
only one interface, if the interfaces can be inferred from the system topology,
or if the diagram is refined elsewhere.
·
Option 2:
Interfaces as annotations. Representing interfaces
as
annotations
provides a home for information about them, although annotations have no
semantic value in UML so cannot be used as a basis for analysis. Again, if the
detailed properties of an interface are not of concern, this approach might be
reasonable.
·
Option
3: Interfaces as class/object attributes. Treating interfaces as
attributes
of a class/object makes them part of the formal structural model, but they can
have only a simple representation in a class diagram-essentially, a name and a
type. This restriction limits the expressiveness of this option.
·
Option
4: Interfaces as UML interfaces. The UML lollipop notation
provides
a
compact description of an interface in a class diagram depicting a component
type. In an instance diagram, a UML association role, corresponding to an
interface instance and qualified by the interface type name, provides a compact
way to show that a component instance is interacting through a particular
interface instance. This approach provides visually distinct depictions of
components and interfaces, in which interfaces can clearly be seen as
subservient.
However,
this strategy provides no means to depict the services required from a
component's environment, often a key part of an interface. Furthermore, it is
meaningful for a component type to have several instances of the same interface
type, but it is not meaningful to say that a class realizes several versions of
one UML interface. For example, there is no easy way to define a Splitter
filter type that has two output ports of the same "type" using this
technique. Finally, unlike classes, UML interfaces do not have attributes or
substructure.
·
Option
5: Interfaces as classes. Describing interfaces as classes contained by a
component type overcomes the lack of expressiveness of the previous
alternatives: We can now represent interface substructure and indicate that a
component type has several interfaces of the same type. A component instance is
modeled as an object containing a set of interface objects. However, by
representing interfaces as classes, we not only clutter the diagram but also
lose clear visual discrimination between interfaces and components. We could
use a notational variation in which the interfaces are contained classes, as
shown in the lower part of option 5 in Figure
9.11. Indicating points of interaction is counterintuitive,
however, as containment usually indicates that a class owns other classes whose
instances may or may not be accessible through instances of the parent class.
Figure 9.11. Five ways to represent interfaces to components (ports)
Connectors
There
are three reasonable options for representing connectors. Again, the choice is
between expressiveness and semantic match on the one hand and complexity on the
other.
·
Option
1: Connector types as associations and connector instances as links. In an architectural box-and-line
diagram of a system, the lines between
components are connectors. One tempting way to represent connectors in UML is
as associations between classes or links between objects. This approach is
visually simple, provides a clear distinction between components and
connectors, and uses the most familiar relationship in UML class diagrams:
association. Moreover, associations can be labeled, and a direction associated
with the connector can be indicated with an arrow. Unfortunately, connectors
and associations have different meanings. A system in an architectural
description is built up by choosing components with behavior exposed through
their interfaces and connecting them with connectors that coordinate their
behaviors. A system's behavior is defined as the collective behavior of a set
of components whose interaction is defined and limited by the connections
between them.
In
contrast, although an association, or link, in UML represents a potential for
interaction between the elements it relates, the association mechanism is
primarily a way of describing a conceptual relationship between two elements.
In addition, an association is a relationship between UML elements, so it
cannot stand on its own in a UML model. Consequently, a connector type cannot
be represented in isolation. Instead, you must resort to naming conventions or
to stereotypes whose meanings are captured by description in UML's object
constraint language. Further, the approach does not allow you to specify a
connector's interfaces.
Option 2: Connector types as association classes. One
solution to the lack of expressiveness is to qualify the association with a
class that represents the connector type. In this way, the connector type or
connector attributes can be captured as attributes of a class or object.
Unfortunately, this technique still does not provide any way of explicitly
representing connector interfaces.
Option 3: Connector types as
classes and connector instances as objects. One way to give connectors first-class status in UML is
to represent connector
types as classes and connector instances as objects. Using classes and objects,
we have the same four options for representing roles as we had for interfaces:
not at all, as annotations, as interfaces realized by a class, or as child
classes contained by a connector class. Given a scheme for representing
interfaces, an attachment between a component's interface and a connector's
interface may be represented as an association or a dependency.
Systems
In
addition to representing individual components and connectors and their types,
we also need to encapsulate graphs of components and connectors: systems. Three
options are available.
·
Option
1: Systems as UML subsystems. The primary UML mechanism for grouping
related elements is the package. In fact, UML defines a standard package
stereotype, called «subsystem», to group UML models that
represent a logical part of a system. The choice of subsystems is appropriate
for any mapping of components and connectors, and it works particularly well
for grouping classes. One of the problems with using subsystems, as defined in
UML 1.4, is that, although they are both a classifier and a package, the
meaning is not entirely clear. Some have argued that we should be able to treat
a subsystem as an atomic class-like entity at certain stages in the development
process and later be able to refine it in terms of a more detailed
substructure. Having the ability to do this would make the subsystem construct
more appropriate for modeling architectural components.
· Option 2: Systems as contained objects. Object containment can be used to represent systems. Components are represented as instances of contained classes, and connectors are modeled using one of the options outlined earlier. Objects provide a strong encapsulation boundary and carry with them the notion that each instance of the class has the associated "substructure." However, this approach has problems, the most serious being that associations, used to model connectors, between contained classes are not scoped by the class. That is, it is not possible to say that a pair of classes interacts via a particular connector, modeled as an association, only in the context of a particular system. So, for example, indicating that two contained classes interact via an association is valid for instances of classes used anywhere else in the model.
·
Option 3:
Systems as collaborations. A set
of communicating objects
connected
by links is described in UML using a collaboration. If we represent components
as objects, we can use collaborations to represent systems. A collaboration
defines a set of participants and relationships that are meaningful for a given
purpose, which in this case is to describe the runtime structure of the system.
The participants define classifier roles that objects play, or conform to, when
interacting. Similarly, the relationships define association roles that links
must conform to.
Collaboration
diagrams can be used to present collaborations at either the specification or
the instance level. A specification-level collaboration diagram shows the
roles, defined within the collaboration, arranged in a pattern to describe the
system substructure. An instance-level collaboration diagram shows the objects
and links conforming to the roles at the specification level and interacting to
achieve the purpose. Therefore, a collaboration presented at the instance level
is best used to represent the runtime structure of the system.
Figure
9.12 illustrates this
approach. The Filter architectural type is
represented as previously. Instances of filters and pipes are
represented as corresponding classifier roles-for example, /Splitter
indicates the Splitter role-and association roles. The
objects and links conforming to those roles are shown in the collaboration
diagram at the instance level, indicated by underscored names.
Figure 9.12. Systems as collaborations
Although
this is a natural way to describe runtime structures, it leaves no way to
explicitly represent system-level properties. There is also a semantic
mismatch; a collaboration describes a representative interaction between
objects and provides a partial description, whereas an architectural
configuration is meant to capture a complete description.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.