??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕精品影院,爱搞国产精品,成人精品国产http://www.aygfsteel.com/mlh123caoer/category/25369.html无ؓ则可为,无ؓ则至深! zh-cnTue, 29 Sep 2009 23:38:57 GMTTue, 29 Sep 2009 23:38:57 GMT60Java开发者需坚守的十大基本准?/title><link>http://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296938.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 29 Sep 2009 11:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296938.html</guid><wfw:comment>http://www.aygfsteel.com/mlh123caoer/comments/296938.html</wfw:comment><comments>http://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlh123caoer/comments/commentRss/296938.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlh123caoer/services/trackbacks/296938.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: 宋体; font-size: 13px; "> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">有许多标准和实践准则可适用于Java开发者,但此处要说的Q是每个Java开发者需坚守的基本原则?br style="font-size: 12px; " /> <br style="font-size: 12px; " />    </font><strong>一、ؓ代码加注释?/strong><font size="3">虽然每个人都知道q点Q但有时却不自觉忘了履行Q今天你“忘了”加注释了吗?虽然注释对程序的功能没什?#8220;贡献”Q但q一D|_比如说两星期之后或者更长,回过头来看看自己的代码,说不定已l记不住它是q什么的了。如果这些代码是你个人的Q那q算是走q了Q不q的是,当然了,大多数时候都是别人的不幸Q很多时候大安是在为公司写代码Q写代码的h也许早已l离开了公司,但别忘了一句古话,有来有往嘛,Z人,也ؓ我们自己Q请Z的代码加上注释?br style="font-size: 12px; " /> <br style="font-size: 12px; " /> </font><strong>   二、不要让事情复杂化?/strong><font size="3">E序员有时候L对简单问题想出复杂的解决Ҏ(gu)Q比如说Q在只有五个用户的程序中引入EJB、对E序实现了ƈ不需要的框架QframeworkQ,之类的还有属性文件、面向对象解x案、多U程{等。ؓ什么要q样做呢Q也许我们ƈ不知道是否这样会更好Q但q样做也许可以学C些新东西Q或者让自己更感兴趣一些。如果是不知道ؓ什么这样做Q徏议多hl验丰富的程序员Q如果是Z个h的目的,ȝ让自己更专业一炏V?br style="font-size: 12px; " /> <br style="font-size: 12px; " />    </font><strong>三、始l牢记—?#8220;即是好QLess is moreQƈ不L对的”?/strong><font size="3">代码效率虽然很重要,但在许多解决Ҏ(gu)中,~写更少的代码ƈ不能改善q些代码的效率,L下面q个单的例子Q?/font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">if</span><span style="color: #000000; ">(newStatusCode.equals(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SD</span><span style="color: #000000; ">"</span><span style="color: #000000; ">) </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> (sellOffDate </span><span style="color: #000000; ">==</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> todayDate.compareTo(sellOffDate)</span><span style="color: #000000; "><</span><span style="color: #000000; ">0</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> (lastUsedDate </span><span style="color: #000000; ">!=</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">&&</span><span style="color: #000000; "> todayDate.compareTo(lastUsedDate)</span><span style="color: #000000; ">></span><span style="color: #000000; ">0</span><span style="color: #000000; ">)) </span><span style="color: #000000; ">||</span><span style="color: #000000; "> (newStatusCode.equals(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">OBS</span><span style="color: #000000; ">"</span><span style="color: #000000; ">) </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> (OBSDate </span><span style="color: #000000; ">==</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> todayDate.compareTo(OBSDate)</span><span style="color: #000000; "><</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))){ newStatusCode </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">NYP</span><span style="color: #000000; ">"</span><span style="color: #000000; ">; }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">能看明白if条g语句是干什么的吗?能想出来是谁写的q段代码吗?如果把它分成两段独立的if语句Q是不是更容易理解呢Q下面是修改后的代码Q?/font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">if</span><span style="color: #000000; ">(newStatusCode.equals(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SD</span><span style="color: #000000; ">"</span><span style="color: #000000; ">) </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> (sellOffDate </span><span style="color: #000000; ">==</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> todayDate.compareTo(sellOffDate)</span><span style="color: #000000; "><</span><span style="color: #000000; ">0</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> (lastUsedDate </span><span style="color: #000000; ">!=</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">&&</span><span style="color: #000000; "> todayDate.compareTo(lastUsedDate)</span><span style="color: #000000; ">></span><span style="color: #000000; ">0</span><span style="color: #000000; ">))){ newStatusCode </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">NYP</span><span style="color: #000000; ">"</span><span style="color: #000000; ">; }</span><span style="color: #0000ff; ">else</span> <span style="color: #0000ff; ">if</span><span style="color: #000000; ">(newStatusCode.equals(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">OBS</span><span style="color: #000000; ">"</span><span style="color: #000000; ">) </span><span style="color: #000000; ">&&</span><span style="color: #000000; "> (OBSDate </span><span style="color: #000000; ">==</span> <span style="color: #0000ff; ">null</span> <span style="color: #000000; ">||</span><span style="color: #000000; "> todayDate.compareTo(OBSDate)</span><span style="color: #000000; "><</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)) { newStatusCode </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">NYP</span><span style="color: #000000; ">"</span><span style="color: #000000; ">; }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">是不是读hҎ(gu)多了呢,在此只是多加了一个if和两个花括号Q但代码的可L与可理解性就一下子提高了一大截?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong>   四、请不要编码?/strong><font size="3">开发者经常有?#8220;忘记”或忽略掉q点Q因为有些时候开发日E逼得实在太紧。其实,多写一行定义静态变量的代码能花多少旉呢?</font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">class</span><span style="color: #000000; "> A { </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span><span style="color: #000000; "> final String S_CONSTANT_ABC </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">ABC</span><span style="color: #000000; ">"</span><span style="color: #000000; ">; </span><span style="color: #0000ff; ">public</span><span style="color: #000000; "> boolean methodA(String sParam1){ </span><span style="color: #0000ff; ">if</span><span style="color: #000000; "> (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){ </span><span style="color: #0000ff; ">return</span> <span style="color: #0000ff; ">true</span><span style="color: #000000; ">; } </span><span style="color: #0000ff; ">return</span> <span style="color: #0000ff; ">false</span><span style="color: #000000; ">; } }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">现在Q每ơ需要将“ABC”与其他变量进行比较时Q不必记住实际代码,直接引用A.S_CONSTANT_ABCp了,而且在今后需要进行修Ҏ(gu)Q也可在一处修改,不会遍整个源代码逐个修改了?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3"> </font><strong>五、不?#8220;创?#8221;自己的框ӞframeworkQ?/strong><font size="3">切来说Q有C千计的各U框架存在,而且大多数是开源的Q这些框枉是优U的解x案,可用于日常程序开发中Q我们只需使用q些框架的最新版本就行了Q至表面上要跟上Ş势吧。被大家qؓ接受的最为明昄一个例子就是Struts了,q个开源web框架非常适合用在Zweb的应用程序中。是不是惛_发出自己的Struts呢,q是省点力气吧,回头看看W二条——不要让事情复杂化。另外,如果正在开发的E序只有3个窗口,׃要用Struts了,对这U程序来_不需要那么多?#8220;控制”?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">   </font><strong>六、不要用println及字W串q接?/strong><font size="3">通常Z调试方便Q开发者喜Ƣ在可能的所有地斚w加上System.out.printlnQ也许还会提醒自己回q头来再来删除,但有些时候,l常会忘了删除或者不愿意删除它们。既然用System.out.println是ؓ了测试,那么试完之后,Z么还要留着它们呢,因ؓ在删除时Q很可能会删除掉真正有用的代码,所以不能低估System.out.println危害啊,L下面的代码:</font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">class</span><span style="color: #000000; "> BadCode { </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> calculationWithPrint(){ </span><span style="color: #0000ff; ">double</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0D; </span><span style="color: #0000ff; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span> <span style="color: #000000; ">10000</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) { System.</span><span style="color: #0000ff; ">out</span><span style="color: #000000; ">.println(someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i); } } </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> calculationWithOutPrint(){ </span><span style="color: #0000ff; ">double</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0D; </span><span style="color: #0000ff; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span> <span style="color: #000000; ">10000</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) { someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i; } } </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> main(String [] n) { BadCode.calculationWithPrint(); BadCode.calculationWithOutPrint(); } }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">从测试中可以发现Q方法calculationWithOutPrint()执行用了0.001204U,作ؓҎ(gu)Q方法calculationWithPrint()执行可是用了10.52U?br style="font-size: 12px; " /> <br style="font-size: 12px; " /> 要避免浪费CPU旉Q最好的Ҏ(gu)是引入像如下的包装方法:</font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">class</span><span style="color: #000000; "> BadCode { </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span><span style="color: #000000; "> final </span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> DEBUG_MODE </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">1</span><span style="color: #000000; ">; </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span><span style="color: #000000; "> final </span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> PRODUCTION_MODE </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">2</span><span style="color: #000000; ">; </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> calculationWithPrint(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> logMode){ </span><span style="color: #0000ff; ">double</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0D; </span><span style="color: #0000ff; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span> <span style="color: #000000; ">10000</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) { someValue </span><span style="color: #000000; ">=</span><span style="color: #000000; "> someValue </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i; myPrintMethod(logMode, someValue); } } </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> myPrintMethod(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> logMode, </span><span style="color: #0000ff; ">double</span><span style="color: #000000; "> value) { </span><span style="color: #0000ff; ">if</span><span style="color: #000000; "> (logMode </span><span style="color: #000000; ">></span><span style="color: #000000; "> BadCode.DEBUG_MODE) { </span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">; } System.</span><span style="color: #0000ff; ">out</span><span style="color: #000000; ">.println(value); } </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> main(String [] n) { BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE); } }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">另外Q字W串q接也是费CPU旉的一个大_L下面的示例代码:</font></p> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "> <pre style="font-family: 'Courier New'; white-space: pre-wrap; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: #ededed; "> <div style="margin-top: 0px; margin-bottom: 0px; border-style: initial; border-color: initial; text-align: left; margin-right: auto; margin-left: auto; color: #333333; "><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> concatenateStrings(String startingString) { </span><span style="color: #0000ff; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span> <span style="color: #000000; ">20</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) { startingString </span><span style="color: #000000; ">=</span><span style="color: #000000; "> startingString </span><span style="color: #000000; ">+</span><span style="color: #000000; "> startingString; } } </span><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">static</span> <span style="color: #0000ff; ">void</span><span style="color: #000000; "> concatenateStringsUsingStringBuffer(String startingString) { StringBuffer sb </span><span style="color: #000000; ">=</span> <span style="color: #0000ff; ">new</span><span style="color: #000000; "> StringBuffer(); sb.append(startingString); </span><span style="color: #0000ff; ">for</span><span style="color: #000000; "> (</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span> <span style="color: #000000; ">20</span><span style="color: #000000; ">; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) { sb.append(sb.toString()); } }</span></div> </pre> </div> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">在测试中可发玎ͼ使用StringBuffer的方法只用了0.01U执行完毕,而用连接的Ҏ(gu)则用?.08U,选择显而易见了?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong><font size="3">七、多xGUIQ用L面)?/font></strong><font size="3">再三QGUI对商业客h_与程序的功能及效率同{重要,GUI是一个成功程序的最基本部分Q而很多ITl理往往都没注意到GUI的重要性。在现实生活中,许多公司可能Z节省开支,没有雇用那些有着设计“用户友好”界面丰富l验的网设计者,此时Java开发者只能依赖他们自w的HTML基本功及在此领域有限的知识,l果Q很多开发出来的E序都是“计算机友?#8221;甚于“用户友好”。很有开发者同时精通Y件开发及GUI设计Q如果你在公?#8220;不幸”被分配负责程序界面,应该遵守下面三条原则:</font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">1?不要再发明一ơ轮子,即不做无用功。现有的E序可能会有cM的界面需求?br style="font-size: 12px; " /> 2?先创Z个原型。这是非帔R要一步,用户一般想看到他们用的东西Q而且可以先利用这个原型征求用L意见Q再慢慢修改成用h要的样子?br style="font-size: 12px; " /> 3?学会换位思考。换句话来说Q就是从用户的角度来审查E序的需求。D例来Ԍ一个汇ȝH口可以跨页或者不跨页Q作Z个Y件开发者,可能会們֐于不跨页Q因L单一些。但是,从用L角度来看Q可能不希望看到上百行数据都挤在同一上?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong><font size="3">   八、文档需求不放松?/font></strong><font size="3">每个商业需求都必须记录在案Q这可能听上d童话Q似乎在现实生活中很隑֮现。而我们要做的是,不管开发时间多紧迫Q不最l期限多临近Q对每个商业需求都必须记录在案?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">   </font><strong><font size="3">?ji)、单元测试、单元测试、单元测试?/font></strong><font size="3">关于什么是单元试的最好方法,在此不便l说Q只是强调,单元试一定要完成Q这也是~程中最基本的原则。当然了Q如果有人帮你做单元试自然是最好,如果没有Q就自己来做吧,当创Z个单元测试计划时Q请遵守以下三条最基本的原则:</font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">1?先于~写cM码之前编写单元测试?br style="font-size: 12px; " /> 2?记录单元试中的代码注释?br style="font-size: 12px; " /> 3?试所有执行关键功能的公有Ҏ(gu)Q这里不是指set和getҎ(gu)Q除非它们是以自qҎ(gu)式执行set和getҎ(gu)?/font></p> <p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong><font size="3">   十、质量,而不是数量?/font></strong><font size="3">有些时候因Z品问题、期限紧q、或一些预料之外的事情Q导致常怸能按时下班,但一般而言Q公怸会因为雇员经常加班而对之表扬和奖励Q公司只看重高质量的工作。如果遵守了前九(ji)条原则,你会发现自己写出的代码bug且可维护性高Q无形中质量提高了一大步?/font></p> </span><img src ="http://www.aygfsteel.com/mlh123caoer/aggbug/296938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlh123caoer/" target="_blank">草儿</a> 2009-09-29 19:52 <a href="http://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Class.getResource用法http://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296937.html草儿草儿Tue, 29 Sep 2009 11:43:00 GMThttp://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296937.htmlhttp://www.aygfsteel.com/mlh123caoer/comments/296937.htmlhttp://www.aygfsteel.com/mlh123caoer/archive/2009/09/29/296937.html#Feedback0http://www.aygfsteel.com/mlh123caoer/comments/commentRss/296937.htmlhttp://www.aygfsteel.com/mlh123caoer/services/trackbacks/296937.html阅读全文

