﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-That way I want to stay-随笔分类-敏捷开发</title><link>http://www.blogjava.net/Wingel/category/17919.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 09:03:57 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 09:03:57 GMT</pubDate><ttl>60</ttl><item><title>强烈推荐！敏捷开发的必要技巧整本</title><link>http://www.blogjava.net/Wingel/archive/2006/12/16/88108.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Sat, 16 Dec 2006 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/16/88108.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/88108.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/16/88108.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/88108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/88108.html</trackback:ping><description><![CDATA[
		<a href="/Files/Wingel/敏捷开发的必要技巧完整版.rar">
				<font color="#002c99">敏捷开发的必要技巧完整版.rar</font>
		</a> 或者 <a href="http://wingel.javaeye.com/topics/download/e329a32b-fca4-4600-b5bf-4bbd88304370"><b>下载</b></a><script type="text/javascript"><![CDATA[indow.open("www.blogjava.net/wingel");]]&gt;</script><img src ="http://www.blogjava.net/Wingel/aggbug/88108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-16 09:50 <a href="http://www.blogjava.net/Wingel/archive/2006/12/16/88108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧14：结对编程  </title><link>http://www.blogjava.net/Wingel/archive/2006/12/14/87819.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Thu, 14 Dec 2006 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/14/87819.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/87819.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/14/87819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/87819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/87819.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">
						<strong>链接：</strong>
						<a href="/Files/Wingel/第14章结对编程.rar">
								<font color="#002c99">第14章结对编程.rar</font>
						</a>  或者 <a href="http://wingel.javaeye.com/topics/download/22fb9bc2-d41c-4062-b448-f254b70dac18"><b>下载</b></a><br /><br /><strong>结对编程的好处： <span lang="EN-US"><?xml:namespace prefix = o /?><o:p></o:p></span></strong></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">联合两人的知识去对付一个难题。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">知识互相传递。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">更有效的查错跟纠错。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">程序员都很开心。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">减少员工离职的损失。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<strong>
						<span style="FONT-FAMILY: 宋体">结对编程需要的一些技能：<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">用代码解释已有的设计结构。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">用例子来解释。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">用图表来解释设计思路。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">如果你无法把你的设计思路表达清楚，把代码写出来。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">让比较迷惑的搭档来写代码，这样他就可以较好的融入你的概念。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">经常的休息。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<strong>
						<span style="FONT-FAMILY: 宋体">经常的更换搭档。<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>具体内容请下载pdf观看。<img src ="http://www.blogjava.net/Wingel/aggbug/87819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-14 21:25 <a href="http://www.blogjava.net/Wingel/archive/2006/12/14/87819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧13：测试驱动编程（TDD）</title><link>http://www.blogjava.net/Wingel/archive/2006/12/11/86952.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Mon, 11 Dec 2006 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/11/86952.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/86952.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/11/86952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/86952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/86952.html</trackback:ping><description><![CDATA[下载地址： <a href="/Files/Wingel/第13章测试驱动编程.rar"><font color="#002c99">第13章测试驱动编程.rar</font></a>  或者  <a href="http://wingel.javaeye.com/topics/download/85c25a7e-8368-4a83-b7a0-e1c5169ebe8e"><b>下载</b></a><br /><br /><p class="MsoNormal"><strong><span lang="EN-US" style="FONT-FAMILY: 宋体">TDD</span></strong><strong><span style="FONT-FAMILY: 宋体">及它的优点<span lang="EN-US"><?xml:namespace prefix = o /?><o:p></o:p></span></span></strong></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><o:p> </o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span></span><span style="FONT-FAMILY: 宋体">上面这种编程的方式，就叫“测试驱动编程<span lang="EN-US">Test Driven Development (TDD)</span>”，因为我们总是在写真正代码之前写一个通不过的测试，然后再写真正的代码，让测试通过。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span></span><span style="FONT-FAMILY: 宋体">跟测试后行的开发方式相比，它有如下好处：<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>                                                       </span><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span>1.</span><span style="FONT-FAMILY: 宋体">为了更容易的写单元测试，我们会广泛的使用接口（比如<span lang="EN-US">StudentRegistryChecker</span>等）。这个会让单元测试代码很容易读跟写，因为测试代码里面没有多余的数据。如果我们不用<span lang="EN-US">TDD</span>而是直接写实现的话，我们经常会使用现成的类（比如<span lang="EN-US">StudentSet</span>），测试为了调用现成的类，就不得不创建很多多余的数据，创建很巨型的对象，就像<span lang="EN-US">Student</span>或者<span lang="EN-US">Course</span>。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span><o:p></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span>2.</span><span style="FONT-FAMILY: 宋体">因为广泛的使用接口，我们的类之间就不会藕合（比如<span lang="EN-US">EnrollmentSet</span>就一点都不知道<span lang="EN-US">StudentSet</span>的存在），因此重用性更好。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><o:p> </o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="FONT-FAMILY: 宋体"><span>    </span>3.</span><span style="FONT-FAMILY: 宋体">写单元测试的时候，很容易就可以为一个行为写一个测试用例，让它通过，然后为另一种行为写另一个测试用例。也就是说，整个任务会被划分成很多小的任务，独立完成。如果我们不用<span lang="EN-US">TDD</span>而直接实现的话，我们很容易就会同时把所有的行为都实现了。这样花的时间长，而且在这相当长的时间里面，写的代码都是没有测试过，不能保证准确性的。相反的，用<span lang="EN-US">TDD</span>的话，我们只实现要测的行为的代码。它只花费很少的时间（几分钟），而且可以马上测试。</span></p><img src ="http://www.blogjava.net/Wingel/aggbug/86952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-11 16:50 <a href="http://www.blogjava.net/Wingel/archive/2006/12/11/86952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧12：单元测试</title><link>http://www.blogjava.net/Wingel/archive/2006/12/09/86506.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Sat, 09 Dec 2006 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/09/86506.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/86506.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/09/86506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/86506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/86506.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">
						<span style="mso-spacerun: yes">
								<font color="#ff0000">到</font>
								<a href="/Files/Wingel/第12章单元测试.rar">
										<font color="#ff0000">第12章单元测试.rar</font>
								</a>
								<font color="#ff0000"> 或者 </font>
								<a href="http://wingel.javaeye.com/topics/download/a67d9b08-22d9-43be-84c8-b6ec45b18268">
										<b>
												<font color="#ff0000">下载</font>
										</b>
								</a>
								<font color="#ff0000">  下载pdf。</font>
								<br />
								<br />    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">单元测试跟验收测试有什么区别？验收测试测试的是系统的外部行为，而单元测试是测试系统内部结构，它只测一个单元（类，甚至一个方法）。验收测试属于客户的，我们没有权利决定验收测试的内容。我们顶多只是帮忙客户根据用户例事写出验收测试。单元测试属于我们，因为系统里面有什么类，每个类都做什么，是由我们决定的。客户就没有权利涉及了，而且我们也不需要他的参与。我们只是根据我们对这个单元（类）的期望写出单元测试。因此，这种测试又叫“程序员测试”。<span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></span>
		</p>
