??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲色欲色欲www在线播放,亚洲国产综合无码一区二区二三区,春暖花开亚洲性无区一区二区http://www.tkk7.com/xixuui/category/14681.htmlzh-cnWed, 18 Jul 2007 23:06:15 GMTWed, 18 Jul 2007 23:06:15 GMT60ICE学习http://www.tkk7.com/xixuui/archive/2007/07/18/131077.html阿辉阿辉Wed, 18 Jul 2007 07:01:00 GMThttp://www.tkk7.com/xixuui/archive/2007/07/18/131077.htmlhttp://www.tkk7.com/xixuui/comments/131077.htmlhttp://www.tkk7.com/xixuui/archive/2007/07/18/131077.html#Feedback0http://www.tkk7.com/xixuui/comments/commentRss/131077.htmlhttp://www.tkk7.com/xixuui/services/trackbacks/131077.htmlhttp://www.cnblogs.com/SGSoft/archive/2007/05/02/734775.html
http://www.zeroc.com/download.html#bin


阿辉 2007-07-18 15:01 发表评论
]]>
mysql 单命?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2007/07/03/127746.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/127746.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2007/07/03/127746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/127746.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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.tkk7.com/xixuui/aggbug/127746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2007-07-03 09:58 <a href="http://www.tkk7.com/xixuui/archive/2007/07/03/127746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML中类之间的关pd其Java代码例子<?gt;http://www.tkk7.com/xixuui/archive/2007/06/22/125793.html阿辉阿辉Fri, 22 Jun 2007 03:52:00 GMThttp://www.tkk7.com/xixuui/archive/2007/06/22/125793.htmlhttp://www.tkk7.com/xixuui/comments/125793.htmlhttp://www.tkk7.com/xixuui/archive/2007/06/22/125793.html#Feedback0http://www.tkk7.com/xixuui/comments/commentRss/125793.htmlhttp://www.tkk7.com/xixuui/services/trackbacks/125793.html关系是事物之间的联系。类之间?U重要的关系Q依赖、泛化、关联和实现。这些关p都可以映射C码里?br /> 依赖是一U用关p,描述了一个事物的规格说明的变化可能会影响C用它的另一个事物(反之不一定)。在UML中表CZؓ一条指向被依赖事物的虚Uѝ依赖有很多构造型Q不q一般不需要用,以免搞得q䆾复杂。其实另?U关pL化、关联和实现都可以算作是某种依赖关系Q只不过它们有比较强的语义和重要的作用,所以划分出来。一般对cdpd模的时候,先对泛化、关联和实现建模Q剩下的关系都可以看作依赖了?br />对应C码中Q依赖关pd能有很多UŞ式,例如
public class A
{
   public B getB(C c, D d)
   {
       E e = new E();
       B b = new B(c, d, e);
   }
}
q里cA׃赖于cBQ方法返回类Q、C和DQ参数类Q、EQ方法内变量的类Q,因ؓq几个类的变化都有可能媄响到cA

