blob: 894f385c8ef70a380094eb301d1d1b305b903484 [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="-0rSxLFlmQfyKrgnqi1NKrg"
name="simple_design,1.6109092258980447E-306" guid="-0rSxLFlmQfyKrgnqi1NKrg" changeDate="2006-11-08T19:39:05.846-0500"
version="1.0.0">
<mainDescription>&lt;a id=&quot;XE_xp__simple_design&quot; name=&quot;XE_xp__simple_design&quot;>&lt;/a>&lt;a id=&quot;XE_simple_design__practice_of&quot; name=&quot;XE_simple_design__practice_of&quot;>&lt;/a>&lt;a id=&quot;XE_engineering_practices__simple_design&quot; name=&quot;XE_engineering_practices__simple_design&quot;>&lt;/a> &#xD;
&lt;h3>&#xD;
Description&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
The design strategy in XP is to create the simplest design that meets your current requirements, as reflected in the&#xD;
current test cases. In many domains, &quot;simplest design&quot; is ambiguous, but it is a well-defined term in XP. A simple&#xD;
design has these four characteristics, listed in priority order:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
The system runs all the tests.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
It contains no duplicate code.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
The code states the programmers's intent very clearly.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
It contains the fewest possible number of classes and methods.&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
Design in Extreme Programming is much more incremental than in any other methodology. The practice of Test-Driven&#xD;
Development describes how the system is created in many small steps, driven by tests that programmers write. Each of&#xD;
these tests is a probe into the design of the system, allowing the developers to explore the system as it is being&#xD;
created. This is quite a contrast to other methodologies where design is a separate phase of either the project or the&#xD;
iteration. In XP, design quite literally happens all the time.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
It takes a tremendous amount of courage to stop designing and start coding. Almost all developers are taught that they&#xD;
should understand everything about the system before committing that knowledge to code. The reason, they've always been&#xD;
told, is that code is hard to change. Once it is laid on its virtual paper, changing it involves understanding the&#xD;
hidden assumptions of the original developer, unseen couplings, months-long validation and verification procedures,&#xD;
etc. But if code could be changed with impunity, developers could afford to defer design decisions until later,&#xD;
understand the system incrementally, and implement in pieces.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
The strategy of building software in this manner is based on the following reasoning:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
Given that all requirements aren't known on the first day of the project, the development style must be adjusted to&#xD;
accommodate new understanding from customers and changes in the business climate.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
If a design decision does not have to be made now, avoid guessing by deferring the decision until it is needed. By&#xD;
that time, there is a better chance that enough understanding will exist to support a better decision.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Change happens during the lifetime of a project. Decisions made once will be changed. The software must be designed&#xD;
and implemented in such a way that changes can be accommodated easily.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Designs seldom survive their first skirmish with code. The act of coding provides feedback to the developer about&#xD;
the system. This learning must be reflected in the design. If the design is already cast before coding begins, this&#xD;
feedback is more difficult and costly to put back into the design.&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
Here are some guidelines to help in arriving at a simple design:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
Look for a simple way to solve a problem. Software is hard, so there will be plenty of time for complexity later.&#xD;
For now, keep it simple. Simple, however, does not mean stupid. Pay attention to good design principles when&#xD;
forming a system incrementally.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Resist the temptation to add infrastructure or other features that might be needed later. Chances are they won't be&#xD;
(YAGNI: You Aren't Going to Need It). Let the user stories force you to change the design.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Don't generalize a solution until it is needed in at least two places. Follow the first rule above and keep&#xD;
implementation simple. Let the second user pay for the generality.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Seek out and destroy duplication. The practice of &lt;a class=&quot;elementLink&quot; href=&quot;./../../../xp/guidances/concepts/refactoring_xp_programming.html&quot; guid=&quot;1.4410217108363206E-306&quot;>Refactoring&lt;/a> is the most powerful tool in the arsenal. It is through removing&#xD;
duplication that new classes, methods, and larger scale systems are born.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Remember that it is just code. If it is getting overly complex and painful, delete it. It can always be recreated&#xD;
again in less time and better than the first time by leveraging what was learned the first time.&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
Benefits&#xD;
&lt;/h3>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
&lt;b>Small initial investment&lt;/b>: There is no need to invest in frameworks or generality that might be or might not&#xD;
be required in the future.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;b>Maintainability&lt;/b>: Simple design will keep the design from rotting and dying prematurely. The more complex the&#xD;
design is, the harder it is to understand and preserve and the more rapidly it will decay.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;b>Flexibility&lt;/b>: Simple systems are always easier to change than more complex systems.&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;b>Agility&lt;/b>: Simple systems are faster to change than more complex systems.&#xD;
&lt;/li>&#xD;
&lt;/ul></mainDescription>
</org.eclipse.epf.uma:ContentDescription>