﻿<?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-无为-随笔分类-关注OSGi</title><link>http://www.blogjava.net/mlh123caoer/category/25369.html</link><description>无为则可为，无为则至深！
</description><language>zh-cn</language><lastBuildDate>Tue, 29 Sep 2009 23:38:57 GMT</lastBuildDate><pubDate>Tue, 29 Sep 2009 23:38:57 GMT</pubDate><ttl>60</ttl><item><title>Java开发者需坚守的十大基本准则</title><link>http://www.blogjava.net/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.blogjava.net/mlh123caoer/archive/2009/09/29/296938.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/296938.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/296938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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开发者，但此处要说的，是每个Java开发者需坚守的基本原则。<br style="font-size: 12px; " />
<br style="font-size: 12px; " />
&nbsp;&nbsp;&nbsp;</font><strong>一、为代码加注释。</strong><font size="3">虽然每个人都知道这点，但有时却不自觉忘了履行，今天你&#8220;忘了&#8221;加注释了吗？虽然注释对程序的功能没什么&#8220;贡献&#8221;，但过一段时间，比如说两星期之后或者更长，回过头来看看自己的代码，说不定已经记不住它是干什么的了。如果这些代码是你个人的，那还算是走运了，不幸的是，当然了，大多数时候都是别人的不幸，很多时候大家都是在为公司写代码，写代码的人也许早已经离开了公司，但别忘了一句古话，有来有往嘛，为他人，也为我们自己，请为你的代码加上注释。<br style="font-size: 12px; " />
<br style="font-size: 12px; " />
</font><strong>&nbsp;&nbsp; 二、不要让事情复杂化。</strong><font size="3">程序员有时候总是对简单问题想出复杂的解决方案，比如说，在只有五个用户的程序中引入EJB、对程序实现了并不需要的框架（framework），之类的还有属性文件、面向对象解决方案、多线程等等。为什么要这样做呢？也许我们并不知道是否这样会更好，但这样做也许可以学到一些新东西，或者让自己更感兴趣一些。如果是不知道为什么这样做，建议多请教经验丰富的程序员，如果是为了个人的目的，麻烦让自己更专业一点。<br style="font-size: 12px; " />
<br style="font-size: 12px; " />
&nbsp;&nbsp;&nbsp;</font><strong>三、始终牢记——&#8220;少即是好（Less is more）并不总是对的&#8221;。</strong><font size="3">代码效率虽然很重要，但在许多解决方案中，编写更少的代码并不能改善这些代码的效率，请看下面这个简单的例子：</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; ">&amp;&amp;</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; ">&lt;</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; ">&amp;&amp;</span><span style="color: #000000; ">
todayDate.compareTo(lastUsedDate)</span><span style="color: #000000; ">&gt;</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; ">&amp;&amp;</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; ">&lt;</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条件语句是干什么的吗？能想出来是谁写的这段代码吗？如果把它分成两段独立的if语句，是不是更容易理解呢，下面是修改后的代码：</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; ">&amp;&amp;</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; ">&lt;</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; ">&amp;&amp;</span><span style="color: #000000; ">
todayDate.compareTo(lastUsedDate)</span><span style="color: #000000; ">&gt;</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; ">&amp;&amp;</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; ">&lt;</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和两个花括号，但代码的可读性与可理解性就一下子提高了一大截。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong>&nbsp;&nbsp; 四、请不要硬编码。</strong><font size="3">开发者经常有意&#8220;忘记&#8221;或忽略掉这点，因为有些时候开发日程逼得实在太紧。其实，多写一行定义静态变量的代码能花多少时间呢？</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">现在，每次需要将&#8220;ABC&#8221;与其他变量进行比较时，不必记住实际代码，直接引用A.S_CONSTANT_ABC就行了，而且在今后需要进行修改时，也可在一处修改，不会翻遍整个源代码逐个修改了。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">&nbsp;</font><strong>五、不要&#8220;创造&#8221;自己的框架（framework）。</strong><font size="3">确切来说，有数以千计的各种框架存在，而且大多数是开源的，这些框架都是优秀的解决方案，可用于日常程序开发中，我们只需使用这些框架的最新版本就行了，至少表面上要跟上形势吧。被大家广为接受的最为明显的一个例子就是Struts了，这个开源web框架非常适合用在基于web的应用程序中。是不是想开发出自己的Struts呢，还是省点力气吧，回头看看第二条——不要让事情复杂化。另外，如果正在开发的程序只有3个窗口，就不要使用Struts了，对这种程序来说，不需要那么多的&#8220;控制&#8221;。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">&nbsp;&nbsp;&nbsp;</font><strong>六、不要使用println及字符串连接。</strong><font size="3">通常为了调试方便，开发者喜欢在可能的所有地方都加上System.out.println，也许还会提醒自己回过头来再来删除，但有些时候，经常会忘了删除或者不愿意删除它们。既然使用System.out.println是为了测试，那么测试完之后，为什么还要留着它们呢，因为在删除时，很可能会删除掉真正有用的代码，所以不能低估System.out.println危害啊，请看下面的代码：</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; ">&lt;</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; ">&lt;</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">从测试中可以发现，方法calculationWithOutPrint()执行用了0.001204秒，作为对比，方法calculationWithPrint()执行可是用了10.52秒。<br style="font-size: 12px; " />
<br style="font-size: 12px; " />
要避免浪费CPU时间，最好的方法是引入像如下的包装方法：</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; ">&lt;</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; ">&gt;</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">另外，字符串连接也是浪费CPU时间的一个大头，请看下面的示例代码：</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; ">&lt;</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; ">&lt;</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.01秒执行完毕，而使用连接的方法则用了0.08秒，选择显而易见了。</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">七、多关注GUI（用户界面）。</font></strong><font size="3">再三强调，GUI对商业客户来说，与程序的功能及效率同等重要，GUI是一个成功程序的最基本部分，而很多IT经理往往都没注意到GUI的重要性。在现实生活中，许多公司可能为了节省开支，没有雇用那些有着设计&#8220;用户友好&#8221;界面丰富经验的网页设计者，此时Java开发者只能依赖他们自身的HTML基本功及在此领域有限的知识，结果，很多开发出来的程序都是&#8220;计算机友好&#8221;甚于&#8220;用户友好&#8221;。很少有开发者同时精通软件开发及GUI设计，如果你在公司&#8220;不幸&#8221;被分配负责程序界面，就应该遵守下面三条原则：</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">1、 不要再发明一次轮子，即不做无用功。现有的程序可能会有类似的界面需求。<br style="font-size: 12px; " />
2、 先创建一个原型。这是非常重要一步，用户一般想看到他们将使用的东西，而且可以先利用这个原型征求用户的意见，再慢慢修改成用户想要的样子。<br style="font-size: 12px; " />
3、 学会换位思考。换句话来说，就是从用户的角度来审查程序的需求。举例来讲，一个汇总的窗口可以跨页或者不跨页，作为一个软件开发者，可能会倾向于不跨页，因为这样简单一些。但是，从用户的角度来看，可能不希望看到上百行数据都挤在同一页上。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong><font size="3">&nbsp;&nbsp; 八、文档需求不放松。</font></strong><font size="3">每个商业需求都必须记录在案，这可能听上去像童话，似乎在现实生活中很难实现。而我们要做的是，不管开发时间多紧迫，不管最终期限多临近，对每个商业需求都必须记录在案。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">&nbsp;&nbsp;&nbsp;</font><strong><font size="3">九、单元测试、单元测试、单元测试。</font></strong><font size="3">关于什么是单元测试的最好方法，在此不便细说，只是强调，单元测试一定要完成，这也是编程中最基本的原则。当然了，如果有人帮你做单元测试自然是最好，如果没有，就自己来做吧，当创建一个单元测试计划时，请遵守以下三条最基本的原则：</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><font size="3">1、 先于编写类代码之前编写单元测试。<br style="font-size: 12px; " />
2、 记录单元测试中的代码注释。<br style="font-size: 12px; " />
3、 测试所有执行关键功能的公有方法，这里不是指set和get方法，除非它们是以自己独特方式执行set和get方法。</font></p>
<p style="margin-top: 0px; margin-right: 8px; margin-bottom: 0px; margin-left: 8px; color: #333333; "><strong><font size="3">&nbsp;&nbsp; 十、质量，而不是数量。</font></strong><font size="3">有些时候因为产品问题、期限紧迫、或一些预料之外的事情，导致常常不能按时下班，但一般而言，公司不会因为雇员经常加班而对之表扬和奖励，公司只看重高质量的工作。如果遵守了前九条原则，你会发现自己写出的代码bug少且可维护性高，无形中质量提高了一大步。</font></p>
</span><img src ="http://www.blogjava.net/mlh123caoer/aggbug/296938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2009-09-29 19:52 <a href="http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Class.getResource用法</title><link>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 29 Sep 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/296937.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/296937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/296937.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用JAVA获取文件，听似简单，但对于很多像我这样的新人来说，还是掌握颇浅，用起来感觉颇深，大常最经常用的，就是用JAVA的File类，如要取得 c:/test.txt文件，就会这样用File file = new File("c:/test.txt");这样用有什么问题，相信大家都知道，就是路径硬编码，对于JAVA精神来说，应用应该一次成型，到处可用，并且从现实应用来讲，最终生成的应用也会部署到W...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/296937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2009-09-29 19:43 <a href="http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你为什么需要Bnd？</title><link>http://www.blogjava.net/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.blogjava.net/mlh123caoer/archive/2007/09/05/142844.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/142844.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/05/142844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/142844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/142844.html</trackback:ping><description><![CDATA[<p style="text-align: center;">你为什么需要Bnd？</p>
<p style="text-align: left;">作者：皮特*柯林斯<br />
翻译：草儿<br />
</p>
<p>刚刚收到一个谷歌文章提示，来自一个关于OSGi的博客。作者是Jilles van Gurp，首先对OSGi表示赞美然后提到这个工具。他的主要问题是必须在Eclipse插件开发环境里一个一个在Manifest中增加输入 ，这时一些人会抱怨manifest的格式繁杂。我非常同意他的观点。 <a href="http://www.aqute.biz/Code/Bnd" class="wikilink">Bnd</a>这个工具基本上考虑到他所有的要求。</p>
<br />
<div class="indent"><em>管理对其他绑定的依赖比在Java中处理输入包更繁琐。一般当我想用某些库的的时候，就下载它；把它放在系统环境类路径上；输入几个字符，使用ctrl+space暴露任何API。在OSGi中，这个更困难。你下载这个bundle（假设存在一个）然后需要决定你想用它暴露给的哪一个包 。</em></div>
<br />
<div class="indent">我同意Eclipse的Java开发平台（JDT）要比插件开发环境（PDE）工作起来更方便。然而，如果你用bnd，你就会精确地按照你所描述的方式工作。你能够象你以前一样使用库包，你没有必要用PDE。我仅仅用JDT工作。Bnd读取一个配置文档，该文档描述类路径应该放在结果bundle中的那一部分。 通配符和默认设置使这个配置描述最小化成为可能。Bnd到那时会核算目录和所要求的输出。</div>
<div class="indent"><br />
<em>大多数库包实际上不用bundle封装。Bundles是一个新概念，它同旧有的jar文件（大多以第三方库的形式引入）不兼容。这不是一个不可逾越的限制。一个更合理的默认策略是把非OSGi jar文件作为bundles，简单地输出它的所有东西和把所有它要引进的放到引进路径上。从一个jar文件中抽取信息不可能很难。至少，我想有一个工具为我做这种工作。</em></div>
<p>好了，使用Bnd工具 你的祈祷再次生效了。这个工具有一个wrap函数能够为你做这个工作。然而，实际上因为很多JAR文件的依赖极端繁杂，所以这个可能变得困难。通常创建一个可选输入或者忽略输入从而bundles是可安装的是必要的。当你分析一个JAR文件时（Bnd能够帮你处理这个工作），你总会吃惊的看到很多无用的依赖出现。</p>
<p><br />
<em>最后，我讨厌必须处理繁杂的manifest文件的想法。我注意到要求manifest文件要以空行作为结束的缺陷依旧存在（如果这个遗漏了怪异的事情就发生了）。这个和在makefiles文件要用tab代替空格一样烦人。<br />
</em></p>
<p class="vspace">啊哈哈，确实很麻烦，但是你使用Bnd后就不会在为这些小事而烦躁了。一个.bnd文件是一个属性文件。它能处理不限长度的行，使用反斜杠\扩展到下一行，没人会关心最后一行。你也能增加注释。Bnd读取这些属性文件，它用在Manifest类中建立的Java生成一个有效的manifest。以这种方式校验所有的头都为正确的值。.bnd文件看起来是多么简单：<br />
</p>
<pre xml:space="preserve">  Export-Package: aQute.service.*<br />
Import-Package: javax.servlet.http;version="[2,3)", *<br />
</pre>
<p class="vspace">但是，Jilles还没有说完关于OSGi的批评：</p>
<br />
<div class="indent"><em>当然伴随Java5.0来临，使用元注释完成这个是一个更好的方式。可以理解的是，OSGi需要与旧版本保持向后兼容，但是发展方式显然同新版本Java机制相背离。基本上，我想我基于import &amp; export机制能够指定类和方法层次的约束。</em></div>
<br />
<div class="indent">我知道元注释最近变得流行，清晰地它们有它们的用处。然而，这也有关注点分离方面的考虑。我认为我们的行业已经明白人们不想把业务逻辑同基础架构混淆在一起的这种考虑。使用元注释在类或者方法层次指定你的约束显而易见会弄乱你的代码。我认为依赖总是复杂到超过人类能够管理的程度。需要更好的工具，让用户在代码中手工管理这些依赖是极端错误的倾向。所以我不能肯定元注释是一个解决方案。如果输入包在源文件里有版本信息的话（或者在manifest或者在包目录中的包信息文件里），Bnd能够找到输入包的版本信息 。尽管它不能处理版本范围，但是这种方式至少是简单并能保持一致性。关于怎样处理版本范围（允许在类路径上存在同包的多版本并分析他们的不同点），我有一些想法。但是，需要时间--<br />
</div>
<div class="indent"><em>另一个问题是包中没有真正包含Java中首类表示形式。它们在Classes文件中按名调用（在包声明中），但是并没有它们自己的规范。这意味着增加包层次的元注释是困难的（你能够使用package-info.java 文件完成它）。</em></div>
<br />
<div class="indent">就像前面我诉说的，我还不能肯定元注释是不是最好的方案，因为它会把业务逻辑同基础架构相混淆。在OSGi中，你能用manifest文件（或者.bnd文件）在包中增加属性。</div>
<div class="indent">另外， <a href="http://www.aqute.biz/Code/Bnd" class="wikilink">Bnd</a>还有更多的特性：</div>
<br />
<ul>
    <li>Bnd也被以<a href="http://cwiki.apache.org/FELIX/maven-bundle-plugin-bnd.html" class="urllink" rel="nofollow">Felix Maven-bundle 插件</a>形式用在Maven构建工具中，。</li>
    <li>Bnd 也是一个eclipse插件, 它在为.bnd 文件 和 .jar 文件的上下文菜单里增加了入口。</li>
    <li>你能添加来自系统文件的任何地方或者来自一个URL的资源。这并不需要先创建所有资源的目录结构, JAR在运行中构建。</li>
    <li>资源能够包含被代替的变量引用。</li>
    <li>你能够很容易得在你的JAR文件中从类路径上添加包。如果你用另一个bundle的一小部分而不想创建额外的依赖，这个用起来非常方便。</li>
    <li>Bnd也能在输出中创建uses语句 。这uses语句表明使用什么包。整个架构使用这些信息创建一致的类空间。</li>
    <li>你能内联其他的JAR文件或者目录。</li>
    <li>更多的功能.</li>