泛化是一般事物(UCؓ类或父c)和较Ҏ(gu)的事务(UCؓ子类Q之间的关系Q对cL说一般就是承了Q如Qpublic Class A extends B。一般用一个带I心头的实U表C泛化关pR?br />
兌是一U结构关p,说明一个事物的对象与另一个事物的对象相联pR给定一个连接两各类的关联,可以从一个类的对象导航到另一个类的对象?br />一般把兌Mؓq接相同或者不同的cM条实Uѝ关联可以有方向Q即D。一般不作说明的时候,D是双向的Q不需要在U上标出头。大部分情况下导航是单向的,可以加一个箭头表C?br />兌在代码中一般表CZؓ属性,例如
public class A
{
private B b;
}
可以认ؓ有一个A指向B(ti)的关联?br />如果B也关联到AQ那么它们就是双向的兌?br />有的时候B不是A的属性,但是也可以有兌关系Q例如:
public class A
{
public B[] getBs()
{...}
}
Ҏ(gu)getBs可能L数据库,扑ֈA和B之间的关联关pR?

两个cM间的单关联表CZ两个同等CcM间的l构关系。聚合也是一U关联关p,与简单关联不同的是,它描q的是一个整体和l成部分的关p,即“has-a”关p,意思是整体对象拥有部分对象Q例如学校和学生的关pR聚合的整体和部分之间在生命周期上没有什么必然的联系Q部分对象可以在整体对象创徏之前创徏Q也可以在整体对象销毁之后销毁。聚合用带一个空心菱形(整体的一端)的实U表C?br />public Class Person
{...}

public Class School
{
private ArrayList students;
private void addStudent(Person person)
{
students.add(person);
}
}
l合则是比聚合更强的兌形式。组合是指带有很强的拥有有关pM整体与部分的生命周期一致的聚合兌形式。例如Windows的窗口和H口上的菜单是l合关系。生命周期一致指的是部分必须在组合创建的同时或者之后创建,在组合销毁之前或者同旉毁,部分的生命周期不会超

出组合的生命周期。组合是用带实心菱Ş的实U来表示?br />public Class Menu
{...}
public Class Window
{
private Menu menu;
}
l合和聚合在代码实现上的主要差别在于生命周期的实CQ组成需要负责其部分的创建和销毁?br />public Class School
{
public School()
{...}//不需要创ZQ何Person对象Q其Students都是已有的Person对象
public void destroy()
{...}//只需要关掉School对象和断开它与自己所有的Person对象的关联即可,Person对象是不会销毁的
}

public Class Window
{
private Menu menu;
public Window()
{
menu = new Menu();
}//可以在这时候创建Menu对象Q也可以在之后创?br />public void destory()
{
menu.destory();
}//必须同时或者在q之前销毁关联的Menu对象
}

另外有一个差别是l合中的一个对象在同一时刻只能属于一个组成对象,而聚合的一个部分对象可以被多个整体对象聚合Q例如一个学生可以在多个学校pQ而一个菜单在同一时刻只能是某个窗口内的对象?

实现关系比较简单了Q指的是一个类元描qC另一个类元保证实现的契约。对cL_是一个类实现了一个接?br />public interface A
{
public void methodA();
}
public class B implements A
{
public void methodA()
{...}
...
}
一般在面对对象的系l中Q尽可能的用接口来减少cM间的耦合。因为接口没有实玎ͼ所以依赖于接口׃会依赖于某种具体实现Q例如jdbc里的Connection和ResultSet都是接口Q不同数据库厂商的实现可以不一栗?br />
ȝ一?br />1)依赖关系Q关pd象出现在局部变量或者方法的参数里,或者关pȝ的静态方法被调用
2)兌关系Q关pd象出现在实例变量?br />3)聚合关系:关系对象出现在实例变量中
4)合成关系Q关pd象出现在实例变量?br />5)Generalization:   extends
6)实现Q?   implements

 

聚合是这LQ学生与所选课E之间的关系是l合Q他们之间在感念上没有必然关p,删掉一门课E,不会影响到学?
l合是这LQ订单和订单条目的关pd是聚合,他们的关pd紧密Q删掉一个订单,订单条目也就没有意义?br />l合是聚合的一UŞ?/p>