<img src ="http://www.blogjava.net/Wingel/aggbug/86506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-09 10:01 <a href="http://www.blogjava.net/Wingel/archive/2006/12/09/86506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧11：对UI进行验收测试（Acceptance Test）</title><link>http://www.blogjava.net/Wingel/archive/2006/12/08/86452.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Fri, 08 Dec 2006 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/08/86452.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/86452.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/08/86452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/86452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/86452.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 之前讲了怎么对代码进行验收测试，但如果代码跟UI相关的话，验收测试又要怎么写？&nbsp;&nbsp;<a href='http://www.blogjava.net/Wingel/archive/2006/12/08/86452.html'>阅读全文</a><img src ="http://www.blogjava.net/Wingel/aggbug/86452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-08 21:21 <a href="http://www.blogjava.net/Wingel/archive/2006/12/08/86452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧10：验收测试（Acceptance Test）</title><link>http://www.blogjava.net/Wingel/archive/2006/12/07/86034.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Thu, 07 Dec 2006 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/07/86034.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/86034.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/07/86034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/86034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/86034.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当你实现了一个用户例事（user story），你怎么判断你的代码是真正的，是用户真正想要的？&nbsp;&nbsp;<a href='http://www.blogjava.net/Wingel/archive/2006/12/07/86034.html'>阅读全文</a><img src ="http://www.blogjava.net/Wingel/aggbug/86034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-07 11:17 <a href="http://www.blogjava.net/Wingel/archive/2006/12/07/86034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创翻译)敏捷开发的必要技巧9：用CRC卡协助设计   </title><link>http://www.blogjava.net/Wingel/archive/2006/12/05/85515.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Tue, 05 Dec 2006 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/05/85515.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/85515.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/05/85515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/85515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/85515.html</trackback:ping><description><![CDATA[
		<p>pdf下载地址：　<a href="/Files/Wingel/第9章用CRC卡协助设计.rar"><font color="#002c99">第9章用CRC卡协助设计.rar</font></a><br />或者：　<a href="http://wingel.javaeye.com/topics/download/3494f261-d6bd-4f0f-8bac-03b303f5df02"><b>下载</b></a><br /><br />摘录一些东西，具体请下附件观看：<br /><br /></p>
		<p class="MsoNormal">
				<strong>
						<span style="FONT-FAMILY: 宋体">因为在这些卡里面，我们写上了类名，它的职责，以及它的协作关系，我们管这样的卡片叫“<span lang="EN-US">CRC</span>卡”。<span lang="EN-US">CRC</span>就是<span lang="EN-US">Class</span>，<span lang="EN-US">Responsibility</span>和<span lang="EN-US">Collaboration</span>的简称。<span lang="EN-US"><?xml:namespace prefix = o /?><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal">
				<strong>
						<span lang="EN-US" style="FONT-FAMILY: 宋体">CRC</span>
				</strong>
				<strong>
						<span style="FONT-FAMILY: 宋体">卡的典型应用　<span lang="EN-US"><o:p></o:p></span></span>
				</strong>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">为什么用<span lang="EN-US">CRC</span>卡，而不用文档或者更先进的<span lang="EN-US">UML</span>工具？<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">1.</span>
				<span style="FONT-FAMILY: 宋体">卡片上面的空间很小，这样就可以防止我们给这个类太多的职责。如果一个类的职责太多的话（比如，超过<span lang="EN-US">4</span>个），尝试以更抽象的方式去考虑一下，将职责划分。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">2.CRC</span>
				<span style="FONT-FAMILY: 宋体">卡主要是用在探索或者讨论类的设计的阶段。如果我们觉得这个设计不行的话，我们既不用修改文档，也不用修改类图，只要把卡片丢了就行了。此外，一旦设计完成，我们就可以把所有的卡丢了。它们不是用来做文档的。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
						<span>   </span>
						<span>
						</span>3.</span>
				<span style="FONT-FAMILY: 宋体">如果我们觉得现在的卡片不合适，之前设计的比较好，我们只要简单的把之前的卡片拿出来组合就行了。</span>
		</p>
