[转载]Java开发者需坚守的十大基本准则
信息来源:[url]http://www.cn-java.com[/url]有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。
一、为代码加注释。虽然每个人都知道这点,但有时却不自觉忘了履行,今天你“忘了”加注释了吗?虽然注释对程序的功能没什么“贡献”,但过一段时间,比如说两星期之后或者更长,回过头来看看自己的代码,说不定已经记不住它是干什么的了。如果这些代码是你个人的,那还算是走运了,不幸的是,当然了,大多数时候都是别人的不幸,很多时候大家都是在为公司写代码,写代码的人也许早已经离开了公司,但别忘了一句古话,有来有往嘛,为他人,也为我们自己,请为你的代码加上注释。中文JAVA技术网j'fKyO
2At(P\2jk?*]_8`0 二、不要让事情复杂化。程序员有时候总是对简单问题想出复杂的解决方案,比如说,在只有五个用户的程序中引入EJB、对程序实现了并不需要的框架(framework),之类的还有属性文件、面向对象解决方案、多线程等等。为什么要这样做呢?也许我们并不知道是否这样会更好,但这样做也许可以学到一些新东西,或者让自己更感兴趣一些。如果是不知道为什么这样做,建议多请教经验丰富的程序员,如果是为了个人的目的,麻烦让自己更专业一点。中文JAVA技术网nFqp'st&a[%Q
k,wA(w8KqL!IZ0 三、始终牢记——“少即是好(Less is more)并不总是对的”。代码效率虽然很重要,但在许多解决方案中,编写更少的代码并不能改善这些代码的效率,请看下面这个简单的例子:中文JAVA技术网3A&a[4ST0I1?
%GV+B}c!O1W G,C+a0if(newStatusCode.equals("SD") && (sellOffDate == null ||中文JAVA技术网\R6xsq"LcR
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&中文JAVA技术网3j7OFJ;I{j!s8AR
todayDate.compareTo(lastUsedDate)>0)) ||中文JAVA技术网:^/d1n!x AUV*|+S
(newStatusCode.equals("OBS") && (OBSDate == null ||
p7@1\iX#Y0todayDate.compareTo(OBSDate)<0))){
R*g,|Nu$CE0newStatusCode = "NYP";
?*H#hBm/W0}
V5i_+| lb7Kc*K0中文JAVA技术网*Zb v$z5S-t
能看明白if条件语句是干什么的吗?能想出来是谁写的这段代码吗?如果把它分成两段独立的if语句,是不是更容易理解呢,下面是修改后的代码:
S{dPj+Gf-r0
[c HW@4s'T\0if(newStatusCode.equals("SD") && (sellOffDate == null ||中文JAVA技术网SIf5@b!a
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
k+INwr7i3GRGN Y-x0todayDate.compareTo(lastUsedDate)>0))){
"V^0uF/\f;tht0newStatusCode = "NYP";中文JAVA技术网&`4ZBt+e)]3D\X]N
}else
$obb3zaV0if(newStatusCode.equals("OBS") && (OBSDate == null ||
V~[(G~k:L0todayDate.compareTo(OBSDate)<0))中文JAVA技术网R5y ^y0Y Ay
{
-Da:~0Ly$PL;Wsl.P0newStatusCode = "NYP";中文JAVA技术网edt G3bU#r5F;]
}
8ZY0E2G4H0中文JAVA技术网7L h;S cfal%}4Q8~
是不是读起来容易多了呢,在此只是多加了一个if和两个花括号,但代码的可读性与可理解性就一下子提高了一大截。
fwM@$I-kN5~!a Q0中文JAVA技术网0v cy!Vt] y
四、请不要硬编码。开发者经常有意“忘记”或忽略掉这点,因为有些时候开发日程逼得实在太紧。其实,多写一行定义静态变量的代码能花多少时间呢?
ASp5Pph0中文JAVA技术网/n Zw^ o}5rl
public class A {中文JAVA技术网8Fxb;kc2QP
public static final String S_CONSTANT_ABC = "ABC";
O)k"aP%Lg0public boolean methodA(String sParam1){
#Hb]g:{ j*N0if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
EP3pe3O'Sf0return true;中文JAVA技术网fZ#n&D5n"n#Ak\.D
}中文JAVA技术网n9jSkt,b
return false;中文JAVA技术网'cl9`G+J\]A'v
}
DP m t^TFq#m0@8P1z0}
#vU/m I}q'y9w0中文JAVA技术网 ]2] zh3xj
现在,每次需要将“ABC”与其他变量进行比较时,不必记住实际代码,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要进行修改时,也可在一处修改,不会翻遍整个源代码逐个修改了。
q%D2A'Sfyu:M{8kZE0中文JAVA技术网0u7GyhcGd FC f
五、不要“创造”自己的框架(framework)。确切来说,有数以千计的各种框架存在,而且大多数是开源的,这些框架都是优秀的解决方案,可用于日常程序开发中,我们只需使用这些框架的最新版本就行了,至少表面上要跟上形势吧。被大家广为接受的最为明显的一个例子就是Struts了,这个开源web框架非常适合用在基于web的应用程序中。是不是想开发出自己的Struts呢,还是省点力气吧,回头看看第二条——不要让事情复杂化。另外,如果正在开发的程序只有3个窗口,就不要使用Struts了,对这种程序来说,不需要那么多的“控制”。中文JAVA技术网3GVVTh
中文JAVA技术网,F"b6P-k&\"J"|Ns
六、不要使用println及字符串连接。通常为了调试方便,开发者喜欢在可能的所有地方都加上System.out.println,也许还会提醒自己回过头来再来删除,但有些时候,经常会忘了删除或者不愿意删除它们。既然使用System.out.println是为了测试,那么测试完之后,为什么还要留着它们呢,因为在删除时,很可能会删除掉真正有用的代码,所以不能低估System.out.println危害啊,请看下面的代码:
/[;D5TO8uhF5b2Y0
/e[WDa0public class BadCode {中文JAVA技术网 O5F'Zkz'Q}
public static void calculationWithPrint(){
3t)_zo!t7OaQ0double someValue = 0D;
T8PFuYdTANG0for (int i = 0; i <10000; i++) {
u'[5sV_*|G~)I0System.out.println(someValue = someValue + i);中文JAVA技术网1@&Q-F{7D+~!q
}中文JAVA技术网wC ~ ]2P)}jj
}
K4U@3tF0public static void calculationWithOutPrint(){中文JAVA技术网9lm'D+\1~q
double someValue = 0D;中文JAVA技术网+KH"{jv
for (int i = 0; i < 10000; i++) {中文JAVA技术网K@6W~$x/}Z2P
someValue = someValue + i;
5j8Z+kZK0}
m5Q"o5I IVw+z0}
!f1kW3Ow;Z)z*R0public static void main(String [] n) {
:qkj!Ilg"q6M#k7`0BadCode.calculationWithPrint();
"i\J h)^llE0BadCode.calculationWithOutPrint();
*t5R0Do+uMH%[0}
*YA:U-H8H:mTXn0}中文JAVA技术网8Jn2} e^^MOQG&w
0Y [-Qk+@h$M'Y.DN0 从测试中可以发现,方法calculationWithOutPrint()执行用了0.001204秒,作为对比,方法calculationWithPrint()执行可是用了10.52秒。中文JAVA技术网9eY*@%z6eG8}e.a_S
中文JAVA技术网:P+K V4Zw_a(`$Y
要避免浪费CPU时间,最好的方法是引入像如下的包装方法:中文JAVA技术网o8Uci:?eR4h
中文JAVA技术网%}S~S$KIN
public class BadCode {中文JAVA技术网C"Z(zBc;H
public static final int DEBUG_MODE = 1;
&Q/Rs7D8pd.QO0public static final int PRODUCTION_MODE = 2;
Tq,X|NOO/T7M8~[!i0public static void calculationWithPrint(int logMode){
'AD+AF/S3K1q0double someValue = 0D;中文JAVA技术网+^@&Jc$H,M
for (int i = 0; i < 10000; i++) {中文JAVA技术网6VG-T ^9m+f
someValue = someValue + i;中文JAVA技术网8q4C(Y({1h;X7n8`nfY
myPrintMethod(logMode, someValue);
-N sQF4Qw/f0}
a3H-~1bLO E0`5H0}中文JAVA技术网"X!]9R g$DP P
public static void myPrintMethod(int logMode, double value) {中文JAVA技术网7C$F"D8N6~i|
if (logMode > BadCode.DEBUG_MODE) { return; }
aA dX{1G0System.out.println(value);中文JAVA技术网z&N/^0lO7kp o
}中文JAVA技术网-Z2|2B+Ai
public static void main(String [] n) {中文JAVA技术网S#~w"r-O caWfQ
BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
U0f4n'O$Mc6\@b0}
iMAU1uNb0}中文JAVA技术网ZD[5OcMu.l1C
中文JAVA技术网3a8a8b&^ x'Q
另外,字符串连接也是浪费CPU时间的一个大头,请看下面的示例代码:
/BCh`q:z[J0中文JAVA技术网OT5}%WO{|8U
public static void concatenateStrings(String startingString) {
:X3_)s4jWP-W0for (int i = 0; i < 20; i++) {中文JAVA技术网 |*e-v-Z;S5~
startingString = startingString + startingString;中文JAVA技术网{r-v;cg3go
}中文JAVA技术网$sJ5p1n9ejCM
}
&{%c9PGmPd:^0public static void concatenateStringsUsingStringBuffer(String startingString) {中文JAVA技术网 H6|(W%t-c
StringBuffer sb = new StringBuffer();
c3n!AIS!NG.h0sb.append(startingString);中文JAVA技术网y(FL,~(F ~j}K#u.c"b
for (int i = 0; i < 20; i++) {
-I2e DT pF#T Z7U0sb.append(sb.toString());中文JAVA技术网&sfNKz;JkT#b
}中文JAVA技术网-Xe+r Wz;W^&f
}
/?i1O!uM-M}r)e1I0中文JAVA技术网cu ytMy9O2G
在测试中可发现,使用StringBuffer的方法只用了0.01秒执行完毕,而使用连接的方法则用了0.08秒,选择显而易见了。中文JAVA技术网/X#L7L#j6Bl
9P7K%G)q j0II0 七、多关注GUI(用户界面)。再三强调,GUI对商业客户来说,与程序的功能及效率同等重要,GUI是一个成功程序的最基本部分,而很多IT经理往往都没注意到GUI的重要性。在现实生活中,许多公司可能为了节省开支,没有雇用那些有着设计“用户友好”界面丰富经验的网页设计者,此时Java开发者只能依赖他们自身的HTML基本功及在此领域有限的知识,结果,很多开发出来的程序都是“计算机友好”甚于“用户友好”。很少有开发者同时精通软件开发及 GUI设计,如果你在公司“不幸”被分配负责程序界面,就应该遵守下面三条原则:中文JAVA技术网:@ K9i8^)rY lU R
p9GPl#m_x0 1、 不要再发明一次轮子,即不做无用功。现有的程序可能会有类似的界面需求。中文JAVA技术网|,B&Or~:x
2、 先创建一个原型。这是非常重要一步,用户一般想看到他们将使用的东西,而且可以先利用这个原型征求用户的意见,再慢慢修改成用户想要的样子。中文JAVA技术网upHg(g8@l;Q
3、 学会换位思考。换句话来说,就是从用户的角度来审查程序的需求。举例来讲,一个汇总的窗口可以跨页或者不跨页,作为一个软件开发者,可能会倾向于不跨页,因为这样简单一些。但是,从用户的角度来看,可能不希望看到上百行数据都挤在同一页上。
-UU:j&Zr\t"[5i0中文JAVA技术网L7yz8W'K!SU
八、文档需求不放松。每个商业需求都必须记录在案,这可能听上去像童话,似乎在现实生活中很难实现。而我们要做的是,不管开发时间多紧迫,不管最终期限多临近,对每个商业需求都必须记录在案。中文JAVA技术网 g0g9ZA;e;[{O9Is
` g] q:@hY&P0 九、单元测试、单元测试、单元测试。关于什么是单元测试的最好方法,在此不便细说,只是强调,单元测试一定要完成,这也是编程中最基本的原则。当然了,如果有人帮你做单元测试自然是最好,如果没有,就自己来做吧,当创建一个单元测试计划时,请遵守以下三条最基本的原则:
9@Nu"sHhe0中文JAVA技术网"n}1lo`qK
1、 先于编写类代码之前编写单元测试。中文JAVA技术网9?-k#ah [#JS a
2、 记录单元测试中的代码注释。中文JAVA技术网toRK1Y R$g2H
3、 测试所有执行关键功能的公有方法,这里不是指set和get方法,除非它们是以自己独特方式执行set和get方法。中文JAVA技术网'N2R`LR0Xnhwxy9I
][*}-iA];]B.u5K7T u0 十、质量,而不是数量。有些时候因为产品问题、期限紧迫、或一些预料之外的事情,导致常常不能按时下班,但一般而言,公司不会因为雇员经常加班而对之表扬和奖励,公司只看重高质量的工作。如果遵守了前九条原则,你会发现自己写出的代码bug少且可维护性高,无形中质量提高了一大步。
页:
[1]