草儿 2009-09-29 19:43 发表评论
]]>
你ؓ什么需要BndQ?/title><link>http://www.aygfsteel.com/mlh123caoer/archive/2007/09/05/142844.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 05 Sep 2007 03:03:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlh123caoer/archive/2007/09/05/142844.html</guid><wfw:comment>http://www.aygfsteel.com/mlh123caoer/comments/142844.html</wfw:comment><comments>http://www.aygfsteel.com/mlh123caoer/archive/2007/09/05/142844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlh123caoer/comments/commentRss/142844.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlh123caoer/services/trackbacks/142844.html</trackback:ping><description><![CDATA[<p style="text-align: center;">你ؓ什么需要BndQ?/p> <p style="text-align: left;">作者:皮特*柯林?br /> 译Q草?br /> </p> <p>刚刚收到一个谷歌文章提C,来自一个关于OSGi的博客。作者是Jilles van GurpQ首先对OSGi表示赞美然后提到q个工具。他的主要问题是必须在Eclipse插g开发环境里一个一个在Manifest中增加输?Q这时一些h会抱怨manifest的格式繁杂。我非常同意他的观点?<a class="wikilink">Bnd</a>q个工具基本上考虑C所有的要求?/p> <br /> <div id="wmqeeuq" class="indent"><em>理对其他绑定的依赖比在Java中处理输入包更繁琐。一般当我想用某些库的的时候,׃载它Q把它放在系l环境类路径上;输入几个字符Q用ctrl+space暴露MAPI。在OSGi中,q个更困难。你下蝲q个bundleQ假讑֭在一个)然后需要决定你想用它暴露给的哪一个包 ?/em></div> <br /> <div id="wmqeeuq" class="indent">我同意Eclipse的Java开发^収ͼJDTQ要比插件开发环境(PDEQ工作v来更方便。然而,如果你用bndQ你׃_地按照你所描述的方式工作。你能够象你以前一样用库包,你没有必要用PDE。我仅仅用JDT工作。Bndd一个配|文档,该文档描q类路径应该攑֜l果bundle中的那一部分?通配W和默认讄使这个配|描q最化成ؓ可能。Bnd到那时会核算目录和所要求的输出?/div> <div id="wmqeeuq" class="indent"><br /> <em>大多数库包实际上不用bundle装。Bundles是一个新概念Q它同旧有的jar文gQ大多以W三方库的Ş式引入)不兼宏V这不是一个不可逾越的限制。一个更合理的默认策略是把非OSGi jar文g作ؓbundlesQ简单地输出它的所有东西和把所有它要引q的攑ֈ引进路径上。从一个jar文g中抽取信息不可能很难。至,我想有一个工具ؓ我做q种工作?/em></div> <p>好了Q用Bnd工具 你的祷再次生效了。这个工h一个wrap函数能够Z做这个工作。然而,实际上因为很多JAR文g的依赖极端繁杂,所以这个可能变得困难。通常创徏一个可选输入或者忽略输入从而bundles是可安装的是必要的。当你分析一个JAR文gӞBnd能够帮你处理q个工作Q,你M吃惊的看到很多无用的依赖出现?/p> <p><br /> <em>最后,我讨厌必d理繁杂的manifest文g的想法。我注意到要求manifest文g要以I作ؓl束的缺陷依旧存在(如果q个遗漏了怪异的事情就发生了)。这个和在makefiles文g要用tab代替I格一L人?br /> </em></p> <p class="vspace">啊哈哈,实很麻烦,但是你用Bnd后就不会在ؓq些事而烦w了。一?bnd文g是一个属性文件。它能处理不限长度的行,使用反斜杠\扩展C一行,没h会关心最后一行。你也能增加注释。Bnddq些属性文Ӟ它用在ManifestcM建立的Java生成一个有效的manifest。以q种方式校验所有的头都为正的倹{?bnd文g看v来是多么单:<br /> </p> <pre xml:space="preserve"> Export-Package: aQute.service.*<br /> Import-Package: javax.servlet.http;version="[2,3)", *<br /> </pre> <p class="vspace">但是QJillesq没有说完关于OSGi的批评:</p> <br /> <div id="wmqeeuq" class="indent"><em>当然伴随Java5.0来Q用元注释完成q个是一个更好的方式。可以理解的是,OSGi需要与旧版本保持向后兼容,但是发展方式昄同新版本Java机制相背R基本上Q我xZimport & export机制能够指定cdҎ(gu)层次的约束?/em></div> <br /> <div id="wmqeeuq" class="indent">我知道元注释最q变得流行,清晰地它们有它们的用处。然而,q也有关注点分离斚w的考虑。我认ؓ我们的行业已l明白h们不x业务逻辑同基架构h在一Lq种考虑。用元注释在类或者方法层ơ指定你的约束显而易见会弄ؕ你的代码。我认ؓ依赖L复杂到超qhc能够管理的E度。需要更好的工具Q让用户在代码中手工理q些依赖是极端错误的們֐。所以我不能肯定元注释是一个解x案。如果输入包在源文g里有版本信息的话Q或者在manifest或者在包目录中的包信息文g里)QBnd能够扑ֈ输入包的版本信息 。尽它不能处理版本范围Q但是这U方式至是单ƈ能保持一致性。关于怎样处理版本范围Q允许在c\径上存在同包的多版本q分析他们的不同点)Q我有一些想法。但是,需要时?-<br /> </div> <div id="wmqeeuq" class="indent"><em>另一个问题是包中没有真正包含Java中首c表CŞ式。它们在Classes文g中按名调用(在包声明中)Q但是ƈ没有它们自己的规范。这意味着增加包层ơ的元注释是困难的(你能够用package-info.java 文g完成它)?/em></div> <br /> <div id="wmqeeuq" class="indent">像前面我诉说的Q我q不能肯定元注释是不是最好的Ҏ(gu)Q因为它会把业务逻辑同基架构相؜淆。在OSGi中,你能用manifest文gQ或?bnd文gQ在包中增加属性?/div> <div id="wmqeeuq" class="indent">另外Q?<a class="wikilink">Bnd</a>q有更多的特性:</div> <br /> <ul> <li>Bnd也被?a class="urllink" rel="nofollow">Felix Maven-bundle 插g</a>形式用在Maven构徏工具中,?/li> <li>Bnd 也是一个eclipse插g, 它在?bnd 文g ?.jar 文g的上下文菜单里增加了入口?/li> <li>你能d来自pȝ文g的Q何地Ҏ(gu)者来自一个URL的资源。这q不需要先创徏所有资源的目录l构, JAR在运行中构徏?/li> <li>资源能够包含被代替的变量引用?/li> <li>你能够很Ҏ(gu)得在你的JAR文g中从c\径上d包。如果你用另一个bundle的一部分而不惛_建额外的依赖Q这个用h非常方便?/li> <li>Bnd也能在输Z创徏uses语句 。这uses语句表明使用什么包。整个架构用这些信息创Z致的cȝ间?/li> <li>你能内联其他的JAR文g或者目录?/li> <li>更多的功?</li> </ul> <p class="vspace">我没有说Bnd是完无~的。我希望我能׃些时间以我喜Ƣ的方式对它q行扩展Q处理依赖的囑Ş~辑器;更好的分析支持;集成Eclipse构徏器等{?/p> <br /> <div id="wmqeeuq" class="indent">Peter Kriens</div> <br /><img src ="http://www.aygfsteel.com/mlh123caoer/aggbug/142844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlh123caoer/" target="_blank">草儿</a> 2007-09-05 11:03 <a href="http://www.aygfsteel.com/mlh123caoer/archive/2007/09/05/142844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi 体系l构及Bundle?/title><link>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/29/140762.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 29 Aug 2007 01:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/29/140762.html</guid><wfw:comment>http://www.aygfsteel.com/mlh123caoer/comments/140762.html</wfw:comment><comments>http://www.aygfsteel.com/mlh123caoer/archive/2007/08/29/140762.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlh123caoer/comments/commentRss/140762.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlh123caoer/services/trackbacks/140762.html</trackback:ping><description><![CDATA[<p>1、OSGi 的体pL构是Z插g式的软gl构Q包括一?OSGi 框架和一pd插gQ在 OSGi中,插gUCؓ BundleQ其中,OSGi 框架规范?OSGi 规范的核心部分,它提供了一个通用的、安全可理?Java 框架Q通过q个框架Q可以支?Bundle 服务应用的部|和扩展。Bundle 之间可以通过 Import Package ?Require-Bundle 来共?Java c,?OSGi 服务q_中,用户通过开?Bundle 来提供需要的功能Q这?Bundle 可以动态加载和卸蝲Q或者根据需要远E下载和升。OSGi 体系l构囑֦?1 所C:</p> <br><a name=N10063><strong>囄1 OSGi 体系l构</strong></a><br><img height=268 alt="囄1 OSGi 体系l构" src="http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgibdev/images/image002.jpg" width=320 border=0> <br> <p>其中Q?/p> <p>Execution EnvironmentQ?/p> <p>Bundle 应用所倚赖q行?Java 执行环境Q如 J2SE-1.4、CDC-1.0 {都是可用的执行环境?/p> <p>ModulesQ?/p> <p>模块层定义了 Bundle 应用的加载策略。OSGi 框架是一个健壮ƈ且严格定义的cd载模型。在大多?Java 应用中,通常只有一个单独的 ClassPathQ它包含了所有的 Java cL件和资源文gQOSGiZJava技术,对于每个实现?BundleActivator 接口?Bundle 应用Qؓ它生成一个单独的 ClassLoaderQ?Bundle 应用的组l更加模块化?/p> <p>Life CycleQ?/p> <p>生命周期层可以动态地?Bundle q行安装、启动、停止、升U和卸蝲{操作。该层基于模块层Q提供了一l?API 来控?Bundle 应用的运行时操作?/p> <p>Service Registry ?ServicesQ?/p> <p>OSGi 服务层定义了一个集成在生命周期层中的动态协作模型,是一个发布、动态寻找、绑定的服务模型。一个服务通常是一?Java 对象实现了特定的服务接口Qƈ且通过服务注册Q被l定?OSGi 的运行环境中。Bundle 应用可以注册发布服务Q动态绑定服务,q且在服务注册状态改变时Q可以接受到事g消息{?/p> <p>SecurityQ?/p> <p>OSGi 的安全管理是Z Java2 安全体系的,贯穿?OSGi q_的所有层中,它能够对部v?OSGi q行环境中的 Bundle 应用q行详细的管理控制?/p> <br> <p>2?a name=N10094><span id="wmqeeuq" class=atitle>Bundle 生命周期的状?/span></a>分析</p> <p>在一个动态扩展的 OSGi 环境中,OSGi 框架理 Bundle 的安装和更新Q同时也理 Bundle 和服务之间的依赖关系。一?Bundle 可能处于以下六个状态,如图 2 所C:</p> <br><a name=N1009F><strong>囄 2 Bundle 状态图</strong></a><br><img height=273 alt="囄 2 Bundle 状态图" src="http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgibdev/images/image004.jpg" width=355 border=0> <br> <p>INSTALLEDQ安装完成,本地资源成功加蝲?/p> <p>RESOLVEDQ依赖关pLIq个状态意呌Bundle要么已经准备好运行,要么是被停止了?/p> <p>STARTINGQBundle正在被启动,BundleActivator的start()Ҏ(gu)已经被调用但是还没有q回?/p> <p>STOPPINGQBundle正在被停止,BundleActivator的stop()Ҏ(gu)已经被调用但是还没有q回?/p> <p>ACTIVEQBundle 被成功启动ƈ且在q行?/p> <p>UNINSTALLEDQbundle被卸载ƈ且无法进入其他状态?/p> <p>Bundle接口定义了getState()Ҏ(gu)来返回Bundle的状态?/p><img src ="http://www.aygfsteel.com/mlh123caoer/aggbug/140762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlh123caoer/" target="_blank">草儿</a> 2007-08-29 09:40 <a href="http://www.aygfsteel.com/mlh123caoer/archive/2007/08/29/140762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ղ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">괨</a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank">Ρɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">֣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ء</a>| <a href="http://" target="_blank">־</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϲ</a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">°</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ָ</a>| <a href="http://" target="_blank">̫</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>