<img src ="http://www.blogjava.net/Wingel/aggbug/85515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-05 10:51 <a href="http://www.blogjava.net/Wingel/archive/2006/12/05/85515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧8：用用户例事(user story)来管理项目</title><link>http://www.blogjava.net/Wingel/archive/2006/12/04/85312.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Mon, 04 Dec 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/04/85312.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/85312.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/04/85312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/85312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/85312.html</trackback:ping><description><![CDATA[
		<h2 style="MARGIN: 13pt 0cm; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">第</span>
				<span lang="EN-US">
						<font face="Arial">8</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">章</span>
				<font face="Arial">
				</font>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">以用户例事管理项目</span>
		</h2>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">                                                  </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是用户例事</span>
						<span lang="EN-US">(user story)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假定这个项目的客户是个饮料自动售货机的制造商。他们要求我们为他们的售货机开发一款软件。我们可以找他们的市场经理了解这个软件的需求。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此，我们的客户就是他们的市场经理。谈需求的时候，有一回他这样说：“用户往售货机每塞一个硬币，售货机都要显示当前该客户已经投了多少钱。当用户投的钱够买某一款饮料时，代表这款饮料的按钮的灯就会亮。如果那个用户按了这个按钮，售货机就放一罐饮料到出口，然后找零钱给他。”</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的话描述的是一件事情，一件用户通过系统完成他一个有价值的目标（买一罐饮料）的事。这样的过程就叫“用户案例</span>
				<span lang="EN-US">(user case)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”或者“用户例事</span>
				<span lang="EN-US">(user story)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。也就是说，上面我们的客户所说的话，就是在描述一个用户例事（</span>
				<span lang="EN-US">user story</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">(</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我解释一下为什么用例事这个词，没兴趣也可以忽略。在一个系统面前，每个用户要完成同样的目标，都要做这个系统设定的例行的事，这件事情不是一个例子，所以不叫事例，这也不是故事，也不能算一段历程，而是一个例行的事。</span>
				<span lang="EN-US">)<br /><br />　pdf下载地址：　<a href="/Files/Wingel/第8章以用户例事管理项目.rar">第8章以用户例事管理项目.rar</a></span>
		</p>
