天天看點

Java開發人員的十大戒律

                                              Java 開發人員的十大戒律                                                    作者: Aleksey Shevchenko   對 Java 開發者來說,有許多的标準和最佳實踐。本文列舉了每一個開發人員必須遵從的十大基本法則;如果有了可以遵從的規則而不遵從,那麼将導緻的是十分悲慘的結局。   1.    在你的代碼裡加入注釋 每個人都知道這點,但不知何故忘記了遵守。算一算有多少次你“忘記”了添加注釋?這是事實:注釋對程式在功能上沒有實質的貢獻。但是,你需要一次又一次的回到你兩個禮拜之前寫的代碼上來,可能一輩子都是這樣,你一定記不住這些代碼為什麼會這樣。如果這些代碼是你的,你還比較的幸運。因為它有可能讓你回憶起。但是不幸的是,很多時間,這些代碼是别人的,而且很有可能他已經離開了公司。   2.    不要讓事情複雜化 我以前就這麼幹過,而且我相信所有的人都這麼幹過。開發人員常常為一個簡單的問題而提出一個解決方案。我們為僅僅隻有 5 個使用者的應用而引入 EJBs 。我們為一個應用使用架構而它根本不需要。我們加入屬性檔案,面向對象的解決方案,和線程到應用中,但是它根本不需要這些。為什麼我們這樣做?我們中的一些人是因為不知道怎麼做更好,但是還有一些人這樣做的目的是為了學習新的知識,進而使得這個應用對于我們自己來說做得比較有趣。   3.    牢牢記住——“少即是多( less is more )”并不永遠是好的 代碼的效率是一偉大的事情,但是在很多情況下,寫更少的代碼行并不能提高該代碼的效率。請讓我向你展示一個簡單的例子。

if(newStatusCode.equals("SD") && (sellOffDate == null ||       
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&       
todayDate.compareTo(lastUsedDate)>0)) ||       
(newStatusCode.equals("OBS") && (OBSDate == null ||       
todayDate.compareTo(OBSDate)<0))){      
                        newStatusCode = "NYP";      
}      

我想問一句:說出上面的那段代碼的 if 條件想幹什麼容易嗎?現在,我們再來假設無論是誰寫出這段代碼,而沒有遵從第一條規則——在你的代碼裡加入注釋。 如果我們把這個條件分到兩個獨立的 if 陳述句中,難道不是更簡單一些嗎?現在,考慮下面的修正代碼:

if(newStatusCode.equals("SD") && (sellOffDate == null ||       
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&       
todayDate.compareTo(lastUsedDate)>0))){      
                        newStatusCode = "NYP";      
}else       
if(newStatusCode.equals("OBS") && (OBSDate == null ||       
todayDate.compareTo(OBSDate)<0))      
{      
                        newStatusCode = "NYP";      
}      

難道它不是有了更好的可讀性?是的,我們重複了陳述條件。是的,我們多出了一個多餘的“ IF ”和兩對多餘的括弧。但是代碼有了更好的可讀性和可了解性。   4.    請不要有硬代碼 開發人員常常有意識的忘記或者忽視這條規則,原因是我們,和一般時候一樣,在趕時間。如果我們遵從這條規則,我們可能會趕不上進度。我們可能不能結束我們的目前狀态。但是寫一條額外的定義靜态常量的代碼行又能花費我們多少時間呢? 這裡有一個例子。

               public class A {      
                               public static final String S_CONSTANT_ABC = "ABC";      
                               public boolean methodA(String sParam1){      
                                              if(A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){      
                                                             return true;      
                                              }                                   
                                              return false;      
                               }      
               }      

現在,每一次我們需要和某一些變量比較字元串“ ABC ”的時候,我們隻需要引用 S_CONSTANT_ABC , 而不是記住實際的代碼是什麼。它還有一個好處是:更加容易在一個地方修改常量,而不是在所有的代碼中尋找這個代碼。   5.    不要發明你自己的 frameworks 已經推出了幾千種 frameworks ,而且它們中的大多數是開源的。這些 frameworks 中間有很多是極好的解決方案,被應用到成千上萬的應用中。你們需要跟上這些新 frameworks 的步伐,最起碼是膚淺的。在這些極好的、應用廣泛的 frameworks 中間,一個最好的、最直接的例子是 Struts 。在你所能想象到的 frameworks 中,這個開源的 web frameworks 對于基于 web 的應用是一個完美的候選者。但是你必須記住第二條規則——不要讓事情複雜化。如果你開發的應用隻有三個頁面—請,不要使用 Struts ,對于這樣一個應用,沒有什麼“控制”請求的。   6.    不要列印行和字元串相加 我知道,為了調試的目的,開發人員喜歡在每一個我們認為适合的地方添加 System.out.println ,而且我們會對我們自己說,會在以後删掉這些代碼的。但是我們常常忘掉删去這些代碼行,或者我們根本就不想删掉它們。我們使用 System.out.println 來測試,當我們測試完成以後,為什麼我們還能接觸到它們呢?我們可能删掉一行我們實際需要的代碼,僅僅是因為你低估了 System.out.println 所帶來的傷害,考慮下面的代碼: public class BadCode {  public static void calculationWithPrint(){       double someValue = 0D;       for (int i = 0; i < 10000; i++) {            System.out.println(someValue = someValue + i);       }     }  public static void calculationWithOutPrint(){              double someValue = 0D;            for (int i = 0; i < 10000; i++) {                 someValue = someValue + i;            }        }  public static void main(String [] n) {       BadCode.calculationWithPrint();       BadCode.calculationWithOutPrint();  } } 在下面的表格中,你能夠看到 calculationWithOutPrint() 方法的運作花了 0.001204 秒。相比較而言,運作 calculationWithPrint() 方法花了令人驚訝的 10.52 秒。

