有許多標準和實踐
準則可適用于Java開發者,但此處要說的,是每個Java開發者需堅守的基本原則。
&A7{Ck B8X0
;J'{aaGPi"f-P x0
一、為代碼加注釋。雖然每個人都知道這點,但有時卻不自覺忘了履行,今天你“忘了”加注釋了嗎?雖然注釋對程序的功能沒什么“貢獻”,但過一段時間,比
如說兩星期之后或者更長,回過頭來看看自己的代碼,說不定已經記不住它是干什么的了。如果這些代碼是你個人的,那還算是走運了,不幸的是,當然了,大多數
時候都是別人的不幸,很多時候大家都是在為公司寫代碼,寫代碼的人也許早已經離開了公司,但別忘了一句古話,有來有往嘛,為他人,也為我們自己,請為你的
代碼加上注釋。
中文JAVA技術網F7Kh9C#OyhS6g
D,fX]m$K(KQ;[4Q0 二、不要讓事情復雜化。程序員有時候總是對簡單問題想出復雜的解決方案,比如說,在只有五個
用戶的程序中引入
EJB、對程序實現了并不需要的框架(framework),之類的還有屬性文件、
面向對象解決方案、多
線程等等。為什么要這樣做呢?也許我們并不知道是否這樣會更好,但這樣做也許可以學到一些新東西,或者讓自己更感興趣一些。如果是不知道為什么這樣做,建議多請教經驗豐富的程序員,如果是為了個人的目的,麻煩讓自己更專業一點。
3Sp2q$ht0
D4wb6LN Nn[)Ju9n0 三、始終牢記——“少即是好(Less is more)并不總是對的”。代碼效率雖然很重要,但在許多解決方案中,編寫更少的代碼并不能改善這些代碼的效率,請看下面這個簡單的例子:
中文JAVA技術網 C0R,B P!I4y
中文JAVA技術網;M6J9PBXjEvu
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))){
L!p3E/_4R#w(r'@p0~{x7q/n0中文JAVA技術網C6^v3]"k"Es中文JAVA技術網"J SYDyu BC U H n] newStatusCode = "NYP";
*C&t GZ!p F3m0}
中文JAVA技術網+pqZ$l ?~$TZ)b$o]
M$p/gg0W*GI }K1z0 能看明白if條件語句是干什么的嗎?能想出來是誰寫的這段代碼嗎?如果把它分成兩段獨立的if語句,是不是更容易理解呢,下面是修改后的代碼:
? vT#p _ @6{4a0中文JAVA技術網+D*p%y2TrD | [t-|,]
中文JAVA技術網O%uT,K7B }&{1o8svif(newStatusCode.equals("SD") && (sellOffDate == null ||todayDate.compareTo(sellOffDate)<0
中文JAVA技術網CxAnLS[\h || (lastUsedDate != null &&todayDate.compareTo(lastUsedDate)>0))){
(w VH)kb"cO0 newStatusCode = "NYP";
中文JAVA技術網 F TX-DVC#^
}
else{
中文JAVA技術網a TN i#d;Ri
if(newStatusCode.equals("OBS") && (OBSDate == null ||todayDate.compareTo(OBSDate)<0)){
#~+g^KqB0中文JAVA技術網o:oN"{pmz.qH4t\_bl&I^yJ0 newStatusCode = "NYP";
2o;B6\/{C#m` c.S/v0 }
}
2K:M'mvS!Z0^x4F}r0
*P2m"E0|xy0 是不是讀起來容易多了呢,在此只是多加了一個if和兩個花括號,但代碼的可讀性與可理解性就一下子提高了一大截。
yp#m.R3nU ~fgX7Y0
7@.Ca&\y1p)Oa!mF0 四、請不要硬編碼。
開發者經常有意“忘記”或忽略掉這點,因為有些時候開發日程逼得實在太緊。其實,多寫一行定義靜態變量的代碼能花多少時間呢?
中文JAVA技術網JL,s9e a+R%T8x
*W0ic%Zgp b?0public class A {
!|U5]t[,o[-[0 public static final String S_CONSTANT_ABC = "ABC";
中文JAVA技術網 g/~"s u"` @XKlZ
public boolean methodA(String sParam1){
中文JAVA技術網IZ.NO ~(Q$t
if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
H]/t7O/M um0 return true;
中文JAVA技術網D t7\KX7Pv%[zI
}
中文JAVA技術網#G-\i!{BEk
return false;
c C?A-z(Q9h4b+| a[0 }
-V%U B c:T0}
中文JAVA技術網a f*ucX
中文JAVA技術網,M ?Ji#M.dz"b yQ6[L
現在,每次需要將“ABC”與
其他變量進行比較時,不必記住實際代碼,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要進行修改時,也可在一處修改,不會翻遍整個源代碼逐個修改了。
_;z#M;GI}|6m#h:n0
.\uF}E$\0 五、不要“創造”自己的框架(framework)。確切來說,有數以千計的各種框架存在,而且大多數是
開源的,這些框架都是優秀的解決方案,可用于日常程序開發中,我們只需使用這些框架的最新版本就行了,至少表面上要跟上形勢吧。被大家廣為接受的最為明顯的一個例子就是
Struts了,這個開源web框架非常適合用在基于web的應用程序中。是不是想開發出自己的Struts呢,還是省點力氣吧,回頭看看第二條——不要讓事情復雜化。另外,如果正在開發的程序只有3個窗口,就不要使用Struts了,對這種程序來說,不需要那么多的“控制”。
G$Ig.C+}0中文JAVA技術網 O'CM.DXSy$V&]D
六、不要使用println及字符串連接。通常為了調試方便,開發者喜歡在可能的所有地方都加上System.out.println,也許還會提醒自
己回過頭來再來刪除,但有些時候,經常會忘了刪除或者不愿意刪除它們。既然使用System.out.println是為了測試,那么測試完之后,為什么
還要留著它們呢,因為在刪除時,很可能會刪除掉真正有用的代碼,所以不能低估System.out.println危害啊,請看下面的代碼:
F ]?cIy0中文JAVA技術網/[C8Md7K
public class BadCode {
中文JAVA技術網L k"VhV"A:P
public static void calculationWithPrint(){
Q Esk POc5\0 double someValue = 0D;
k qjn!F.Hb+\0 for (int i = 0; i <10000; i++) {
中文JAVA技術網.J ZNg#V%I
System.out.println(someValue = someValue + i);
中文JAVA技術網)? {`*Bl8^~"m
}
-C(O,gf.Q a:N3^[0 }
4S.e;LF"@H6Mz0 public static void calculationWithOutPrint(){
中文JAVA技術網 c%Gq2hz jJ,E"XA
double someValue = 0D;
5^R$_ SYsi0 for (int i = 0; i < 10000; i++) {
%_,cqV(M Y0 someValue = someValue + i;
中文JAVA技術網 H&xVus'B
}
中文JAVA技術網ur U/qS}]o ah
}
R3^ X0KU+]0 public static void main(String [] n) {
G6WXQxa{0 BadCode.calculationWithPrint();
$?_ Mk ]jC0 BadCode.calculationWithOutPrint();
-T3gz!^6zK0 }
x$x:q g @3I0}
中文JAVA技術網Y-N|_R\p
中文JAVA技術網8u9_l?!O q$H,M1C
從測試中可以發現,方法calculationWithOutPrint()執行用了0.001204秒,作為對比,方法calculationWithPrint()執行可是用了10.52秒。
U7mcP],{;@r$U0中文JAVA技術網:Z+}V,Ra
要避免浪費CPU時間,最好的方法是引入像如下的包裝方法:
中文JAVA技術網`_8E7nT
中文JAVA技術網6k)WAk }
public class BadCode {
yQ(HXs;t(F,qXD0 public static final int DEBUG_MODE = 1;
N&ox.vAD y0 public static final int PRODUCTION_MODE = 2;
(L4tph+K MB!A4Z0 public static void calculationWithPrint(int logMode){
中文JAVA技術網)b,`?,r&^/`8x,l)];e7rs
double someValue = 0D;
中文JAVA技術網}4IF#bZf,n
for (int i = 0; i < 10000; i++) {
中文JAVA技術網"x(}1S T/]$X%};g;FD
someValue = someValue + i;
中文JAVA技術網 P)rS8GG?Jm
myPrintMethod(logMode, someValue);
中文JAVA技術網(AA_gN{bz#~&f
}
A5_x f&~{0 }
n k!{9~6u%i&d:`0 public static void myPrintMethod(int logMode, double value) {
\W;J3V b/X @{3h%P2\0 if (logMode > BadCode.DEBUG_MODE) { return; }
+{t Av|~0 System.out.println(value);
中文JAVA技術網B2D F]0U@8\
}
_#If \_~[0 public static void main(String [] n) {
B*q W.Y"eNx1W(`.QO u0 BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
D&g x3h)e0 }
中文JAVA技術網,Qv V`a^&I*N$CVn
}
C mo4A`)|1zT,o0中文JAVA技術網 ej!lr6}M,n%z
另外,字符串連接也是浪費CPU時間的一個大頭,請看下面的示例代碼:
中文JAVA技術網4T}/D5n7SvI
中文JAVA技術網4Qp/b&gyQC;Xb
public static void concatenateStrings(String startingString) {
中文JAVA技術網$W@0U@9g(eq6bUQ)u1P
for (int i = 0; i < 20; i++) {
中文JAVA技術網q/_&e x-rc
startingString = startingString + startingString;
中文JAVA技術網YRTS6pa
}
cUV S4c7Y2V }
O~%ET#@ wC!?\0public static void concatenateStringsUsingStringBuffer(String startingString) {
中文JAVA技術網3C%NZw]ZK y$U
StringBuffer sb = new StringBuffer();
UV#wS3B I#f,Z0 sb.append(startingString);
|0\;?[}0 for (int i = 0; i < 20; i++) {
4{%Z.e(L2P6_M4U1_(p0 sb.append(sb.toString());
@#Y*mqE@L!c+X0 }
中文JAVA技術網*aR4J[mhU!u9Vht
}
&we2r0u fb~'Nn4o?0
"_ eu5g B0CI0 在測試中可發現,使用StringBuffer的方法只用了0.01秒執行完畢,而使用連接的方法則用了0.08秒,選擇顯而易見了。
F(h r|%b2|1N0
Wu TL;JSl0
七、多關注GUI(用戶界面)。再三強調,GUI對商業客戶來說,與程序的功能及效率同等重要,GUI是一個成功程序的最基本部分,而很多IT經理往往
都沒注意到GUI的重要性。在現實生活中,許多公司可能為了節省開支,沒有雇用那些有著設計“用戶友好”界面豐富經驗的網頁設計者,此時Java開發者只
能依賴他們自身的HTML基本功及在此領域有限的知識,結果,很多開發出來的程序都是“計算機友好”甚于“用戶友好”。很少有開發者同時精通軟件開發及
GUI設計,如果你在公司“不幸”被分配負責程序界面,就應該遵守下面三條原則:
4y-g#b#Fn N0
t(x P"GK6EiH'{WY~0 1、 不要再發明一次輪子,即不做無用功。現有的程序可能會有類似的界面需求。
+f7xeO%E)m+_0 2、 先創建一個原型。這是非常重要一步,用戶一般想看到他們將使用的東西,而且可以先利用這個原型征求用戶的意見,再慢慢修改成用戶想要的樣子。
中文JAVA技術網!t Z-t@&]:s`
3、 學會換位思考。換句話來說,就是從用戶的角度來審查程序的需求。舉例來講,一個匯總的窗口可以跨頁或者不跨頁,作為一個軟件開發者,可能會傾向于不跨頁,因為這樣簡單一些。但是,從用戶的角度來看,可能不希望看到上百行數據都擠在同一頁上。
中文JAVA技術網3n&z#E;RjYT
q(sR3U V?z-m0 八、文檔需求不放松。每個商業需求都必須記錄在案,這可能聽上去像童話,似乎在現實生活中很難實現。而我們要做的是,不管開發時間多緊迫,不管最終期限多臨近,對每個商業需求都必須記錄在案。
+e P1?Tz'U&f6]0中文JAVA技術網 a3E L|TWO2Y3@
九、單元測試、單元測試、單元測試。關于什么是單元測試的最好方法,在此不便細說,只是強調,單元測試一定要完成,這也是編程中最基本的原則。當然了,如
果有人幫你做單元測試自然是最好,如果沒有,就自己來做吧,當創建一個單元測試計劃時,請遵守以下三條最基本的原則:
中文JAVA技術網 d Pc$}8UY0R8V7n
Sq-P Y`a%J-O0 1、 先于編寫類代碼之前編寫單元測試。
中文JAVA技術網 ]a s ?/NXE4|h
2、 記錄單元測試中的代碼注釋。
中文JAVA技術網+A ME9Z%D4@^
3、 測試所有執行關鍵功能的公有方法,這里不是指set和get方法,除非它們是以自己獨特方式執行set和get方法。
中文JAVA技術網:b7eT z i*P;H
中文JAVA技術網hQd8p'e6u y2x
十、質量,而不是數量。有些時候因為產品問題、期限緊迫、或一些預料之外的事情,導致常常不能按時下班,但一般而言,公司不會因為雇員經常加班而對之表
揚和獎勵,公司只看重高質量的工作。如果遵守了前九條原則,你會發現自己寫出的代碼bug少且可維護性高,無形中質量提高了一大步。