<img src ="http://www.blogjava.net/Wingel/aggbug/85312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-04 11:28 <a href="http://www.blogjava.net/Wingel/archive/2006/12/04/85312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧7－－分离数据库访问，UI和域逻辑</title><link>http://www.blogjava.net/Wingel/archive/2006/12/01/84879.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Fri, 01 Dec 2006 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/01/84879.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/84879.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/01/84879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/84879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/84879.html</trackback:ping><description><![CDATA[
		<p>具体pdf的下载地址：<br /><a href="/Files/Wingel/%E7%AC%AC7%E7%AB%A0%E5%B0%86%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BF%E9%97%AE%EF%BC%8CUI%E5%92%8C%E5%9F%9F%E9%80%BB%E8%BE%91%E5%88%86%E7%A6%BB.rar">分离数据库访问，UI和域逻辑</a><br /><br /><a href="http://wingel.javaeye.com/topics/download/ce15b67a-1df7-4a75-8f03-1a505aca35d8">http://wingel.javaeye.com/topics/download/ce15b67a-1df7-4a75-8f03-1a505aca35d8</a><br /><br />请从链接中下载，下面的内容只是摘要。<br /><br />处理三种类别的代码都混在了一起：<br /><br />   1.UI: JDialog, JTextField, 响应用户事件的代码。<br /><br />   2.数据库访问: Connection, PreparedStatement, SQL statements, ResultSet 等等。<br /><br />   3.域逻辑: 参会者的默认id，参会者的名字必填，所属地区的限制等等。域逻辑又称为“域模型”或者“业务逻辑”。<br /><br />这三个不同类别的代码混在一起，会造成下面的问题：<br />1.代码很复杂。<br />2.代码很难重用。如果我们想创建一个EditParticipantDialog，让用户更改参会者的信息，我们就想重用部分域逻辑（比如，地区的限制）。但实现这部分域逻辑的代码跟AddParticipantDialog混在了一起，根本不能重用。如果是在一个web系统中，就更难重用了。<br />3.代码很难测试。每次要测这样的一段代码，我们都要建一个数据库，还要通过一个用户操作界面来测试。<br />     4.如果数据库表结构更改了，AddParticipantDialog这个类，还有其他的很多地方都要跟着更改。<br />5.它导致我们一直在考虑一些低层的太细节的概念，比如数据库字段，表的记录之类的，而不是类，对象，方法和属性这一类的概念。或者说白了一点，一直在考虑怎么往数据库里面装数据，而没有了面向对象的概念，没有了建立业务模型的思维。<br /><br />因此，我们应该将这三种类别的代码分离开（UI，数据库访问，域逻辑）。        <a href="/Files/Wingel/%E7%AC%AC7%E7%AB%A0%E5%B0%86%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BF%E9%97%AE%EF%BC%8CUI%E5%92%8C%E5%9F%9F%E9%80%BB%E8%BE%91%E5%88%86%E7%A6%BB.rar"></a></p>
