blob: 1da48f354784d8d4efef3c3e98e4a59ada36f6d9 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<org.eclipse.epf.uma:ContentDescription xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:org.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.5/uma.ecore"
xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.0" xmi:id="-1xE2ZW3MjNAJ7jkaZNbkww"
name="visual_modeling,_1fM3AC9_EduW5uTjiIcspQ" guid="-1xE2ZW3MjNAJ7jkaZNbkww"
changeDate="2006-11-21T11:21:26.464-0800" version="1.0.0">
<mainDescription>&lt;h3>&#xD;
Introduction&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
Using visual modeling techniques to design software can help break down complex problems into a series of smaller,&#xD;
easier to manage tasks. Sharing pictures rather than written documents or source code also helps the understanding and&#xD;
communication of difficult concepts. Adopting standard modeling notations such as the UML increases this capability by&#xD;
helping to make diagrams precise and unambiguous.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
The degree of formality used when producing and disseminating models should vary according to your needs. Small,&#xD;
collaborative teams modeling around whiteboards and capturing the results on a sheet of paper or with digital cameras&#xD;
can yield good results. This can also help the team focus on producing software with the help of models; rather than&#xD;
becoming sidetracked into over-engineering both the models and the solution. Modeling tools provide additional value to&#xD;
projects, especially for more complex systems. Their specifics of use are outside the scope of this guideline, however.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
This guideline does not describe a formal sequential progression through prescriptive design steps. Whether some or all&#xD;
of these techniques are needed, or how long is spent on them will vary depending on real-world issues such as the&#xD;
complexity of the requirements; the experience of the designer; and the way the team works.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
This guideline uses a simplified scenario (Login) to help keep the focus on understanding the techniques rather than&#xD;
the specific requirements. In the real-world, it is doubtful that much time would be spent modeling a simple problem.&#xD;
Here is the use case diagram, for reference;&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img height=&quot;142&quot; alt=&quot;User Login Use Case Model&quot; src=&quot;./resources/user_login_ucm.JPG&quot; width=&quot;472&quot; />&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
Identify elements&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
Render the identified design elements as classes in a UML diagram.&amp;nbsp; Apply appropriate stereotypes and optionally&#xD;
render the class using an icon specific to the stereotype to characterize the intent of the class in the design.&amp;nbsp;&#xD;
Name and briefly describe the classes in a few sentences. Do not spend too much time working on associations, as these&#xD;
will be developed through working on collaborations in the next step.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
Classes can be drawn as a basic UML rectangle or with a specific symbol associated with a particular stereotype.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
The resulting class diagram should be conceptually similar to this one:&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img height=&quot;228&quot; alt=&quot;Identify Elements - Initial Class Model&quot; src=&quot;./resources/identify_elements_bce.JPG&quot;&#xD;
width=&quot;290&quot; />&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
For this example, the &lt;a class=&quot;elementLink&quot;&#xD;
href=&quot;./../../../openup/guidances/guidelines/entity_control_boundary_pattern.html&quot;&#xD;
guid=&quot;_uF-QYEAhEdq_UJTvM1DM2Q&quot;>Entity-Control-Boundary Pattern&lt;/a> has been used to derive two classes (LoginUI and&#xD;
LoginController). In addition, two design elements already identified in the architecture (SecuritySystemInterface and&#xD;
User) have also been incorporated.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
Determine how elements collaborate to realize the scenario.&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
When determining collaboration, two kinds of diagrams are useful.&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
A dynamic object diagram, showing how the design elements collaborate to realize the requirements.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
A static class diagram, showing the classes involved in realizing the requirements.&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
Remember to also update any other impacted diagrams as appropriate, based on modifications or additions to the design.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
Create a number of dynamic object diagrams that walk through how a set of objects collaborate to perform the behavior&#xD;
of the scenarios.&amp;nbsp; Even if just one scenario is being designed, this might take multiple diagrams to render it in&#xD;
smaller, understandable chunks or from multiple contexts.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img style=&quot;WIDTH: 776px; HEIGHT: 355px&quot; height=&quot;355&quot; alt=&quot;User Login Sequence Diagram&quot;&#xD;
src=&quot;./resources/user_login_seq.JPG&quot; width=&quot;776&quot; />&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
The above sequence diagram shows the user credentials being passed through to the security system for authentication.&#xD;
Steps in the use case scenario are transformed into messages between the participating objects. The messages in this&#xD;
example are not yet fully formed (there are no parameters or return values), so they are prefixed with “//” to show&#xD;
that more work is needed.&amp;nbsp; A sequence diagram was used in this example, but a communication diagram could have&#xD;
been used.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
It&amp;nbsp;can be&amp;nbsp;useful to create one or more static class diagrams that show the classes in the design that support&#xD;
the realization.&amp;nbsp; These class diagrams are often called View of Participating Classes diagrams, they provide a&#xD;
focused view on the overall design by only showing the classes, relationships, operations, and attributes relevant to&#xD;
the collaboration.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img height=&quot;469&quot; alt=&quot;Login VOPC&quot; src=&quot;./resources/login_vopc.jpg&quot; width=&quot;448&quot; />&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
This diagram shows the operations and relationships that were identified by drawing the sequence diagram. The&#xD;
relationships in this example&amp;nbsp;have not been refined yet, so they are just shown as simple associations. Remember&#xD;
to examine the diagram to verify that the design can support the behavior in the sequence diagram.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
Working at this level of detail in the model during the early stages of design can be helpful. It keeps the diagrams&#xD;
relatively simple and easy to understand. It makes them easier to draw in a workshop and easier to change during&#xD;
discussion. It is often easier to add the detail once there is agreement on the fundamentals.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
Refine design decisions&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
Once the fundamentals of the design are relatively stable, you can begin to add detail to the design. Some of this can&#xD;
be performed in code or in the model. If modeling is chosen, then refine attributes, responsibilities and&#xD;
relationships.&#xD;
&lt;/p>&#xD;
&lt;h4>&#xD;
Describe responsibilities&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
Class responsibilities are either actions to be performed by an object or knowledge maintained and provided to other&#xD;
objects. Each class will typically have several responsibilities; each responsibility will evolve into one or more&#xD;
operations during design.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
Responsibilities are derived from messages on interaction diagrams or from non-functional requirements that a class has&#xD;
to support. Document a responsibility by giving it a name, and optionally a brief description (what it does).&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
These operations can be left as self-evident from their context, they can be given textual descriptions of the&#xD;
algorithm required to perform the behavior, or they could spawn off another whole pass of this technique where a set of&#xD;
classes that collaborate together to perform the internals of the operation are identified, etc.&#xD;
&lt;/p>&#xD;
&lt;h4>&#xD;
Describe attributes and associations&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
A class may have to store simple data information, like: string, integer, and the like. For such simple type of&#xD;
information, attributes are defined for classes. For a more complex or &quot;behavioral” attribute, consider creating an&#xD;
extra class and establish an association to it.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
To perform their responsibilities, classes may depend on other classes to supply needed behavior. These other classes&#xD;
might be ones already identified in this design session, they might be existing classes pulled from the architecture,&#xD;
or the need for new classes might be conceived. Associations in a class diagram can be used to represent inter-class&#xD;
relationships.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img height=&quot;439&quot; alt=&quot;Login VOPC (Refined)&quot; src=&quot;./resources/login_vopc_refined.jpg&quot; width=&quot;557&quot; />&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
This diagram shows a number of refinements. The LoginUI class has been replaced by LoginForm. The User class has been&#xD;
renamed UserCredentials and is created by the LoginForm class rather than LoginController. It is then used as a&#xD;
parameter for subsequent messages rather than passing the individual attributes. The SecuritySystemInterface class has&#xD;
been refined into two elements, ISystemSecurity, which provides a simple façade for interaction with the rests of the&#xD;
design; and SecuritySystemProxy, which handles interaction with the external security system.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
Design internals&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
The classes in the design are likely to need to be distributed amongst different packages and subsystems or components.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
&lt;img height=&quot;304&quot; alt=&quot;User Login - Design Packages&quot; src=&quot;./resources/dv_Packaging.JPG&quot; width=&quot;571&quot; />&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
In this example, the LoginForm, LoginController and UserCredentials elements have been placed in a package called&#xD;
LocalSecurity. The SecuritySystemProxy is a part of a subsystem called SecuritySystemAdapter which realizes the&#xD;
ISecuritySystem interface. The SecuritySystemAdapter wraps the legacy SecuritySystem, expressed here as a component&#xD;
offering a validateUser interface.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
Each of these packaged elements can be distributed amongst the team for further development work.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
Conclusion&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
This guideline walked through the techniques in a concrete manner started with a scenario of a use case through to&#xD;
distributing the classes identified into a set of packages. This example demonstrates a technique for designing&#xD;
visually, but it should be considered as just one conceptual pass of design.&amp;nbsp; One could as easily apply this&#xD;
technique when defining the internals of how the SecuritySystemProxy class will collaborate with a set of classes to&#xD;
validate the credentials.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
When applying this guideline, work in small chunks and keep in mind the goal of delivering software to the users that&#xD;
provides value. To deliver high-quality software requires consideration of how the pieces will work together to deliver&#xD;
that value. But as soon as key decisions have been made and the decisions have been communicated to the appropriate&#xD;
team members, the team should move on to implementing the source code to verify the design and deliver the value.&#xD;
&lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>