</ul>
<p class="vspace">我没有说Bnd是完美无缺的。我希望我能花一些时间以我喜欢的方式对它进行扩展：处理依赖的图形编辑器；更好的分析支持；集成Eclipse构建器等等。</p>
<br />
<div class="indent">Peter Kriens</div>
<br /><img src ="http://www.blogjava.net/mlh123caoer/aggbug/142844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-05 11:03 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/05/142844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi 体系结构及Bundle简介</title><link>http://www.blogjava.net/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.blogjava.net/mlh123caoer/archive/2007/08/29/140762.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/140762.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140762.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/140762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/140762.html</trackback:ping><description><![CDATA[<p>1、OSGi 的体系架构是基于插件式的软件结构，包括一个 OSGi 框架和一系列插件，在 OSGi中，插件称为 Bundle，其中，OSGi 框架规范是 OSGi 规范的核心部分，它提供了一个通用的、安全可管理的 Java 框架，通过这个框架，可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类，在 OSGi 服务平台中，用户通过开发 Bundle 来提供需要的功能，这些 Bundle 可以动态加载和卸载，或者根据需要远程下载和升级。OSGi 体系结构图如图 1 所示：</p>
<br><a name=N10063><strong>图示1 OSGi 体系结构</strong></a><br><img height=268 alt="图示1 OSGi 体系结构" src="http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgibdev/images/image002.jpg" width=320 border=0> <br>
<p>其中：</p>
<p>Execution Environment：</p>
<p>Bundle 应用所倚赖运行的 Java 执行环境，如 J2SE-1.4、CDC-1.0 等都是可用的执行环境。</p>
<p>Modules：</p>
<p>模块层定义了 Bundle 应用的加载策略。OSGi 框架是一个健壮并且严格定义的类加载模型。在大多数 Java 应用中，通常只有一个单独的 ClassPath，它包含了所有的 Java 类文件和资源文件，OSGi基于Java技术，对于每个实现了 BundleActivator 接口的 Bundle 应用，为它生成一个单独的 ClassLoader，使得 Bundle 应用的组织更加模块化。</p>
<p>Life Cycle：</p>
<p>生命周期层可以动态地对 Bundle 进行安装、启动、停止、升级和卸载等操作。该层基于模块层，提供了一组 API 来控制 Bundle 应用的运行时操作。</p>
<p>Service Registry 和 Services：</p>
<p>OSGi 服务层定义了一个集成在生命周期层中的动态协作模型，是一个发布、动态寻找、绑定的服务模型。一个服务通常是一个 Java 对象实现了特定的服务接口，并且通过服务注册，被绑定到 OSGi 的运行环境中。Bundle 应用可以注册发布服务，动态绑定服务，并且在服务注册状态改变时，可以接受到事件消息等。</p>
<p>Security：</p>
<p>OSGi 的安全管理是基于 Java2 安全体系的，贯穿在 OSGi 平台的所有层中，它能够对部署在 OSGi 运行环境中的 Bundle 应用进行详细的管理控制。</p>
<br>
<p>2、<a name=N10094><span class=atitle>Bundle 生命周期的状态</span></a>分析</p>
<p>在一个动态扩展的 OSGi 环境中，OSGi 框架管理 Bundle 的安装和更新，同时也管理 Bundle 和服务之间的依赖关系。一个 Bundle 可能处于以下六个状态，如图 2 所示：</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>INSTALLED：安装完成，本地资源成功加载。</p>
<p>RESOLVED：依赖关系满足，这个状态意味该Bundle要么已经准备好运行，要么是被停止了。</p>
<p>STARTING：Bundle正在被启动，BundleActivator的start()方法已经被调用但是还没有返回。</p>
<p>STOPPING：Bundle正在被停止，BundleActivator的stop()方法已经被调用但是还没有返回。</p>
<p>ACTIVE：Bundle 被成功启动并且在运行。</p>
<p>UNINSTALLED：bundle被卸载并且无法进入其他状态。</p>
<p>Bundle接口定义了getState()方法来返回Bundle的状态。</p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/140762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-29 09:40 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>