阿辉 2007-06-22 11:52 发表评论
]]>
工作中常用的方法集?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2007/04/26/113877.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/113877.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2007/04/26/113877.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/113877.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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<InetAddress> 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.tkk7.com/xixuui/aggbug/113877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2007-04-26 18:12 <a href="http://www.tkk7.com/xixuui/archive/2007/04/26/113877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新工作流E?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2006/12/09/86549.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/86549.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2006/12/09/86549.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/86549.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xixuui/services/trackbacks/86549.html</trackback:ping><description><![CDATA[通过学习TDD以及三个月来杨博的多ơ言传n教和他写的一些文档,得到了下面这一套工作流E: 1. 获得d。即目l理安排的Q务。Q务往往不止一V将它们写入周工作计划表或者月工作计划表? 2. 选择d。每天开始工作之前,今天将要完成的d写入工作计划列表。ƈ选择自己最有把握完成的d作ؓ当前d? 3. 分析q分解Q务。将当前d分解成一个个相对单的问题Q分解的问题最好是能在短时间之内能完成Qƈ它们写入工作列表? 4. 写测试列表。选择一个简单的问题(此时可以Ҏ(gu)取名?Qƈ所要完成的所有功能写入工作列表。这是Ҏ(gu)注释中的功能注释。ƈ且将每一功能所对应的单元测试记录下来,写入试列表? 5. 选择试。从试列表中选择那个h指导意义而且自己认ؓ最有把握实现的一V如Q一个数值对象类Q也许对我来_实现equals()Ҏ(gu)是最有把握的Q那我就可以选择它作为我的当前测试? 6. ~写试数据。写一个容易让人理解的必须实现的测试数据列表,量使用昄数据。如Q用 String 表示 IP 地址 "255.255.255.255" 转换?int Q在我们写测试数据时应这样写Q?(255 << 24) + (255 << 16) + (255 << 8) + 255 Q而不应该写成?-1 ”? 7. ~写试。选择一Ҏ(gu)Ҏ(gu)让测试通过的测试数据加入测试方法。如Q实现equals()Ҏ(gu)中“比较两个不是同cȝ对象q回false”的试是最Ҏ(gu)实现的,我就可以它加入是最Ҏ(gu)实现的,那就先实现它吧!断言优先Q然后加入ؓ了让断言通过~译的一切准备条件? 8. q行试Q不可运行状态? 9. ~写功能代码Q之达到可q行状态? 10. 重构Q消除重复设计? 11. 往试Ҏ(gu)中增加一个新的小试? 12. q行试Q不可运行状态? 13. 修改功能代码Q之达到可q行状态? 14. 重构。消除重复设计? 15. 重复 12-15 ? 16. 当无论如何也不能让该试通过的时候,认真想一x不是哪里出大问题了,如果实在想不出来的话Q就现有代码扔掉,重新开始? 17. 所有测试都q行通过之后Q仔l检查所有代码,看是否还有值得重构的地方,q构? 18. 提交 (check in) ? 19. 再选择试列表中的下一个测试。重复以上步骤? 20. 当要d工作的时间比较久Ӟ若有某个d未完成,则留下一个不完整试Q以便于回到工作岗位时能q速回忆v当时写该代码时的xQƈ接着写下厅R? <img src ="http://www.tkk7.com/xixuui/aggbug/86549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2006-12-09 16:40 <a href="http://www.tkk7.com/xixuui/archive/2006/12/09/86549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作ȝhttp://www.tkk7.com/xixuui/archive/2006/12/07/85992.html阿辉阿辉Thu, 07 Dec 2006 00:57:00 GMThttp://www.tkk7.com/xixuui/archive/2006/12/07/85992.htmlhttp://www.tkk7.com/xixuui/comments/85992.htmlhttp://www.tkk7.com/xixuui/archive/2006/12/07/85992.html#Feedback4http://www.tkk7.com/xixuui/comments/commentRss/85992.htmlhttp://www.tkk7.com/xixuui/services/trackbacks/85992.html      现在Q谈谈如何进行团队合作。首先,应该己定位,自己在团队中处于什么位|,应该做哪些事情?其次Q当自己有什么新的想?不管是否正确)Ӟ一定要与团队成员进行交。如果自qx是正的Q那团队很可能采用自己的新xQ当然有的时候想法也不一定正,但是却肯定会引v大家的讨论,也许可能从新的x中得到其它的什么提C,而生另外的好的x也不一定?br />       接着Q讲讲自己在q段旉的学习成果吧Q虽然不多,但却非常有用。首先,学习了用TDD(试驱动开?模式q行软g开发;其次Q学习如何写好注释;另外Q还学习了怎样嗅出代码中的臭味Qƈq行重构?br />      