<img src ="http://www.blogjava.net/Wingel/aggbug/84879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-01 16:16 <a href="http://www.blogjava.net/Wingel/archive/2006/12/01/84879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创翻译)敏捷开发的必要技巧6　处理不合适的依赖</title><link>http://www.blogjava.net/Wingel/archive/2006/12/01/84733.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Fri, 01 Dec 2006 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/01/84733.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/84733.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/01/84733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/84733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/84733.html</trackback:ping><description><![CDATA[
		<p>下载：<br /><a href="/Files/Wingel/%E7%AC%AC6%E7%AB%A0%E5%A4%84%E7%90%86%E4%B8%8D%E5%90%88%E9%80%82%E7%9A%84%E5%BC%95%E7%94%A8.rar">http://www.blogjava.net/Files/Wingel/第6章处理不合适的引用.rar</a><br />or<br /><a href="http://wingel.javaeye.com/topics/download/afd36f87-a11b-4d18-a01b-a843092ec1bc">http://wingel.javaeye.com/topics/download/afd36f87-a11b-4d18-a01b-a843092ec1bc</a><br /><br />　　如果现在有一个类Parent，里面有个属性的类型是Child，add的方法里面还有个参数的类型是Girl：<br />　　class Parent{<br />        Child child;<br /> void add(Girl girl){<br />    ...<br /> }<br />     }<br />     因为上面Parent里面用到了Child跟Girl这两个类，我们就说，Parent引用了类Child跟类Girl。现在的问题是，如果Child这个类或者Girl这个类编译不过的话，那么Parent这个类也编译不了了。也就是说，Parent依赖于Child跟Girl。这章讲述的，就是因为一些类的依赖造成的无法重用的问题。<br /><br /><font face="Verdana"><strong><a href="/Files/Wingel/%E7%AC%AC6%E7%AB%A0%E5%A4%84%E7%90%86%E4%B8%8D%E5%90%88%E9%80%82%E7%9A%84%E5%BC%95%E7%94%A8.rar"><font color="#ff0000">具体的内容在上面的下载链接里面的pdf文件里，内容较多。</font></a></strong><br /></font></p>
<img src ="http://www.blogjava.net/Wingel/aggbug/84733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-01 09:28 <a href="http://www.blogjava.net/Wingel/archive/2006/12/01/84733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《敏捷开发的必要技巧》各章节都在“敏捷开发”这个分类中</title><link>http://www.blogjava.net/Wingel/archive/2006/12/01/84728.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Fri, 01 Dec 2006 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/12/01/84728.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/84728.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/12/01/84728.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/84728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/84728.html</trackback:ping><description><![CDATA[
		<p>或者点这个链接：<br /><br /><a href="/Wingel/category/17919.html">http://www.blogjava.net/Wingel/category/17919.html</a><br /></p>
