﻿<?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-皇家方舟-随笔分类-学习日志</title><link>http://www.blogjava.net/xixuui/category/14681.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 18 Jul 2007 23:06:15 GMT</lastBuildDate><pubDate>Wed, 18 Jul 2007 23:06:15 GMT</pubDate><ttl>60</ttl><item><title>ICE学习</title><link>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 18 Jul 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/131077.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/131077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/131077.html</trackback:ping><description><![CDATA[链接：<a href="http://www.cnblogs.com/SGSoft/archive/2007/05/02/734775.html">http://www.cnblogs.com/SGSoft/archive/2007/05/02/734775.html</a><br /><a href="http://www.zeroc.com/download.html#bin">http://www.zeroc.com/download.html#bin</a><br /><img src ="http://www.blogjava.net/xixuui/aggbug/131077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-18 15:01 <a href="http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 简单命令</title><link>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Tue, 03 Jul 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/127746.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/127746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/127746.html</trackback:ping><description><![CDATA[source c:\abc.sql; 执行sql脚本<br /><br />use database;切换数据库<br />desc table;查看表属性<br />show create table tablename; 查看建表时的语句<br /><img src ="http://www.blogjava.net/xixuui/aggbug/127746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-03 09:58 <a href="http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML中类之间的关系及其Java代码例子&lt;转&gt;</title><link>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Fri, 22 Jun 2007 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/125793.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/125793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/125793.html</trackback:ping><description><![CDATA[
		<font color="#555555">关系是事物之间的联系。类之间有4种重要的关系：依赖、泛化、关联和实现。这些关系都可以映射到代码里。<br /></font>
		<font color="#333333">依赖是一种使用关系，描述了一个事物的规格说明的变化可能会影响到使用它的另一个事物（反之不一定）。在UML中表示为一条指向被依赖事物的虚线。依赖有很多构造型，不过一般不需要使用，以免搞得过份复杂。其实另外3种关系泛化、关联和实现都可以算作是某种依赖关系，只不过它们有比较强的语义和重要的作用，所以划分出来。一般对类关系建模的时候，先对泛化、关联和实现建模，剩下的关系都可以看作依赖了。<br />对应到代码中，依赖关系可能有很多种形式，例如<br />public class A<br />{<br />   public B getB(C c, D d)<br />   {<br />       E e = new E();<br />       B b = new B(c, d, e);<br />   }<br />}<br />这里类A就依赖于类B（方法返回类）、C和D（参数类）、E（方法内变量的类），因为这几个类的变化都有可能影响到类A <br /><br /></font>
		<font color="#555555">泛化是一般事物（称为超类或父类）和较特殊的事务（称为子类）之间的关系，对类来说一般就是继承了，如：public Class A extends B。一般用一个带空心箭头的实线表示泛化关系。<br /><br /></font>
		<font color="#333333">关联是一种结构关系，说明一个事物的对象与另一个事物的对象相联系。给定一个连接两各类的关联，可以从一个类的对象导航到另一个类的对象。<br />一般把关联画为连接相同或者不同的类一条实线。关联可以有方向，即导航。一般不作说明的时候，导航是双向的，不需要在线上标出箭头。大部分情况下导航是单向的，可以加一个箭头表示。<br />关联在代码中一般表示为属性，例如<br />public class A<br />{<br />private B b;<br />}<br />可以认为有一个A指向B的关联。<br />如果B也关联到A，那么它们就是双向的关联。<br />有的时候B不是A的属性，但是也可以有关联关系，例如：<br />public class A<br />{<br />public B[] getBs()<br />{...}<br />}<br />方法getBs可能去查数据库，找到A和B之间的关联关系。 <br /><br /><font color="#555555">两个类之间的简单关联表示了两个同等地位类之间的结构关系。聚合也是一种关联关系，与简单关联不同的是，它描述的是一个整体和组成部分的关系，即“has-a”关系，意思是整体对象拥有部分对象，例如学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系，部分对象可以在整体对象创建之前创建，也可以在整体对象销毁之后销毁。聚合用带一个空心菱形（整体的一端）的实线表示。<br />public Class Person<br />{...} </font><p>public Class School<br />{<br />private ArrayList students;<br />private void addStudent(Person person)<br />{<br />students.add(person);<br />}<br />}<br />组合则是比聚合更强的关联形式。组合是指带有很强的拥有有关系且整体与部分的生命周期一致的聚合关联形式。例如Windows的窗口和窗口上的菜单就是组合关系。生命周期一致指的是部分必须在组合创建的同时或者之后创建，在组合销毁之前或者同时销毁，部分的生命周期不会超 
