blob: b357d2b1787640bee8fac4b2ac24b2157e4818be [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.4/uma.ecore"
xmlns:epf="http://www.eclipse.org/epf"
epf:version="1.2.0" xmi:id="-1vS_ELnQxGQKwfCrRYrc7w"
name="new_guideline,__MnggPTdEduDKIuqTXQ8SA" guid="-1vS_ELnQxGQKwfCrRYrc7w" changeDate="2007-05-10T11:46:48.708-0700">
<mainDescription>&lt;h1> Identification of elements &lt;/h1>&#xD;
&lt;p> Identify the elements, based on the needs of the requirements. The identification &#xD;
of elements can stem from a static perspective of walking through the requirements &#xD;
and identifying elements clearly called out, which is a form of domain modeling. &#xD;
This can pull in other elements identified as being in the application domain &#xD;
or deemed necessary from examining the requirements for the portion of the system &#xD;
being designed. This identification can also pull from key abstractions identified &#xD;
while defining the architecture. &lt;/p>&#xD;
&lt;p> The identification of elements should apply a dynamic perspective by walking &#xD;
through scenarios of use of the system (or subsystem) and identifying elements &#xD;
needed to support the behavior. That behavior might be a scenario of use from &#xD;
an external user perspective or, while designing a subsystem, a responsibility &#xD;
assigned to the subsystem that has complex algorithmic behavior. Consider applying &#xD;
the &lt;a class=&quot;elementLink&quot; href=&quot;./../../../openup/guidances/guidelines/entity_control_boundary_pattern_C4047897.html&quot; guid=&quot;_uF-QYEAhEdq_UJTvM1DM2Q&quot;>Entity-Control-Boundary &#xD;
Pattern&lt;/a> to identify the elements necessary to support the scenario, or apply &#xD;
other patterns identified in the architecture that specify the elements that &#xD;
will be used to support specific aspects of the scenario. &lt;/p>&#xD;
&lt;p> If you are designing a real-time system, include elements to represent events &#xD;
and signals that allow you to describe the asynchronous triggers of behavior &#xD;
to which the system must respond. &lt;b>Events&lt;/b> are specifications of interesting &#xD;
occurrences in time and space that usually (if they are noteworthy) require &#xD;
some response from the system. &lt;b>Signals&lt;/b> represent asynchronous mechanisms &#xD;
used to communicate certain types of events within the system. If there are &#xD;
existing elements from previous passes over the design or from selected frameworks &#xD;
or other reusable elements, reuse them whenever possible. See &lt;a class=&quot;elementLinkWithType&quot; href=&quot;./../../../openup/guidances/guidelines/software_reuse_B6B04C26.html&quot; guid=&quot;_vO2uoO0OEduUpsu85bVhiQ&quot;>Guideline: &#xD;
Software Reuse&lt;/a>. &lt;/p>&#xD;
&lt;p> After identifying the elements, give each one meaningful name. Each element &#xD;
should also have a description, so that the team members who work together to &#xD;
refine the design and implement from the design will understand the role that &#xD;
each element plays. &lt;/p>&#xD;
&lt;p> Based on this information, this identification of elements could be applied &#xD;
several times in designing just one part of the system. Although there is no &#xD;
one correct strategy for multiple passes, they could be done at a coarse-grained &#xD;
level and then a fine-grained level, or at an analysis (abstract) level and &#xD;
then a design level. &lt;/p>&#xD;
&lt;h1> Behavior of elements &lt;/h1>&#xD;
&lt;p> To identify the behavior of the elements, go through scenarios and assign &#xD;
behavior to the appropriate collaborating participants. If a particular use &#xD;
of the system or subsystem can have multiple possible outcomes or variant sequences, &#xD;
cover enough scenarios to ensure that the design is robust enough to support &#xD;
the possibilities. &lt;/p>&#xD;
&lt;p>&#xD;
When assigning behavior to elements, consider applying the &lt;a class=&quot;elementLink&quot; href=&quot;./../../../openup/guidances/guidelines/entity_control_boundary_pattern_C4047897.html&quot; guid=&quot;_uF-QYEAhEdq_UJTvM1DM2Q&quot;>Entity-Control-Boundary Pattern&lt;/a>&amp;nbsp;or other patterns identified in the&#xD;
architecture.&#xD;
&lt;/p>&#xD;
&lt;p> Behavior can be represented as a simple statement of responsibility, or it &#xD;
can be a detailed operation specification. Use the appropriate level of detail &#xD;
to communicate important design decisions while giving the freedom to make appropriate &#xD;
implementation decisions as those tasks ensue. &lt;/p>&#xD;
&lt;p> Behavior must be understood as a responsibility of an element, as well as &#xD;
an interaction between two elements in the context of some broader behavior &#xD;
of the system or subsystem. The latter part of this will lead the developer &#xD;
to identify relationships that are necessary between the elements. &lt;/p>&#xD;
&lt;p> Avoid too much identification of behavior solely from the perspective of domain &#xD;
modeling. Include only behavior that is really needed -- behavior identified &#xD;
by going through required scenarios of system use. &lt;/p>&#xD;
&lt;h1> Design element relationships &lt;/h1>&#xD;
&lt;p> The relationships between the elements necessary for the behavior must be &#xD;
designed. This can simply be the identification of the ability to traverse from &#xD;
one element to another or else a need to manage an association between the elements. &#xD;
Relationships can be designed in more detail, as appropriate. This can include: &#xD;
optionality, multiplicity, whether the relationship is a simple dependency or &#xD;
managed association, and so on. These decisions that drive implementation details &#xD;
are best made at the design level, where it is easier to see how all of the &#xD;
pieces fit together. &lt;/p>&#xD;
&lt;p> Avoid defining too many relationships based on relationships in the application &#xD;
domain. Include only relationships that are needed based on the requirements. &#xD;
On the other hand, a combination of requirements knowledge and domain knowledge &#xD;
can lead to some detailed decisions on the relationships, such as optionality &#xD;
and multiplicity. &lt;/p>&#xD;
&lt;h1> Analysis classes and YAGNI &lt;/h1>&#xD;
&lt;p> Analysis classes are used to identify initial buckets where system functionality &#xD;
should go. They're the first pass at understanding where system behavior will &#xD;
be realized in the design and implementation. For example, an entity class might &#xD;
initially represent all of the behavior for an employee, such as storing personal &#xD;
information and calculating the value of a paycheck. Few assumptions are made &#xD;
about how the final design will look at this point. Analysis classes are about &#xD;
making sure required behavior is represented somewhere in the system, rather &#xD;
than about creating a perfect design.&lt;br />&#xD;
&lt;br />&#xD;
Analysis classes allow you to begin designing from abstractions, so that the &#xD;
details of the system depend on those abstractions and not the other way around. &#xD;
In the Employee class, the notion of an employee should start with the idea &#xD;
of someone who works for the company, who has responsibilities and receives &#xD;
benefits. It’s easier to create a design from this simple idea. The complexity &#xD;
of the design should emerge from the abstract ideas of what the design needs &#xD;
to do. This will also help keep coupling low and cohesion high.&lt;br />&#xD;
&lt;br />&#xD;
YAGNI (You Aren't Going to Need It) is an approach to design where the developer &#xD;
creates only enough implementation and design to address the required functionality. &#xD;
No assumptions are made about re-use or possible future uses of the software. &#xD;
Software is improved when the system requirements demand more functionality &#xD;
or robustness.&lt;br />&#xD;
&lt;br />&#xD;
The first classes created from a YAGNI perspective are much like analysis classes. &#xD;
You don't know how complex it may be to calculate a paycheck for your employee, &#xD;
so you assume that functionality is highly cohesive with the rest of what the &#xD;
Employee class must do. As you understanding of the requirement develops, the &#xD;
analysis class evolves into a set of collaborating classes and patterns that &#xD;
better support the behavior of the system. For example, payroll calculations &#xD;
could be moved into a pattern that handles all of the different types of paycheck &#xD;
calculations (overtime, commissions, and so forth), thereby increasing the internal &#xD;
cohesion of the class.&lt;br />&#xD;
&lt;br />&#xD;
Use analysis classes to define an initial place to put system behavior, and &#xD;
add only enough behavior to satisfy the YAGNI perspective. Analysis classes &#xD;
will evolve into concrete design classes as more behavior is added and as the &#xD;
design is refactored. See &lt;a class=&quot;elementLinkWithType&quot; href=&quot;./../../../openup/guidances/guidelines/evolve_the_design_3C9D6965.html&quot; guid=&quot;_C4U9QPTeEduDKIuqTXQ8SA&quot;>Guideline: &#xD;
Evolve the Design&lt;/a>.&amp;nbsp; &lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>