<img src ="http://www.blogjava.net/Wingel/aggbug/84728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-12-01 09:22 <a href="http://www.blogjava.net/Wingel/archive/2006/12/01/84728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译） 敏捷开发的必要技巧5：慎用继承</title><link>http://www.blogjava.net/Wingel/archive/2006/11/29/84419.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Wed, 29 Nov 2006 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/11/29/84419.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/84419.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/11/29/84419.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/84419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/84419.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当我们要继承一个父类时，我们要保证父类里面所有了public方法都是子类想要的，它不应该去继承一些它不用的功能。&nbsp;&nbsp;<a href='http://www.blogjava.net/Wingel/archive/2006/11/29/84419.html'>阅读全文</a><img src ="http://www.blogjava.net/Wingel/aggbug/84419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-11-29 20:40 <a href="http://www.blogjava.net/Wingel/archive/2006/11/29/84419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创翻译)敏捷开发的必要技巧4：保持代码的简洁</title><link>http://www.blogjava.net/Wingel/archive/2006/11/28/84137.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Tue, 28 Nov 2006 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/11/28/84137.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/84137.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/11/28/84137.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/84137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/84137.html</trackback:ping><description><![CDATA[完整书籍<br /><a href="../../Files/Wingel/%E7%AC%AC4%E7%AB%A0%E4%BF%9D%E6%8C%81%E4%BB%A3%E7%A0%81%E7%AE%80%E6%B4%81.rar">http://www.blogjava.net/Files/Wingel/第4章 保持代码简洁.rar</a><br /><br /><a href="http://wingel.javaeye.com/topics/download/3589b4d8-8e29-4560-b0e7-8cb15a8ed995">第4章 保持代码简洁</a><a href="http://wingel.javaeye.com/topics/download/3589b4d8-8e29-4560-b0e7-8cb15a8ed995"></a><br /><br />第4章  保持代码简洁<br /><br />     <br />示例<br /><br />    这是一个会议管理系统。它用来管理所有参会者的信息。刚开始的时候，我们只需要记录每个参会者的ID（这是会议组织者分配的），姓名，电话和地址就行。于是，我们写了如下的代码：<br />    <br />    class Participant {                                                                            <br />       String id;                                                                                  <br />       String name;                                                                                <br />       String telNo;                                                                               <br />       String address;                                                                             <br />    }    <br />    <br />    class ConferenceSystem {                                                                       <br />       Participant participants[];                                                                 <br />    }                                                                                              <br /><br />    接着，新的需求来了：现在每个参会者都可以让组织者帮忙预订酒店，所以我们要记录下他想预订的酒店名，入住日期，离开日期，房间类型（单人房或者双人房）。于是我们又扩充成如下的代码：    <br /><br />    class Participant {                                                                            <br />       String id;                                                                                  <br />       String name;                                                                                <br />       String telNo;                                                                               <br />       String address;                                                                             <br />       boolean bookHotelForHim;                                                                    <br />       String hotelName;                                                                           <br />       Date checkInDate;                                                                           <br />       Date checkOutDate;                                                                          <br />       boolean isSingleRoom;                                                                       <br />       void setHotelBooking(String hotelName, Date checkInDate, ...) {                             <br />           ...                                                                                     <br />       }                                                                                           <br />    }                                                                                              <br /><br />    接着，又有一个新的需求来了：参会者可以参加不同的研讨会，所以我们要记录下参会者参加的研讨会。对于他要参加的每一场研讨会，我们还要记录下他的登记时间，同时他还需要什么翻译设备。于是代码又扩充成：<br /><br /><a href="/Files/Wingel/%E7%AC%AC4%E7%AB%A0%E4%BF%9D%E6%8C%81%E4%BB%A3%E7%A0%81%E7%AE%80%E6%B4%81.rar"><font face="Verdana" color="#ff0000"><strong>具体的内容在上面的下载链接里面的pdf文件里。</strong></font></a><br /><br />完整书籍<br /><a href="/Files/Wingel/%E7%AC%AC4%E7%AB%A0%E4%BF%9D%E6%8C%81%E4%BB%A3%E7%A0%81%E7%AE%80%E6%B4%81.rar">http://www.blogjava.net/Files/Wingel/%E7%AC%AC4%E7%AB%A0%E4%BF%9D%E6%8C%81%E4%BB%A3%E7%A0%81%E7%AE%80%E6%B4%81.rar<br /></a><img src ="http://www.blogjava.net/Wingel/aggbug/84137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-11-28 20:51 <a href="http://www.blogjava.net/Wingel/archive/2006/11/28/84137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧----消除代码异味</title><link>http://www.blogjava.net/Wingel/archive/2006/11/27/83886.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Mon, 27 Nov 2006 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/11/27/83886.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/83886.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/11/27/83886.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/83886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/83886.html</trackback:ping><description><![CDATA[  <a href="../../Files/Wingel/%E7%AC%AC3%E7%AB%A0%20%E9%99%A4%E5%8E%BB%E4%BB%A3%E7%A0%81%E5%BC%82%E5%91%B3.rar">http://www.blogjava.net/Files/Wingel/第3章%20除去代码异味.rar</a><br />                第3章 除去代码异味　<br /><br /><br />    异味这个词,可能有点抽象,我们先看一下下面的例子<br /><br />    这是一个CAD系统. 现在,它已经可以画三种形状了:线条,长方形,跟圆.<br />先认真的看一下下面的代码:<br /><br />    class Shape {                                                                                   <br />       final static int TYPELINE = 0;                                                               <br />       final static int TYPERECTANGLE = 1;                                                          <br />       final static int TYPECIRCLE = 2;                                                             <br />       int shapeType;                                                                               <br />       //线条的开始点<br />       //长方形左下角的点<br />       //圆心<br />       Point p1;                                                                                    <br />       //线条的结束点<br />       //长方形的右上角的点<br />       //如果是圆的话,这个属性不用<br />       Point p2;                                                                                    <br />       int radius;                                                                                  <br />    }                                                                                               <br />    class CADApp {                                                                                  <br />       void drawShapes(Graphics graphics, Shape shapes[]) {                                         <br />           for (int i = 0; i &lt; shapes.length; i++) {                                                <br />               switch (shapes[i].getType()) {                                                       <br />                  case Shape.TYPELINE:                                                              <br />                      graphics.drawLine(shapes[i].getP1(), shapes[i].getP2());                      <br />                      break;                                                                        <br />                  case Shape.TYPERECTANGLE:                                                         <br />                      //画四条边<br />                      graphics.drawLine(...);                                                       <br />                      graphics.drawLine(...);                                                       <br />                      graphics.drawLine(...);                                                       <br />                      graphics.drawLine(...);                                                       <br />                      break;                                                                        <br />                  case Shape.TYPECIRCLE:                                                            <br />                      graphics.drawCircle(shapes[i].getP1(), shapes[i].getRadius());                <br />                      break;                                                                        <br />               }                                                                                    <br />           }                                                                                        <br />       }                                                                                            <br />    }                                                                                               <br /><br /><br />    代码都是一直在改变的,而这也是上面的代码会碰到的一个问题.<br /><br />    现在我们有一个问题: 如果我们需要支持更多的形状(比如三角形), 那么肯定要改动Shape这个类, CADApp里面的drawShapes这个方法也要改.<br />好,改为如下的样子:<br />  <br />......<br /><br /><br />    如果我们想要支持更多的图形（比如：三角形），上面没有一个类需要修改。我们只需要创建一个新的类Triangle就行了。<br /><br /><a href="/Files/Wingel/第3章%20除去代码异味.rar"><font face="Verdana" color="#ff0000"><strong>具体的内容在上面的下载链接里面的pdf文件里，看pdf比较舒服。</strong></font></a><br /><br /><a href="/Files/Wingel/%E7%AC%AC3%E7%AB%A0%20%E9%99%A4%E5%8E%BB%E4%BB%A3%E7%A0%81%E5%BC%82%E5%91%B3.rar">http://www.blogjava.net/Files/Wingel/第3章%20除去代码异味.rar</a><img src ="http://www.blogjava.net/Wingel/aggbug/83886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-11-27 21:23 <a href="http://www.blogjava.net/Wingel/archive/2006/11/27/83886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原创翻译）敏捷开发的必要技巧----移除重复代码，将注释转为代码</title><link>http://www.blogjava.net/Wingel/archive/2006/11/27/83885.html</link><dc:creator>Wingel</dc:creator><author>Wingel</author><pubDate>Mon, 27 Nov 2006 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/Wingel/archive/2006/11/27/83885.html</guid><wfw:comment>http://www.blogjava.net/Wingel/comments/83885.html</wfw:comment><comments>http://www.blogjava.net/Wingel/archive/2006/11/27/83885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Wingel/comments/commentRss/83885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Wingel/services/trackbacks/83885.html</trackback:ping><description><![CDATA[  <a href="../../Files/Wingel/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91%E7%9A%84%E5%BF%85%E8%A6%81%E6%8A%80%E5%B7%A7%E7%AC%AC1,2%E7%AB%A0.rar">http://www.blogjava.net/Files/Wingel/敏捷开发的必要技巧第1,2章.rar</a>                                                                                                                    <br />                第1章　移除重复代码<br />                                                                                <br />重复代码是怎么产生的？<br /><br />请观察下面的代码，我们已经有一个根据出租记录的id取出租用客户的姓名的方法:getCustomerName。<br /><br />    public class BookRental { //该类描述出租记录<br />        String id; <br />        String customerName; <br /><br />        ... <br /><br />    } <br />    public class BookRentals { <br />       private Vector rentals; <br />       public String getCustomerName(String rentalId) { 根据出租id取出客户姓名<br />           for (int i = 0; i &lt; rentals.size(); i++) { <br />              BookRental rental = (BookRental) rentals.elementAt(i); <br />              if (rental.getId().equals(rentalId)) { <br />                  return rental.getCustomerName(); <br />               } <br />           } <br />           throw new RentalNotFoundException(); <br />        } <br />    } <br />    public class RentalNotFoundException extends Exception { <br /><br />        ... <br /><br />    } <br /><br />假定现在你要增加一个新的方法，该方法是根据出租记录的id删除该记录,然后把它命名为deleteRental(String rentalId)。现在你已经考虑到，就像getCustomerName这个方法一样，你要一个一个遍历出租记录。所以你就将getCustomerName这个方法里面的一些代码拷出来，然后稍微修改一下：<br /><br />  <br />.....<br /><br /><br />为什么我们要移除重复代码？ <br /><br />我来向各位程序员同学稍微说一下，在BookRentals这个类中，rentals这个属性的类型是Ventor，如果我们需要将它改为数组，那我们就必须将所有的"rentals.size()"改为"rentals.length". 在重构以后的版本中，我们只需要在getRentalIdxById这个方法中修改一次，而在原来的版本，我们就得在getCustomerName跟deleteRental两个方法中都改一次。类似的，我们还要将所有的"rentals.elementAt(i)" 改为 "rentals[i]". 又是改一次跟改两次的比较！<br /><br />大多数情况中，如果类似这样的代码在10个地方重复，当我们修改代码的时候，就要修改10个地方，我们并不能保证能把这10个地方都记住了，而一旦漏掉了几个地方，等待我们的，是一处一处的错误去修复。而最致命的是,当我们修改的是业务逻辑时,这时候，不管我们漏掉了几个地方，IDE都不会报错，那么，等待我们的，将一堆去检查，而造成的一些bug中,很可能是短时间内还发现不了了.惨-_-!!<br /><br /><a href="/Files/Wingel/敏捷开发的必要技巧第1,2章.rar"><font color="#ff0000"><strong>具体的内容在上面的下载链接里面的pdf文件里，看pdf比较舒服。</strong></font></a><br /><br /><a href="/Files/Wingel/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91%E7%9A%84%E5%BF%85%E8%A6%81%E6%8A%80%E5%B7%A7%E7%AC%AC1,2%E7%AB%A0.rar">http://www.blogjava.net/Files/Wingel/敏捷开发的必要技巧第1,2章.rar</a><img src ="http://www.blogjava.net/Wingel/aggbug/83885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Wingel/" target="_blank">Wingel</a> 2006-11-27 21:22 <a href="http://www.blogjava.net/Wingel/archive/2006/11/27/83885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>