阿辉 2006-12-07 08:57 发表评论
]]>
如何试异常Q?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2006/12/06/85796.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/85796.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2006/12/06/85796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/85796.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xixuui/services/trackbacks/85796.html</trackback:ping><description><![CDATA[ <p>      在写单元试Ӟ如何写异常的试是很多h的难题。很多书使用如下Ҏ(gu)q行试Q?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 />      通过q种试Q可以测试方法中是否会达到期望的要求Q在Ҏ(gu)出现预期中的异常时是否会抛出该异常,若没有像期望的一h出异常,则单元测试会q行?fail();"使得单元试不会通过。正常情况下是没有问题的。但是有的时候方法内部会有多个子Ҏ(gu)抛出同一个异常(或者说抛出的多个异帔Rl承于同一个异常类Q,因此q个时候我们必d位到是哪个子Ҏ(gu)抛出的异常,而通过以上Ҏ(gu)是不能达到这个目标的。ؓ了达到这个目标,可以通过判断异常中的信息来判断是哪个子方法出错。通常Q程序员会在抛出异常时会生该异常的原因写入异怿息中Q如Qnew Exception(message)。因此,我们只要在单元测试中能捕捉到该异怿息,往往p定位到该异常出现的位|?br />只需要将以上试的catch块中的语句改为如下语句即可:<br />assertTrue(e.toString().contains(exception message));<br /><br /><br /></p> <img src ="http://www.tkk7.com/xixuui/aggbug/85796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2006-12-06 12:03 <a href="http://www.tkk7.com/xixuui/archive/2006/12/06/85796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据的合法性检?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2006/12/01/84769.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/84769.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2006/12/01/84769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/84769.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xixuui/services/trackbacks/84769.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">一般的数据c都应该有自q数据合法性检查,如一个Personc,它的q龄属性是int型的Q但是如果给它赋?0000则ؓ不合法,一个h不可能活那么长时间。因此需要在创徏该类的对象时必需对其q行合法性检查,若构造方法传入的是非法数据,则不让其创徏该对象,q抛出异常。也许大多数为只需要对构造方法传入的参数q行合法性检查即可。如下所C:<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 >100 && i <= 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 />实际上这U合法性ƈ不可靠,q样只是保证了在构造方法中传入的数据是合法的,但是不能保证E序员在使用该对象时能传入合法的数据。如下程序代码:<br />ValidClass validClass = new ValidClass(2, "123");<br />validClass.set(200);<br />q样使用的话Q程序运行ƈ不会报错Q但是实际上我们已经传入了非法数据到该对象中MQ因此ؓ了避免出现程序员在用的时候也犯这U错误,Ҏ(gu)据的合法性检查的正确方式应如下所C:<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Ҏ(gu)中进行合法性检查,然后在构造方法中也调用setҎ(gu)讄字段|而不直接使用cM的字Dc这样做的好处很明显Q不仅保证了构造方法中传入的数据必d法,而且可以保证E序在用的q程中不能用非法数据,如果E序员用了非法数据Q程序运行必然出错,q且能够很快的找到错误的Ҏ(gu)所在?br /><br />         另外Q有些程序员认ؓQ有些数据类的对象全部来自于另一个数据对象,也就是说该类的构造方法中的参数即另一个数据类对象Q因此在该类中所有与被传入对象类中有相同的合法性检查的数据字段不需要再q行合法性检查了。其实这U想法是错误的,问题与上面所说的一P你能保证传入的数据是合法的,但不能保证用者在调用你的setҎ(gu)时能100%传入合法数据。因此,E序员是不应该偷q个懒的。也许有Z_他们的合法性检查完全一P如果在该cM再写的话׃出现大量的重复代码了。能惛_q里是对的,但是如果你有一定的l验Q你q道去建立一个专门保存合法性检查方法的c,q样你就可以在需要进行合法性检查的时候就使用该类里面的方法,如果该类中没有你所需要的Ҏ(gu)Q你可以在里面加入你所需要的合法性检查方法,再去使用它。这样做会得代码非常的清晰?br /><br />         我认为,应该在自q中的所有用“this.value = data;”字L代码都应该用setValue()Q因Z许这个字D늎在不需要进行合法性检查,但是不能保证来也没有合法性要求。而一旦以后需要对该字D进行合法检查的时候,需要在setҎ(gu)中增加合法性检查代码,而且需要将该类中所有对该字D늚赋D句均改用setҎ(gu)。一旦有某处漏掉Q则很可能带来致命的错误。也许在某个q算中带来了非法数据Q但是你却怎么也不会往q方面去惻I因ؓ你一直以己全部都作了合法性检查的?/p> <img src ="http://www.tkk7.com/xixuui/aggbug/84769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2006-12-01 10:59 <a href="http://www.tkk7.com/xixuui/archive/2006/12/01/84769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重构——改善既有代码的设计 源代?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2006/11/15/81267.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/81267.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2006/11/15/81267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/81267.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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<Rental> _rentals = new Vector<Rental>();// U借记?/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;// L贚w?br />  int frequentRenterPoints = 0;// 常客U点<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() > 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() > 3)<br />      thisAmount += (each.get_dayRented() - 3) * 1.5;<br />     break;<br />   }</p> <p>   // add frequent renter points(累加 常客U点)<br />   frequentRenterPoints++;</p> <p>   // add bonus for a two day new release rental<br />   if((each.get_movie().get_priceCode()) == Movie.NEW_RELEASE<br />    && each.get_dayRented() > 1)<br />    frequentRenterPoints++;<br />   // show figures for this rental(昄此笔U借数?<br />   result += "\t" + each.get_movie().get_title() + "\t"<br />      + String.valueOf(thisAmount) + "\n";</p> <p>   totalAmount += thisAmount;<br />  }</p> <p>  // add footer lines(l尾打印)<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;// h</p> <p> <br /> public Movie(String _title, int _priceCode)<br /> {<br />  this._title = _title;<br />  this._priceCode = _priceCode;<br /> }</p> <p> <br /> /**<br />  * @return q回 _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 q回 _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;// q<br /> private int _dayRented;// U期</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.tkk7.com/xixuui/aggbug/81267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2006-11-15 15:14 <a href="http://www.tkk7.com/xixuui/archive/2006/11/15/81267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注释要点http://www.tkk7.com/xixuui/archive/2006/11/13/80817.html阿辉阿辉Mon, 13 Nov 2006 01:04:00 GMThttp://www.tkk7.com/xixuui/archive/2006/11/13/80817.htmlhttp://www.tkk7.com/xixuui/comments/80817.htmlhttp://www.tkk7.com/xixuui/archive/2006/11/13/80817.html#Feedback0http://www.tkk7.com/xixuui/comments/commentRss/80817.htmlhttp://www.tkk7.com/xixuui/services/trackbacks/80817.html  

Ҏ(gu)的注?/span> :

1.         清楚地表q出Ҏ(gu)的功能,卌Ҏ(gu)做什么。不用表q怎么做(怎么做是法层面的东西,如果法有一定的复杂度,在其它文档表qͼ如流E图、算法、序列图{)。注意点是:Ҏ(gu)可能实现多个相关功能Q要表述每个功能的激zLӞ卌入参数的特征Q,及相应的功能?/span>

若该Ҏ(gu)与其它若q个Ҏ(gu)相关Q要它们的兌性表q出来,q对于理解整个类的行为很关键。特别是Q当对象有状态时Q这时该Ҏ(gu)的调用可能要依赖于其它方法的先行调用Q即对象的当前状态)Q对象的状态改变及Ҏ(gu)的依赖关pL必须描述清楚的?/span>

 

Ҏ(gu)的功能点是指外部可观察的行ؓQ如Ҏ(gu)的返回|Ҏ(gu)做的日志Q如果有输入参数Q方法的输入 ?/span> 〉返回的对应关系Q生的异常及其原因Q方法的前置依赖Q方法造成的对象状态改变(后置状态){?/span>

 

输入参数的有效性要表述吗?异常需要表q吗 ? 视情况而定Q如果情况复杂,特别是异常的产生的原因复杂,需要较多的话才能表q清楚,需要表q?/span>

 

2.         输入参数Q包括参数的含义Q及有效性格式。如果某个参数的有效性方法内部不作检查,要清晰地说明Q这意味着调用者自p保证参数的有效性,不然会造成不确定的错误。通常Q这U情况出现在从外部传入大量的数据Qƈ且对数据有效性检查很烦琐Q这时可以在pȝ入口q行有效性检查,pȝ内部的方法就不再q行查了?/span>

3.         q回参数Q包括参数的含义Q可能会有多个不同的q回|通常是一个有效返回和一个异常返回,对于异常q回Q要表述其对应的输入参数?/span>

4.         抛出异常Q表qC生各个异生的原因?/span>

 

表述的清晰性检查:

1Q?span style="FONT: 7pt 'Times New Roman'">  用D例来辅助说明一些文字表q较困难的思想

2Q?span style="FONT: 7pt 'Times New Roman'">  要注意分D,跟写文章一P当注释很长时Q要有分Dc?/span>

3Q?span style="FONT: 7pt 'Times New Roman'">  与单元测试对应性,Ҏ(gu)的每个功能点都应该有相应的单元测试对?/span>

4Q?span style="FONT: 7pt 'Times New Roman'">  Ҏ(gu)之间的依赖关pM是功能点Q应该有相应的单元测试?/span>

 

 

单元试的注释:

1 Q测试函数名Q?/span> test+ Ҏ(gu)?/span> + 分类 + 数字~号Q分cL Right-Correct 的全Uͼ数字~号是该分类的测试用例编受如试 mutiple 的一个测试函数可命名?/span> testMultipleRight1 ?/span>

 

2 Q?/span> 描述Q测试哪个功能点Q测试哪个参数有效性格式?试哪个Ҏ(gu)依赖性?试哪个异常Q(q些与方法的注释对应Q?/span>

       输入参数Q?/span>

输出l果Q?/span>

      

 当被试Ҏ(gu)的输入、输Z那么明显Ӟ也就是说可能没有输入参数或者没有返回值时Q输入、输Z则视情况而写?br />

输入Qؓ试准备的前提条Ӟ可以是事Ӟ?br />输出Q 测试期望得到的l果Q不一定是q回倹{?/o:p>

 

 

 



阿辉 2006-11-13 09:04 发表评论
]]>
TDD E序代码Q?3Q?/title><link>http://www.tkk7.com/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.tkk7.com/xixuui/archive/2006/11/06/79493.html</guid><wfw:comment>http://www.tkk7.com/xixuui/comments/79493.html</wfw:comment><comments>http://www.tkk7.com/xixuui/archive/2006/11/06/79493.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.tkk7.com/xixuui/comments/commentRss/79493.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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.tkk7.com/xixuui/aggbug/79493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixuui/" target="_blank">阿辉</a> 2006-11-06 23:50 <a href="http://www.tkk7.com/xixuui/archive/2006/11/06/79493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TDD学习心得http://www.tkk7.com/xixuui/archive/2006/11/06/79313.html阿辉阿辉Mon, 06 Nov 2006 01:15:00 GMThttp://www.tkk7.com/xixuui/archive/2006/11/06/79313.htmlhttp://www.tkk7.com/xixuui/comments/79313.htmlhttp://www.tkk7.com/xixuui/archive/2006/11/06/79313.html#Feedback1http://www.tkk7.com/xixuui/comments/commentRss/79313.htmlhttp://www.tkk7.com/xixuui/services/trackbacks/79313.html ?/span> TDD 的ȝ

				
						dTDDQ测试驱动开发)Q发现其中主要就是在反复说了q么两g事情Q也是两个单的规则Q:一、在写Q何代码之前,写一个会p|的自动测试程序,卛_元测试;二、消除重复设计,优化设计l构Q即重构。整本书都围l着q两个规则来q行说明Q告诉读者到底要如何q样做?又如何分阶段应用q些规则Q这两条单的规则可以q用多深Q?span lang="EN-US">
				
		
				
						W一部分通过一个简单的实例来告诉读者如何?span lang="EN-US">TDDQ如何反复通过?/span>不可q行/可运?span lang="EN-US">/重构/不可q行/可运?span lang="EN-US">/重构?/span>来进行开发;W二部分告诉读者如何用单元测试,怎样l织单元试Q第三部分则是将TDD分解成较?yu)的步骤来进行详l说明,Ҏ(gu)我对本书的理解,我认为需要完全将TDDq用到日常的开发行ZQ则要按照以下非常细的步骤q行Q?span lang="EN-US">
				
		

1.       获得d。即目l理安排的Q务。Q务往往不止一V将它们写入周工作计划表或者月工作计划表?/span>

2.       选择d。每天开始工作之前,今天将要解决的问题写入工作计划列表。ƈ选择自己最有把握完成的d作ؓ当前d?/span>

3.       分析q分解Q务。将当前d分解成一个个相对单的问题Q分解的问题最好是能在十多分钟之内能完成,q将它们写入工作列表。如Q若要实现多币种相加Q则可以分解为:实现相同币种之间的相加,不同币种之间的互换,最后才能实C同币U之间的相加?/span>

4.       写测试列表。将分解后的问题所对应的测试写入测试列表?/span>

5.       选择试。从试列表中选择自己认ؓ最有把握实现的一V如Q“同币种相加”对我来说是最有把握实现的一,因此我最先来实现它,卛_从它的测试程序开始编写?/span>

6.       ~写试数据。写一个容易让人理解的必须实现的测试数据列表,量使用昄数据。如Q用 String 表示 IP 地址 "255.255.255.255" 转换?/span> int Q在我们写测试数据时应这样写Q?/span> (255 << 24) + (255 << 16) + (255 << 8) + 255 Q而不是写?/span> -1 ”?/span>

7.       ~写试。选择一Ҏ(gu)Ҏ(gu)让测试通过的测试数据加入测试方法。断a优先Q然后加入ؓ了让断言通过~译的一切准备条件?/span>

8.       q行试Q不可运行状态?/span>

9.       ~写Ҏ(gu)注释Q把所有想到的该方法要实现的功能写上?/span>

10.   ~写功能代码Q之达到可q行状态?/span>

11.   重构Q消除重复设计?/span>

12.   往试Ҏ(gu)中增加一个新的小试?/span>

13.   q行试Q不可运行状态?/span>

14.   修改功能代码Q之达到可q行状态?/span>

15.   重构。消除重复设计?/span>

16.   重复 12-15 ?/span>

17.   当无论如何也不能让该试通过的时候,认真想一x不是哪里出大问题了,如果实在想不出来的话Q就现有代码扔掉,重新开始?/span>

18.   所有测试都q行通过之后Q仔l检查所有代码,看是否还有值得重构的地方,q构?/span>

19.   提交 (check in) ?/span>

20.   再选择试列表中的下一个测试。重复以上步骤?/span>

21.   当一天的工作l束Ӟ若有某个d未完成,则留下一个不完整试Q以便于ơ日能迅速回忆v当时写该代码时的xQƈ接着写下厅R?/span>

 

 

 

				
						以下是我Ҏ(gu)书中某些观点的看法:
				
		
				
						
								1.
								     
						
				
				
						本书旨在培训我们h按照极小的步骤进行开发,q寻?span lang="EN-US">Bug的能力,q不是说一定要按如此小的步骤进行?span lang="EN-US">
				
		
				
						
								2.
								     
						
				
				
						书中所反复?span lang="EN-US">?/span>试优先?/span>Q?span lang="EN-US">?/span>断言优先?/span>是说在功能代码之前先写测试,先写断言Q可是反q头来,以第一个测试来_
				
		
				
						public void testMutiplication()
				
		
				
						{
				
		
				
						Dollar five = new Dollar(5);
				
		
				
						five.times(2);
				
		
				
						assertEquals(10,five.amount);
				
		
				
						}
				
		
				
						p个测试来_其实作者在写测试的时候也想了很多的问题:把这个测试放哪?M可能拿记事本来写吧!臛_该给q个试Ҏ(gu)先徏立一个测试类吧!同样在徏立这个测试类的时候,是不是也在想着cd什么样的名Q再q一步,我要写测试方法,在ؓ试Ҏ(gu)命名的时候实际上也是在ؓ我们所要写的方法命名,不是么?因此Q我觉得Q在我还没有辑ֈKent Beck的水q之前,我还是会在写试之前先想一惛_要~写的方法应归于哪个c,q先该cd建好Q再把下一步要~写的方法写好(当然此时肯定也是一个空Ҏ(gu)Q,同时把自己所能想到的Ҏ(gu)要实现的功能(可以是比较粗略的Q全部写入方法注释中Q此时的注释可以是比较随意的Q因为在把方法写完之后还要进行重构嘛Q然后按照注释中的功能来~写一个一个的试Ҏ(gu)q完善功能代码?span lang="EN-US">
				
		
				
						
								3.
								     
						
				
				
						如果按照本书所说的Q开发过E中几乎没有事先的设计,因ؓ作者认好的设计会在重构中逐渐出水面的。但是我很清楚,我不?span lang="EN-US">Kent BeckQ如果没有事先设计的话,以我现在的水qI重构时的工作量一定会非常大;因此如果在写代码之前׃定的旉设计一下代码结构,可以在一定程度上减小重构时的工作量。ƈ且我认ؓ良好的事先设计会为重构工作减很大的工作量,当然事先设计也不应该占有太多的时_否则Q还不如先写完之后慢慢来重构?span lang="EN-US">
				
		
				
						
								4.
								     
						
				
				
						书中所说的x当前工作q一炚w常好Q因为在现实工作中,常常会因为想C当前工作相关的事情可能会比较多,而往往我们会丢下手上的工作Q先d成另外一工作,可是{回到刚才丢下的工作前时又要花很长的一D|间来回忆当时的情形。因此,我们应该学习书中的方法,把新x记录下来Q等完成当前工作后再去考虑。也许有些时候会出现q种情况Q如果另外一件事情未完成Q当前工作无法进行的情况不得不打断当前工作,那就不得不将注意力全部{Ud另外一件事情上厅R但是,如果q种打断出现多次的时候,应该认真思考自q分析问题的粒度是不是太大了,然后重新d解问题。等问题分析到可以不依赖未编写过的方法时再l工作也不迟。这样只会提高工作效率和自信心。否则,不停C当前工作中蟩出,不仅为媄响工作效率,而且会媄响自信心Qؓ什么还有这么多没有完成呢?因ؓ在你不断地蟩出当前工作后Q你׃留下一个个未完成的工作。你的脑子里׃想着q有多少个未完成的工作在{着自己d成?/span>
						
								
								
						
				
		
				
						
								5.
								     
						
				
				
						留下一个不完整试是在~程期间l束工作的最好办法。因为当试q行时没出现l色状态条Ӟ会很Ҏ(gu)扑ֈ明显的地斚w新开始。这一点实现v来可能有点困难,但是却是一个非常有效的办法Q当工作dJ多的时候常怼忘记昨天做到哪了Q今天该从哪做v?/span>
						
								
								
						
				
		
				
						
								6.
								     
						
				
				
						当编写功能代码时Qؓ了让试通过可以采取的措施有Q显明实玎ͼ伪实玎ͼ三角法,从一到多。当自己让该试通过有把握的时候,即用显明实玎ͼ若在显明实现的过E中Q无法达到可q行状态,则返回到之前的可q行状态,采用伪实现的Ҏ(gu)使测试达到可q行状态;当需要ؓ集合~写试的时候,采用从一到多的方法。如Q数l求和则可以先测试该数组中只有一个元素,再逐渐增加元素q行试?span lang="EN-US">
				
		
				
						
								7.
								     
						
				
				
						怺独立的测试。即每个试之间必须互不q扰。如果一个测试失败必d对应一个问题;两个p|对应两个问题。测试之间都不依赖与q行序Q一个测试不要因为前面的试不存在而失败。这一点实现v来其实也相当的困难,因ؓ当一个底层函数的试p|Ӟ其上层函敎ͼ卌用了它的那些函数Q的试E序都可能会p|Q因此很隑ցC个失败的试对应一个问题?span lang="EN-US">
				
		
				
						
								8.
								     
						
				
				
						当在~写代码Ӟ当第一ơ准备用某个包内的某项新功能时Qؓ其编写测试,卛_习测试。看它是否满x们期望的要求。ƈ且必d其符合我们的期望要求时我们才可以在程序中使用它?span lang="EN-US">
				
		
				
						
								9.
								     
						
				
				
						当每新徏一个包ӞxZ?span lang="EN-US">AllTestscȝ于测试该包中所有测试类。在每写一个测试类Ӟ先将public static Test suite()写好Qƈ把该试cd入到包中?span lang="EN-US">AllTests中,随时保?span lang="EN-US">AllTests中包含了包中的所有测试程序?span lang="EN-US">
				
		
				
						
								10.
								  
						
				
				
						需要重Ҏ(gu)握的重构Ҏ(gu)Q即常用的重构)有:重命名,提取Ҏ(gu)Q添加参敎ͼ删除参数Q方法内联,提炼Ҏ(gu)对象Q消除时变量,提取匿名c,分离内部cȝ{?span lang="EN-US">
				
		
				
						
								11.
								  
						
				
				
						在我们工作的q程中,很多时候会遇到一些很困难的问题,在反反复复思考许多遍q是想不到解决的办法Q往往q样的情冉|我们的思维陷入了错误的陷阱里,在这个时候我们可以选择休息一会,喝一杯茶Q走动一下。抛开那些刚才所做的事情。如果在休息了多ơ之后还没有惛_解决Ҏ(gu)Q就扔掉q些代码Q重新开始?span lang="EN-US">
				
		

 

 



阿辉 2006-11-06 09:15 发表评论
]]>
վ֩ģ壺 ޶Ʒav| ޵һҳۺͼƬ| ޳Ļ| aëƬ߹ۿ| þþƷ5555| Ůվ| Ƶ| ȫѵһëƬ| Ļվ| ѿֻˬ͵Ƶ| ɫˬŮС˵ѿ| ۺһۺͼ| jizzjizzƵѿ| վѹۿ| ˾þóۺӰԺ| Ʒѹۿ| vaþþþ| aëƬȫѲ| ޹Ʒþþþþ| Ļȫ| ޳߹ۿ| ëƬȫѹۿ| ԻȫƵۿ| ձһ߲| ƷëٸAVѾþ| avպav| պһaƬѹۿ| ٶ˽ȫֱ| ˳˳߹ۿ| þþþþùƷ| ˾Ʒձ| ѹھƷþþþӰԺ| ߹ۿ| պĻ| jlzzjlzz߲Ƶ| Ƶֻ߹ۿַ| 1134Ʒâ| AV֮˵| 131ŮëƬ| ҳڻӭ | AV뾫ƷëƬ|