Class diagrams are the most common diagram found in modeling object-
oriented systems. A class diagram shows a set of classes, interfaces, and
collaborations and their relationships. You use class diagrams to model the
static design view of a system. For the most part, this involves modeling the
vocabulary of the system, modeling collaborations, or modeling schemas.
Common Properties
A class diagram is just a special kind of diagram and shares the same
common properties as do all other diagrams, a name and graphical content that
are a projection into a model. What distinguishes a class diagram from all
other kinds of diagrams is its particular content.
Contents
Class diagrams commonly contain the following things:
·
Classes
·
Interfaces
·
Collaborations
·
Dependency,
generalization, and association relationships
Like all other diagrams, class diagrams may contain notes and
constraints.
Class diagrams may also contain packages or subsystems, both of which
are used to group elements of your model into larger chunks. Sometimes, you'll
want to place instances in your class diagrams, as well, especially when you
want to visualize the (possibly dynamic) type of an instance.
Common Uses
You use class diagrams to model the static design view of a system.
This view primarily supports the functional requirements of a system• the
services the system should provide to its end users. When you model the static
design view of a system, you'll typically use class diagrams in one of three
ways:
1.
To model
the vocabulary of a system
2.
To model
simple collaborations
3.
To model
a logical database schema
Common Modeling Techniques
Modeling Simple Collaborations
No class stands alone. Rather, each works in collaboration with others
to carry out some semantics greater than each individual. Therefore, in
addition to capturing the vocabulary of your system, you'll also need to turn
your attention to visualizing, specifying, constructing, and documenting the
various ways these things in your vocabulary work together. You use class diagrams
to represent such collaborations.
To model a collaboration,
- Identify the mechanism you'd like to model. A mechanism represents some function or behavior of the part of the system you are modeling that results from the interaction of a society of classes, interfaces, and other things.
- For each mechanism, identify the classes, interfaces, and other collaborations that participate in this collaboration. Identify the relationships among these things, as well.
- Use scenarios to walk through these things. Along the way, you'll discover parts of your model that were missing and parts that were just plain semantically wrong.
- Be sure to populate these elements with their contents. For classes, start with getting a good balance of responsibilities. Then, over time, turn these into concrete attributes and operations.
For example, below figure shows a set of classes drawn from the
implementation of an autonomous robot. The figure focuses on the classes
involved in the mechanism for moving the robot along a path. You'll find one
abstract class (Motor) with two concrete children, SteeringMotor and MainMotor.
Both of these classes inherit the five operations of their parent, Motor. The
two classes are, in turn, shown as parts of another class, Driver. The class
PathAgent has a one-to-one association to Driver and a one-to-many association
to CollisionSensor. No attributes or operations are shown for PathAgent,
although its responsibilities are given.
There are many more classes involved in this system, but this diagram
focuses only on those abstractions that are directly involved in moving the
robot. You'll see some of these same classes in other diagrams.
Modeling a Logical Database Schema
Many of the systems you'll
model will have persistent objects, which means that they can be stored in a
database for later retrieval. Most often, you'll use a relational database, an
objectoriented database, or a hybrid object/relational database for persistent
storage. The UML is wellsuited to modeling logical database schemas, as well as
physical databases themselves.
The UML's class diagrams are a
superset of entity-relationship (E-R) diagrams, a common modeling tool for
logical database design. Whereas classical E-R diagrams focus only on data,
class diagrams go a step further by permitting the modeling of behavior, as
well. In the physical database, these logical operations are generally turned
into triggers or stored procedures.
To model a schema,
- Identify those classes in your model whose state must transcend the lifetime of their applications.
- Create a class diagram that contains these classes and mark them as persistent (a standard tagged value). You can define your own set of tagged values to address database-specific details.
- Expand the structural details of these classes. In general, this means specifying the details of their attributes and focusing on the associations and their cardinalities that structure these classes.
- Watch for common patterns that complicate physical database design, such as cyclic associations, one-to-one associations, and n-ary associations. Where necessary, create intermediate abstractions to simplify your logical structure.
- Consider also the behavior of these classes by expanding operations that are important for data access and data integrity. In general, to provide a better separation of concerns, business rules concerned with the manipulation of sets of these objects should be encapsulated in a layer above these persistent classes.
- Where possible, use tools to help you transform your logical design into a physical design.
Below figure shows a set of classes drawn from an information system
for a school. This figure expands upon an earlier class diagram, and you'll see
the details of these classes revealed to a level sufficient to construct a
physical database. Starting at the bottom-left of this diagram, you will find
the classes named Student, Course, and Instructor. There's an association between
Student and Course, specifying that students attend courses. Furthermore, every
student may attend any number of courses and every course may have any number
of students.
All six of these classes are marked as persistent, indicating that
their instances are intended to live in a database or some other form of
persistent store.
Forward and Reverse Engineering
Modeling is important, but you have to remember that the primary
product of a development team is software, not diagrams. Of course, the reason
you create models is to predictably deliver at the right time the right
software that satisfies the evolving goals of its users and the business. For
this reason, it's important that the models you create and the implementations
you deploy map to one another and do so in a way that minimizes or even
eliminates the cost of keeping your models and your implementation in sync with
one another.
Forward engineering is the process of transforming a model into code
through a mapping to an implementation language. Forward engineering results in
a loss of information, because models written in the UML are semantically
richer than any current object-oriented programming language. In fact, this is
a major reason why you need models in addition to code.
To forward engineer a class diagram,
- Identify the rules for mapping to your implementation language or languages of choice. This is something you'll want to do for your project or your organization as a whole.
- Depending on the semantics of the languages you choose, you may have to constrain your use of certain UML features. For example, the UML permits you to model multiple inheritance, but Smalltalk permits only single inheritance.
- Use tagged values to specify your target language. You can do this at the level of individual classes if you need precise control. You can also do so at a higher level, such as with collaborations or packages.
- Use tools to forward engineer your models.
Below figure illustrates a simple class diagram specifying an
instantiation of the chain of responsibility pattern. This particular
instantiation involves three classes: Client, EventHandler, and
GUIEventHandler. Client and EventHandler are shown as abstract classes, whereas
GUIEventHandler is concrete. EventHandler has the usual operation expected of
this pattern (handleRequest), although two private attributes have been added
for this instantiation.
All of these classes specify a
mapping to Java, as noted in their tagged value. Forward engineering the
classes in this diagram to Java is straightforward, using a tool. Forward engineering
the class EventHandler yields the following code:
public
abstract class EventHandler {
EventHandler
successor;
private Integer
currentEventID;
private
String source;
EventHandler()
{}
public void
handleRequest() {}
}
Reverse engineering is the
process of transforming code into a model through a mapping from a specific
implementation language. Reverse engineering results in a flood of information,
some of which is at a lower level of detail than you'll need to build useful
models. At the same time, reverse engineering is incomplete. There is a loss of
information when forward engineering models into code, and so you can't completely
recreate a model from code unless your tools encode information in the source
comments that goes beyond the semantics of the implementation language.
To reverse engineer a class
diagram,
- Identify the rules for mapping from your implementation language or languages of choice. This is something you'll want to do for your project or your organization as a whole.
- Using a tool, point to the code you'd like to reverse engineer. Use your tool to generate a new model or modify an existing one that was previously forward engineered.
Using your tool, create a class diagram by
querying the model. For example, you might start with one or more classes, then
expand the diagram by following specific relationships or other neighboring
classes. Expose or hide details of the contents of this class diagram as
necessary to communicate your intent.
No comments:
Post a Comment
Thank you for your message. We I get back to you soon...