<?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.6/uma.ecore" xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.1" xmi:id="-1vS_ELnQxGQKwfCrRYrc7w" name="new_guideline,__MnggPTdEduDKIuqTXQ8SA" guid="-1vS_ELnQxGQKwfCrRYrc7w" changeDate="2007-07-18T17:31:37.507+0330">
  <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;./../../../openup/guidances/guidelines/entity_control_boundary_pattern.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;./../../../openup/guidances/guidelines/software_reuse.html&quot; guid=&quot;_vO2uoO0OEduUpsu85bVhiQ&quot;>Guideline: Software&#xD;
    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;./../../../openup/guidances/guidelines/entity_control_boundary_pattern.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;./../../../openup/guidances/guidelines/evolve_the_design.html&quot; guid=&quot;_C4U9QPTeEduDKIuqTXQ8SA&quot;>Guideline: Evolve&#xD;
    the Design&lt;/a>.&#xD;
&lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>
