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