Java開發人員的十大戒律

(如果你不知道怎麼得到一個像這樣的表格,請參閱我的文章“ Java Profiling with WSAD ” Java Profiling with WSAD ) 避免這樣一個 CPU 浪費的最好方法是引入一個包裝器方法,就象下面這樣

public class BadCode {      
                               public static final int DEBUG_MODE = 1;      
                               public static final int PRODUCTION_MODE = 2;      
               public static void calculationWithPrint(int logMode){                 
                               double someValue = 0D;      
                               for (int i = 0; i < 10000; i++) {      
                                              someValue = someValue + i;      
                                              myPrintMethod(logMode, someValue);      
                               }      
               }      
               public static void myPrintMethod(int logMode, double value) {      
                               if (logMode > BadCode.DEBUG_MODE) {             return; }      
                               System.out.println(value);           
               }      
               public static void main(String [] n) {      
                               BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);      
                               }      
}      

在下面的圖中,你将看到,使用了 StringBuffer 的那個方法隻花了 0.01 秒來執行,而那個使用了字元串相加的方法卻花了 0.08 秒來運作。選擇是顯而易見的。

Java開發人員的十大戒律

  7.   關注GUI 不管這聽起來有多麼可笑,我都要再三地說明:GUI對于商業客戶來說和功能和性能一樣重要。GUI是一個成功的系統的必要的一部分。(但是),IT雜志常常傾向于忽視GUI的重要性。很多機構為了省錢而不雇用那些在設計“使用者友好”GUI方面有豐富經驗的設計人員。Java開發人員不得不依賴他們自己的HTML知識,但是他們在這方面的知識十分有限。我看到過很多這樣的應用:它們是“計算機友好”,而不是“使用者友好”我很少很少能看到有開發人員既精通軟體開發,又精通GUI開發。如果你是那個不幸的開發人員,被配置設定去開發使用者接口,你應該遵從以下的三條原則: 一、 不要重複發明輪子。尋找有相似使用者接口需求的已經存在的系統。 二、 首先建立一個原型。這是非常重要的步驟。客戶喜歡看看他們将要得到什麼。這對你來說也是很好的,因為在你全力以赴而做出一個将要使使用者生氣的使用者接口之前,你就得到了它們的回報。 三、 戴使用者的帽子。換一句話說,站在使用者的視角檢查應用的需求。例如,一個總結頁面到底要不要分頁。作為一個軟體開發者,你傾向于在一個系統中忽視分頁,因為這樣使得你有比較少的開發複雜性。但是,這對于從一個使用者的視角來說卻不是最好的解決方案,因為小結的資料将會有成百上千個資料行。   8.   永遠準備文檔化的需求 每一個業務需求都必須文檔化。這可能在一些童話故事裡才能成真,但是在現實世界卻不可能。不管時間對于你的開發來說是多麼緊迫,也不管傳遞日期馬上就要到來,你永遠都必須清楚,每一個業務需求是文檔化的。   9.   單元測試、單元測試、單元測試 我将不會深入地讨論哪些什麼是把你的代碼進行單元測試的最佳方法的細節問題。我将要說的是單元測試必須要做。這是程式設計的最基本的法則。這是上面所有法則中最不能被忽略的一個。如果你的同僚能為你的代碼建立和測試單元測試,這是最好不過的事。但是如果沒有人為你做這些事,那麼你就必須自己做。在建立你的單元測試計劃的時候,遵從下面的這些規則: 一、 在寫代碼之前就寫單元測試用例。 二、 在單元測試裡寫注釋。 三、 測試一切執行“interesting”功能的公有方法(“interesting”的意思是非setters或getters方法,除非它們通過一種特殊的方式執行set和get方法)。   10.             記住—品質,而不是數量。 不要在辦公室裡呆得太晚(當你不必呆的太晚的時候)。我了解有時,産品的問題、緊迫的最終期限、意想不到的事件都會阻止我們按時下班。但是,在正常情況下,經理是不會賞識和獎賞那些下班太晚的員工的,他賞識他們是因為他們所做産品的品質。如果你遵從了我上面給出的那些規則,你将會發現你的代碼更加少的bug,更加多的可維護性。而這才是你的工作的最重要的部分。   總結 在這篇文章裡,我給出了針對Java開發人員的十個重要的規則。重要的不僅僅是知道這些規則,在編碼的過程中遵從這些規則更為重要。希望這些規則能夠幫助我們成為更好的程式設計人員和專業人員。   關于作者 Aleksey Shevchenko 在面向對象方面的程式設計有着七年以上的經驗。他現在在從事華爾街、制造和出版工業方面的IT解決方案的工作。