</p><p>出组合的生命周期。组合是用带实心菱形的实线来表示。<br />public Class Menu<br />{...}<br />public Class Window<br />{<br />private Menu menu;<br />}<br />组合和聚合在代码实现上的主要差别在于生命周期的实现上，组成需要负责其部分的创建和销毁。<br />public Class School<br />{<br />public School()<br />{...}//不需要创建任何Person对象，其Students都是已有的Person对象<br />public void destroy()<br />{...}//只需要关掉School对象和断开它与自己所有的Person对象的关联即可，Person对象是不会销毁的<br />} 
</p><p>public Class Window<br />{<br />private Menu menu;<br />public Window()<br />{<br />menu = new Menu();<br />}//可以在这时候创建Menu对象，也可以在之后创建<br />public void destory()<br />{<br />menu.destory();<br />}//必须同时或者在这之前销毁关联的Menu对象<br />} 
</p><p>另外有一个差别是组合中的一个对象在同一时刻只能属于一个组成对象，而聚合的一个部分对象可以被多个整体对象聚合，例如一个学生可以在多个学校就读，而一个菜单在同一时刻只能是某个窗口内的对象。 <br /><br />实现关系就比较简单了，指的是一个类元描述了另一个类元保证实现的契约。对类来说，就是一个类实现了一个接口<br />public interface A<br />{<br />public void methodA();<br />}<br />public class B implements A<br />{<br />public void methodA()<br />{...}<br />...<br />}<br />一般在面对对象的系统中，尽可能的使用接口来减少类之间的耦合。因为接口没有实现，所以依赖于接口就不会依赖于某种具体实现，例如jdbc里的Connection和ResultSet都是接口，不同数据库厂商的实现可以不一样。<br /><br /><font color="#555555">总结一下<br />1)依赖关系：关系对象出现在局部变量或者方法的参数里，或者关系类的静态方法被调用<br />2)关联关系：关系对象出现在实例变量中<br />3)聚合关系:关系对象出现在实例变量中<br />4)合成关系：关系对象出现在实例变量中<br />5)Generalization:   extends<br />6)实现：    implements </font></p><p><font color="#555555"></font> </p><p>聚合是这样的：学生与所选课程之间的关系就是组合，他们之间在感念上没有必然关系，删掉一门课程，不会影响到学生 <br />组合是这样的：订单和订单条目的关系就是聚合，他们的关系很紧密，删掉一个订单，订单条目也就没有意义了<br />组合是聚合的一种形式</p></font>
<img src ="http://www.blogjava.net/xixuui/aggbug/125793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-06-22 11:52 <a href="http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作中常用的小方法集合</title><link>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 26 Apr 2007 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/113877.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/113877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/113877.html</trackback:ping><description><![CDATA[获取本机IP<br />public static String getLocalHostIp() throws SocketException<br /> {<br />  Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();<br />  while(netInterfaces.hasMoreElements())<br />  {<br />   NetworkInterface ni = (NetworkInterface)netInterfaces.nextElement();<br />   Enumeration&lt;InetAddress&gt; inetAddresses = ni.getInetAddresses();<br />   while(inetAddresses.hasMoreElements())<br />   {<br />    InetAddress ip = inetAddresses.nextElement();<br />    if(!ip.isLoopbackAddress())<br />    {<br />     return ip.getHostAddress();<br />    }<br />   }<br />  }<br />  return null;<br /> }<br /><br />获取本机MAC<br />public static String getLocalMac() throws IOException<br /> {<br />  Process p1 = Runtime.getRuntime().exec("ipconfig   /all");<br />  BufferedReader br = new BufferedReader(<br />            new InputStreamReader(<br />                  p1<br />                   .getInputStream()));<br />  String buf = br.readLine();<br />  while(buf != null)<br />  {<br />   if(buf.contains("Physical Address"))<br />   {<br />    int i = buf.indexOf("Physical Address") + 36;<br />    return buf.substring(i).trim();<br />   }<br />   buf = br.readLine();<br />  }<br />  return "000000";<br /> }<img src ="http://www.blogjava.net/xixuui/aggbug/113877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-04-26 18:12 <a href="http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新工作流程</title><link>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Sat, 09 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/86549.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/86549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/86549.html</trackback:ping><description><![CDATA[通过学习TDD以及三个月来杨博的多次言传身教和他写的一些文档，得到了下面这一套工作流程：
1.       获得任务。即项目经理安排的任务。任务往往不止一项。将它们写入周工作计划表或者月工作计划表。
2.       选择任务。每天开始工作之前，将今天将要完成的任务写入工作计划列表。并选择自己最有把握完成的任务作为当前任务。
3.       分析并分解任务。将当前任务分解成一个个相对简单的问题，分解的问题最好是能在短时间之内能完成，并将它们写入工作列表。
4.       写测试列表。选择一个简单的问题(此时可以为该方法取名了)，并将所要完成的所有功能写入工作列表。这就是方法注释中的功能注释。并且将每一项功能所对应的单元测试记录下来，写入测试列表。
5.       选择测试。从测试列表中选择那个具有指导意义而且自己认为最有把握实现的一项。如：一个数值对象类，也许对我来说，实现equals()方法是最有把握的，那我就可以选择它作为我的当前测试。
6.       编写测试数据。写一个容易让人理解的必须实现的测试数据列表，尽量使用显然数据。如：用 String 表示 IP 地址 "255.255.255.255" 转换为 int ，在我们写测试数据时应这样写： (255 << 24) + (255 << 16) + (255 << 8) + 255 ，而不应该写成“ -1 ”。 
7.       编写测试。选择一项最容易让测试通过的测试数据加入测试方法。如：实现equals()方法中“比较两个不是同类的对象返回false”的测试是最容易实现的，我就可以将它加入是最容易实现的，那就先实现它吧！断言优先，然后加入为了让断言通过编译的一切准备条件。
8.       运行测试，不可运行状态。 
9.     编写功能代码，使之达到可运行状态。 
10.   重构，消除重复设计。 
11.   往测试方法中增加一个新的小测试。 
12.   运行测试，不可运行状态。 
13.   修改功能代码，使之达到可运行状态。 
14.   重构。消除重复设计。 
15.   重复 12-15 。 
16.   当无论如何也不能让该测试通过的时候，认真想一想是不是哪里出大问题了，如果实在想不出来的话，就将现有代码扔掉，重新开始。 
17.   所有测试都运行通过之后，仔细检查所有代码，看是否还有值得重构的地方，并重构。 
18.   提交 (check in) 。 
19.   再选择测试列表中的下一个测试。重复以上步骤。 
20.   当要离开工作的时间比较久时，若有某个任务未完成，则留下一个不完整测试，以便于回到工作岗位时能迅速回忆起当时写该代码时的想法，并接着写下去。 

<img src ="http://www.blogjava.net/xixuui/aggbug/86549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-09 16:40 <a href="http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作总结</title><link>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 07 Dec 2006 00:57:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/85992.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/85992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/85992.html</trackback:ping><description><![CDATA[      三个月来，一直都在学习杨博的编程思想，也阅读了他推荐的几本好书，通过这一段时间的学习，觉得自己确实在编程方面有了比较大的提高，对编程中最为重要的两个环节（单元测试、重构）也都有了一定的了解；另外一个收获是作为一个团队的成员，应该如何与队友进行交流并表达自己的想法。<br />      现在，谈谈如何进行团队合作。首先，应该为自己定位，自己在团队中处于什么位置，应该做哪些事情？其次，当自己有什么新的想法(不管是否正确)时，一定要与团队成员进行交流。如果自己的想法是正确的，那团队就很可能采用自己的新想法；当然有的时候想法也不一定正确，但是却肯定会引起大家的讨论，也许就可能从新的想法中得到其它的什么提示，而产生另外的好的想法也不一定。<br />       接着，讲讲自己在这段时间的学习成果吧！虽然不多，但却非常有用。首先，学习了使用TDD(测试驱动开发)模式进行软件开发；其次，学习如何写好注释；另外，还学习了怎样嗅出代码中的臭味，并进行重构。<br />      <img src ="http://www.blogjava.net/xixuui/aggbug/85992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-07 08:57 <a href="http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何测试异常？</title><link>http://www.blogjava.net/xixuui/archive/2006/12/06/85796.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 06 Dec 2006 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/06/85796.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/85796.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/06/85796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/85796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/85796.html</trackback:ping><description><![CDATA[
		<p>      在写单元测试时，如何写异常的测试是很多人的难题。很多书建议使用如下方法进行测试：<br />public void method()<br />{<br />      throw new RuntimeException("exception message");<br />}<br />public void testException()<br />｛<br />      try<br />      {<br />         method();<br />         fail();<br />      }<br />      catch(Exception e)<br />      {<br />         assertTrue(true);/或者此处不写<br />      }<br />｝<br />      通过这种测试，可以测试方法中是否会达到期望的要求，在方法出现预期中的异常时是否会抛出该异常，若没有像期望的一样抛出异常，则单元测试会运行到"fail();"使得单元测试不会通过。正常情况下是没有问题的。但是有的时候方法内部会有多个子方法抛出同一个异常（或者说抛出的多个异常都继承于同一个异常类），因此这个时候我们必须定位到是哪个子方法抛出的异常，而通过以上方法是不能达到这个目标的。为了达到这个目标，可以通过判断异常中的信息来判断是哪个子方法出错。通常，程序员会在抛出异常时会将产生该异常的原因写入异常信息中，如：new Exception(message)。因此，我们只要在单元测试中能捕捉到该异常信息，往往就能定位到该异常出现的位置。<br />只需要将以上测试的catch块中的语句改为如下语句即可：<br />assertTrue(e.toString().contains(exception message));<br /><br /><br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/85796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-06 12:03 <a href="http://www.blogjava.net/xixuui/archive/2006/12/06/85796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据的合法性检测</title><link>http://www.blogjava.net/xixuui/archive/2006/12/01/84769.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Fri, 01 Dec 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/01/84769.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/84769.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/01/84769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/84769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/84769.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">一般的数据类都应该有自己的数据合法性检查，如一个Person类，它的年龄属性是int型的，但是如果给它赋值10000则为不合法，一个人不可能活那么长时间。因此需要在创建该类的对象时必需对其进行合法性检查，若构造方法传入的是非法数据，则不让其创建该对象，并抛出异常。也许大多数人认为只需要对构造方法传入的参数进行合法性检查即可。如下所示：<br />class ValidClass<br />{<br /><span lang="EN-US"><span style="mso-tab-count: 2">        </span>int <span style="mso-spacerun: yes"> </span>dataValid1;<br /></span>        String dataValid2;<br /><br />         public ValidClass(int i, String str)<br />         {<br />               check(int i, String str);<br />               dataValid1 = i;<br />               dataValid2 = str;<br />         }<br /><br />         void check(int i, String str)<br />         {<br />            if(i &gt;100 &amp;&amp; i &lt;= 0) throws new RuntimeException("message");<br />            if(str == "str") throws new RuntimeException("message");<br />         }<br /><br />         void setDataValid1(int dataValid1)<br />         {<br />               this.dataValid1 = dataValid1;<br />         }<br />}<br />实际上这种合法性并不可靠，这样只是保证了在构造方法中传入的数据是合法的，但是不能保证程序员在使用该对象时能传入合法的数据。如下程序代码：<br />ValidClass validClass = new ValidClass(2, "123");<br />validClass.set(200);<br />这样使用的话，程序运行并不会报错，但是实际上我们已经传入了非法数据到该对象中去了，因此为了避免出现程序员在使用的时候也犯这种错误，对数据的合法性检查的正确方式应如下所示：<br />class ValidClass</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>{</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>int <span style="mso-spacerun: yes"> </span>dataValid;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>protected checkDataValid()</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>{</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 3">                     </span>check if dataValid valid</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 3">                     </span>if (fail)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 3">                     </span>{<span style="mso-tab-count: 1">     </span>throws new RZXDataException(this, “.needValidate=”</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 126pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">+needValidate); } </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">public ValidClass(int in)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>{<span style="mso-tab-count: 1">     </span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">setDataValid(in);<span style="mso-tab-count: 1">     </span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>public setDataValid(int in)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>{<span lang="EN-US"><span style="mso-tab-count: 3">                     </span><br />                     checkNeedValidate();</span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 3">                     </span>dataValid = in;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>}</span>
		</p>
		<p>在set方法中进行合法性检查，然后在构造方法中也调用set方法设置字段值，而不直接使用类中的字段。这样做的好处很明显：不仅保证了构造方法中传入的数据必须合法，而且可以保证程序在使用的过程中不能使用非法数据，如果程序员使用了非法数据，程序运行必然出错，并且能够很快的找到错误的根源所在。<br /><br />         另外，有些程序员认为，有些数据类的对象全部来自于另一个数据对象，也就是说该类的构造方法中的参数即另一个数据类对象，因此在该类中所有与被传入对象类中有相同的合法性检查的数据字段不需要再进行合法性检查了。其实这种想法是错误的，问题与上面所说的一样，你能保证传入的数据是合法的，但不能保证使用者在调用你的set方法时能100%传入合法数据。因此，程序员是不应该偷这个懒的。也许有人会说，他们的合法性检查完全一样，如果在该类中再写的话就会出现大量的重复代码了。能想到这里是对的，但是如果你有一定的经验，你就知道去建立一个专门保存合法性检查方法的类，这样你就可以在需要进行合法性检查的时候就使用该类里面的方法，如果该类中没有你所需要的方法，你就可以在里面加入你所需要的合法性检查方法，再去使用它。这样做会使得代码非常的清晰。<br /><br />         我认为，应该在自己类中的所有使用“this.value = data;”字样的代码都应该使用setValue()，因为也许这个字段现在不需要进行合法性检查，但是不能保证将来也没有合法性要求。而一旦以后需要对该字段进行合法检查的时候，就需要在set方法中增加合法性检查代码，而且需要将该类中所有对该字段的赋值语句均改用set方法。一旦有某处漏掉，则很可能带来致命的错误。也许在某个运算中带来了非法数据，但是你却怎么也不会往这方面去想，因为你一直以为自己全部都作了合法性检查的。</p>
<img src ="http://www.blogjava.net/xixuui/aggbug/84769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-01 10:59 <a href="http://www.blogjava.net/xixuui/archive/2006/12/01/84769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重构——改善既有代码的设计  源代码</title><link>http://www.blogjava.net/xixuui/archive/2006/11/15/81267.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 15 Nov 2006 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/11/15/81267.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/81267.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/11/15/81267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/81267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/81267.html</trackback:ping><description><![CDATA[
		<p>package cn.com;</p>
		<p>
				<br />import java.util.Enumeration;<br />import java.util.Vector;</p>
		<p>
				<br />public class Customer<br />{<br /> private String _name;// 姓名<br /> private Vector&lt;Rental&gt; _rentals = new Vector&lt;Rental&gt;();// 租借记录</p>
		<p>
				<br /> public Customer(String name)<br /> {<br />  this._name = name;<br /> }</p>
		<p>
				<br /> public String getName()<br /> {<br />  return _name;<br /> }</p>
		<p>
				<br /> public void addRental(Rental arg)<br /> {<br />  this._rentals.addElement(arg);<br /> }</p>
		<p>
				<br /> public String statement()<br /> {<br />  double totalAmount = 0;// 总消费金额<br />  int frequentRenterPoints = 0;// 常客积点<br />  Enumeration rentals = this._rentals.elements();<br />  String result = "Rental Record for" + getName() + "\n";</p>
		<p>  while(rentals.hasMoreElements())<br />  {<br />   double thisAmount = 0;<br />   Rental each = (Rental)rentals.nextElement();</p>
		<p>   // determin amounts for each line<br />   switch(each.get_movie().get_priceCode())<br />   {<br />    case Movie.REGULAR:<br />     thisAmount += 2;<br />     if(each.get_dayRented() &gt; 2)<br />      thisAmount += (each.get_dayRented() - 2) * 1.5;<br />     break;<br />    case Movie.NEW_RELEASE:<br />     thisAmount += each.get_dayRented() * 3;<br />     break;<br />    case Movie.CHILDRENS:<br />     thisAmount += 1.5;<br />     if(each.get_dayRented() &gt; 3)<br />      thisAmount += (each.get_dayRented() - 3) * 1.5;<br />     break;<br />   }</p>
		<p>   // add frequent renter points(累加 常客积点)<br />   frequentRenterPoints++;</p>
		<p>   // add bonus for a two day new release rental<br />   if((each.get_movie().get_priceCode()) == Movie.NEW_RELEASE<br />    &amp;&amp; each.get_dayRented() &gt; 1)<br />    frequentRenterPoints++;<br />   // show figures for this rental(显示此笔租借数据)<br />   result += "\t" + each.get_movie().get_title() + "\t"<br />      + String.valueOf(thisAmount) + "\n";</p>
		<p>   totalAmount += thisAmount;<br />  }</p>
		<p>  // add footer lines(结尾打印)<br />  result += "Amount owed is " + String.valueOf(totalAmount) + "\n";<br />  result += "You earned " + String.valueOf(frequentRenterPoints)<br />     + "frequent renter points";<br />  return result;<br /> }<br />}<br /><br />package cn.com;</p>
		<p>
				<br />public class Movie<br />{<br /> public static final int CHILDRENS = 2;<br /> public static final int REGULAR = 0;<br /> public static final int NEW_RELEASE = 1;</p>
		<p> private String _title; // 名称<br /> private int _priceCode;// 价格</p>
		<p>
				<br /> public Movie(String _title, int _priceCode)<br /> {<br />  this._title = _title;<br />  this._priceCode = _priceCode;<br /> }</p>
		<p>
				<br /> /**<br />  * @return 返回 _priceCode。<br />  */<br /> public int get_priceCode()<br /> {<br />  return _priceCode;<br /> }</p>
		<p>
				<br /> /**<br />  * @param code<br />  *        要设置的 _priceCode。<br />  */<br /> public void set_priceCode(int code)<br /> {<br />  _priceCode = code;<br /> }</p>
		<p>
				<br /> /**<br />  * @return 返回 _title。<br />  */<br /> public String get_title()<br /> {<br />  return _title;<br /> }<br />}<br /><br />package cn.com;</p>
		<p>
				<br />public class Rental<br />{<br /> private Movie _movie;// 影片<br /> private int _dayRented;// 租期</p>
		<p>
				<br /> public Rental(Movie _movie, int _dayRented)<br /> {<br />  this._movie = _movie;<br />  this._dayRented = _dayRented;<br /> }</p>
		<p>
				<br /> public int get_dayRented()<br /> {<br />  return _dayRented;<br /> }</p>
		<p>
				<br /> public Movie get_movie()<br /> {<br />  return _movie;<br /> }<br />}<br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/81267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-11-15 15:14 <a href="http://www.blogjava.net/xixuui/archive/2006/11/15/81267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注释要点</title><link>http://www.blogjava.net/xixuui/archive/2006/11/13/80817.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 13 Nov 2006 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/11/13/80817.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/80817.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/11/13/80817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/80817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/80817.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<?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">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的注释</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</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 21pt">
				<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 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的功能点是指外部可观察的行为：如方法的返回值；方法做的日志；如果有输入参数，方法的输入</span>
				<span lang="EN-US">—</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 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入参数的有效性要表述吗？异常需要表述吗</span>
				<span lang="EN-US">? </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 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</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 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</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 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</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">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<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 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</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 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</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 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</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 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</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">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</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">
				<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">
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．测试函数名：</span>
				<span lang="EN-US">test+</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法名</span>
				<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">+</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数字编号，分类是</span>
				<span lang="EN-US">Right-Correct</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的全称，数字编号是该分类的测试用例编号。如测试</span>
				<span lang="EN-US">mutiple</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个测试函数可命名为</span>
				<span lang="EN-US">testMultipleRight1</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">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</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">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</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: 21pt">
				<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">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> 当被测试方法的输入、输出不那么明显时，也就是说可能没有输入参数或者没有返回值时，输入、输出中则视情况而写。<br /></o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p>输入：为测试准备的前提条件（可以是事件）。<br />输出： 测试期望得到的结果，不一定是返回值。</o:p>
				</span>
		</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">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/xixuui/aggbug/80817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-11-13 09:04 <a href="http://www.blogjava.net/xixuui/archive/2006/11/13/80817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TDD 程序代码（13）</title><link>http://www.blogjava.net/xixuui/archive/2006/11/06/79493.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 06 Nov 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/11/06/79493.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/79493.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/11/06/79493.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/79493.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/79493.html</trackback:ping><description><![CDATA[
		<p>TestMoney.java:<br />package com;</p>
		<p>import junit.framework.TestCase;</p>
		<p>public class TestMoney extends TestCase {<br /> public void testMultiplication() {<br />  Money five = Money.dollar(5);<br />  assertEquals(Money.dollar(10), five.times(2));<br />  assertEquals(Money.dollar(15), five.times(3));<br /> }</p>
		<p> public void testEqualsObject() {<br />  assertTrue(Money.dollar(5).equals(Money.dollar(5)));<br />  assertFalse(Money.dollar(5).equals(Money.dollar(6)));<br />  assertFalse(Money.franc(5).equals(Money.dollar(5)));<br /> }</p>
		<p> public void testCurrency() {<br />  assertEquals("USD", Money.dollar(1).currency());<br />  assertEquals("CHF", Money.franc(1).currency());<br /> }</p>
		<p> public void testSimpleAddition() {<br />  Money five = Money.dollar(5);<br />  Expression result = five.plus(five);<br />  Sum sum = (Sum) result;<br />  Bank bank = new Bank();<br />  Money reduced = bank.reduce(sum, "USD");<br />  assertEquals(Money.dollar(10), reduced);<br /> }</p>
		<p> public void testPlusReturnSum() {<br />  Money five = Money.dollar(5);<br />  Expression result = five.plus(five);<br />  Sum sum = (Sum) result;<br />  assertEquals(five, sum.augend);<br />  assertEquals(five, sum.addend);<br /> }</p>
		<p> public void testReduceSum() {<br />  Expression sum = new Sum(Money.dollar(3), Money.dollar(4));<br />  Bank bank = new Bank();<br />  Money result = bank.reduce(sum, "USD");<br />  assertEquals(Money.dollar(7), result);<br /> }<br /> public void testReduceMoney(){<br />  Bank bank = new Bank();<br />  Money result = bank.reduce(Money.dollar(1), "USD");<br />  assertEquals(Money.dollar(1),result);<br /> }<br />}<br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/79493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-11-06 23:50 <a href="http://www.blogjava.net/xixuui/archive/2006/11/06/79493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TDD学习心得</title><link>http://www.blogjava.net/xixuui/archive/2006/11/06/79313.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 06 Nov 2006 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/11/06/79313.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/79313.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/11/06/79313.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/79313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/79313.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">TDD</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的总结</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<pre style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; tab-stops: 27.6pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt">
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">读完<span lang="EN-US">TDD</span>（测试驱动开发），发现其中主要就是在反复说了这么两件事情（也就是两个简单的规则）：一、在写任何代码之前，写一个会失败的自动测试程序，即单元测试；二、消除重复设计，优化设计结构，即重构。整本书都围绕着这两个规则来进行说明，告诉读者到底要如何这样做？又如何分阶段应用这些规则？这两条简单的规则可以运用多深？<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">第一部分通过一个简单的实例来告诉读者如何使用<span lang="EN-US">TDD</span>，如何反复通过<span lang="EN-US">“</span>不可运行<span lang="EN-US">/</span>可运行<span lang="EN-US">/</span>重构<span lang="EN-US">/</span>不可运行<span lang="EN-US">/</span>可运行<span lang="EN-US">/</span>重构<span lang="EN-US">”</span>来进行开发；第二部分告诉读者如何使用单元测试，怎样组织单元测试；第三部分则是将<span lang="EN-US">TDD</span>分解成较小的步骤来进行详细说明，根据我对本书的理解，我认为需要完全将<span lang="EN-US">TDD</span>运用到日常的开发行为中，则要按照以下非常细小的步骤进行：<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">获得任务。即项目经理安排的任务。任务往往不止一项。将它们写入周工作计划表或者月工作计划表。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">选择任务。每天开始工作之前，将今天将要解决的问题写入工作计划列表。并选择自己最有把握完成的任务作为当前任务。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">分析并分解任务。将当前任务分解成一个个相对简单的问题，分解的问题最好是能在十多分钟之内能完成，并将它们写入工作列表。如：若要实现多币种相加，则可以分解为：实现相同币种之间的相加，不同币种之间的互换，最后才能实现不同币种之间的相加。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">写测试列表。将分解后的问题所对应的测试写入测试列表。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">5.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">选择测试。从测试列表中选择自己认为最有把握实现的一项。如：“同币种相加”对我来说是最有把握实现的一项，因此我最先来实现它，即先从它的测试程序开始编写。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">6.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写测试数据。写一个容易让人理解的必须实现的测试数据列表，尽量使用显然数据。如：用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">String</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">表示</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">IP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">地址</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">"255.255.255.255"</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">转换为</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">int</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，在我们写测试数据时应这样写：</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(255 &lt;&lt; 24) + (255 &lt;&lt; 16) + (255 &lt;&lt; 8) + 255</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，而不是写“</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">-1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">”。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">7.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写测试。选择一项最容易让测试通过的测试数据加入测试方法。断言优先，然后加入为了让断言通过编译的一切准备条件。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">8.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">运行测试，不可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">9.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写方法注释，把所有想到的该方法要实现的功能写上。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">10.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写功能代码，使之达到可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">11.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重构，消除重复设计。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">12.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">往测试方法中增加一个新的小测试。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">13.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">运行测试，不可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">14.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">修改功能代码，使之达到可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">15.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重构。消除重复设计。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">16.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重复</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">12-15</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">17.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">当无论如何也不能让该测试通过的时候，认真想一想是不是哪里出大问题了，如果实在想不出来的话，就将现有代码扔掉，重新开始。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">18.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">所有测试都运行通过之后，仔细检查所有代码，看是否还有值得重构的地方，并重构。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">19.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">提交</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(check in)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">20.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">再选择测试列表中的下一个测试。重复以上步骤。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">21.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">当一天的工作结束时，若有某个任务未完成，则留下一个不完整测试，以便于次日能迅速回忆起当时写该代码时的想法，并接着写下去。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<pre>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">以下是我对本书中某些观点的看法：<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">1.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">本书旨在培训我们具有按照极小的步骤进行开发，并寻找<span lang="EN-US">Bug</span>的能力，并不是说一定要按如此小的步骤进行。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">2.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">书中所反复强调的<span lang="EN-US">“</span>测试优先<span lang="EN-US">”</span>，<span lang="EN-US">“</span>断言优先<span lang="EN-US">”</span>是说在功能代码之前先写测试，先写断言，可是反过头来，以第一个测试来说：<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">public void testMutiplication()<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">{<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">Dollar five = new Dollar(5);<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">five.times(2);<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">assertEquals(10,five.amount);<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<font face="宋体">}<o:p></o:p></font>
				</span>
		</pre>
		<pre>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">就这个测试来说，其实作者在写测试的时候也想了很多的问题：把这个测试放哪？总不可能拿记事本来写吧！至少该给这个测试方法先建立一个测试类吧！同样在建立这个测试类的时候，是不是也在想着为该类命什么样的名？再进一步，我要写测试方法，在为测试方法命名的时候实际上也是在为我们所要写的方法命名，不是么？因此，我觉得，在我还没有达到<span lang="EN-US">Kent Beck</span>的水平之前，我还是会在写测试之前先想一想即将要编写的方法应归于哪个类，并先将该类创建好，再把下一步要编写的方法写好（当然此时肯定也是一个空方法），同时把自己所能想到的方法将要实现的功能（可以是比较粗略的）全部写入方法注释中，此时的注释可以是比较随意的，因为在把方法写完之后还要进行重构嘛！然后按照注释中的功能来编写一个一个的测试方法并完善功能代码。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">3.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">如果按照本书所说的，开发过程中几乎没有事先的设计，因为作者认为良好的设计会在重构中逐渐浮出水面的。但是我很清楚，我不是<span lang="EN-US">Kent Beck</span>，如果没有事先设计的话，以我现在的水平，重构时的工作量一定会非常大；因此如果在写代码之前花一定的时间设计一下代码结构，可以在一定程度上减小重构时的工作量。并且我认为良好的事先设计会为重构工作减少很大的工作量，当然事先设计也不应该占有太多的时间，否则，还不如先写完之后慢慢来重构。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-list: Ignore">
								<font face="宋体">4.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10.5pt">书中所说的关注当前工作这一点非常好，因为在现实工作中，常常会因为想到与当前工作相关的事情可能会比较多，而往往我们会丢下手上的工作，先去完成另外一项工作，可是等回到刚才丢下的工作前时又要花很长的一段时间来回忆当时的情形。因此，我们应该学习书中的方法，把新想法记录下来，等完成当前工作后再去考虑。也许有些时候会出现这种情况，如果另外一件事情未完成，当前工作无法进行的情况不得不打断当前工作，那就不得不将注意力全部转移到另外一件事情上去。但是，如果这种打断出现多次的时候，就应该认真思考自己的分析问题的粒度是不是太大了，然后重新去分解问题。等问题分析到可以不依赖未编写过的方法时再继续工作也不迟。这样只会提高工作效率和自信心。否则，不停地从当前工作中跳出，不仅为影响工作效率，而且会影响自信心，为什么还有这么多没有完成呢？因为在你不断地跳出当前工作后，你就会留下一个个未完成的工作。你的脑子里就会想着还有多少个未完成的工作在等着自己去完成。</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 12.0pt">
								<o:p>
								</o:p>
						</span>
				</font>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">5.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 12.0pt">留下一个不完整测试是在编程期间结束工作的最好办法。因为当测试运行时没出现绿色状态条时，会很容易找到明显的地方重新开始。这一点实现起来可能有点困难，但是却是一个非常有效的办法，当工作任务繁多的时候常常会忘记昨天做到哪了，今天该从哪做起。</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt">
								<o:p>
								</o:p>
						</span>
				</font>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">6.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">当编写功能代码时，为了让测试通过可以采取的措施有：显明实现，伪实现，三角法，从一到多。当自己让该测试通过有把握的时候，即使用显明实现；若在显明实现的过程中，无法达到可运行状态，则返回到之前的可运行状态，采用伪实现的方法使测试达到可运行状态；当需要为集合编写测试的时候，采用从一到多的方法。如：数组求和则可以先测试该数组中只有一个元素，再逐渐增加元素进行测试。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">7.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">相互独立的测试。即每个测试之间必须互不干扰。如果一个测试失败必须只对应一个问题；两个失败就对应两个问题。测试之间都不依赖与运行顺序，一个测试不要因为前面的测试不存在而失败。这一点实现起来其实也相当的困难，因为当一个底层函数的测试失败时，其上层函数（即调用了它的那些函数）的测试程序都可能会失败，因此很难做到一个失败的测试对应一个问题。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">8.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">当在编写代码时，当第一次准备使用某个包内的某项新功能时，为其编写测试，即学习测试。看它是否满足我们期望的要求。并且必须在其符合我们的期望要求时我们才可以在程序中使用它。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">9.</font>
								<span style="FONT: 7pt 'Times New Roman'">     </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">当每新建一个包时，即新建一个<span lang="EN-US">AllTests</span>类用于测试该包中所有测试类。在每写一个测试类时，先将<span lang="EN-US">public static Test suite()</span>写好，并把该测试类加入到包中的<span lang="EN-US">AllTests</span>中，随时确保包<span lang="EN-US">AllTests</span>中包含了包中的所有测试程序。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">10.</font>
								<span style="FONT: 7pt 'Times New Roman'">  </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">需要重点掌握的重构方法（即常用的重构）有：重命名，提取方法，添加参数，删除参数，方法内联，提炼方法对象，消除临时变量，提取匿名类，分离内部类等等。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm; tab-stops: list 18.0pt left 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; mso-list: l1 level1 lfo2">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">
						<span style="mso-list: Ignore">
								<font face="宋体">11.</font>
								<span style="FONT: 7pt 'Times New Roman'">  </span>
						</span>
				</span>
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">在我们工作的过程中，很多时候会遇到一些很困难的问题，在反反复复思考许多遍还是想不到解决的办法，往往这样的情况是我们的思维陷入了错误的陷阱里，在这个时候我们可以选择休息一会，喝一杯茶，走动一下。抛开那些刚才所做的事情。如果在休息了多次之后还没有想到解决方案，就扔掉这些代码，重新开始。<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/xixuui/aggbug/79313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-11-06 09:15 <a href="http://www.blogjava.net/xixuui/archive/2006/11/06/79313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>