Java程序员十戒-1

上一篇 / 下一篇  2012-04-20 09:51:07 / 个人分类:Java

Java程序员有许多应遵循的守则或最佳实践方式。本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果。51Testing软件测试网8hO%_4ss9W

  1、为代码添加注释(Add comments to your code)。– 每个人都知道这一点,但不是每个人都会这么做。你有多少次“忘记”添加注释了?确实,注释不会为你的程序增加任何函数功能。但是,有多少次,看到2周前写的代码,你都记不起它是干什么的?你很幸运,那些未注释的代码是你自己写的,你脑海中还会有残存的印象。非常不幸,大多时候,代码是别人写的,并且那个人很可能已经离开公司了。有句谚语说的好:“有来有往,互惠互利”,因此程序员应该体谅彼此(还有你自己),给你的代码加上注释。

dn#N%k*c0

~L.xP?nK u0  2、不要把简单事情复杂化(Do not complicate things)。– 我曾经这么做过,我相信你也一样。开发者都倾向于采用复杂方式解决简单问题。我们在一个只有5个用户的系统中引入EJB,为一个并不需要框架的应用实现一套框架,采用属性文件、采用面向对象解决方案、使用线程,而这些根本用不着。为什么会这么做?一些人可能不知道有更好的解决方案,但另一些人可能故意这样做来学习新知识,或仅仅是因为有趣。对那些不知道更好解决方案的人,要多听有经验程序员的建议。对于那些纯粹出于个人目的而将设计复杂化的人,我建议你要更加专业一点。51Testing软件测试网@d\bN9SVF

4A?;Jy,V p(}-smC*_'g0  3、记住 - “越少越好”并非总是如此(Keep in Mind – "Less is more" is not always better)。– 高效率的代码是件好事,但很多情况下,并非代码行数越少效率就越高。看下面这个“简单”的例子:

2KF$P] D-e8W051Testing软件测试网;w!x$V;g0}6f#HT

T\T!N2q^'G0
if(newStatusCode.equals("SD") && (sellOffDate == null ||51Testing软件测试网kA$d6a6djh#a
todayDate.compareTo(sellOffDate)<0 ||51Testing软件测试网rc j-wU(w]7Q
(lastUsedDate != null && todayDate.compareTo(lastUsedDate)>0))
KT0p%Q"WT}0||(newStatusCode.equals("OBS") && (OBSDate == null ||51Testing软件测试网(F\X0YC _1]p
todayDate.compareTo(OBSDate)<0))){
c/R H2rO$_R0        newStatusCode = "NYP";
g j%C8^/PB)p:Dr0}

N,c4T M:dT(D7T$Y ~051Testing软件测试网dwY-?6u3b1Ud%j

-o\+D _ JD'z0a0  指出这个if条件是什么有多困难?再设想一下,写这段代码的人并没遵循第1条 - 为代码添加注释。

5PmHNv&Mk0

#}g hU*o0  把if条件分解成2个if语句不是更容易理解吗?现在让我们看一下修改过的代码:

[ d1Z"k*PY+U&DP7a0

2k;`? M3[F[051Testing软件测试网4S3O+GKy(o

1 if(newStatusCode.equals("SD") && (sellOffDate == null ||51Testing软件测试网 f9l/f-P9g#Y l
2 todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&51Testing软件测试网A1o)s]-f/Cc"L9\%gZ
3 todayDate.compareTo(lastUsedDate)>0))){51Testing软件测试网'qH3yuz4Su+d
4 newStatusCode = "NYP";
*r rTRX*L2p Z4]2oLa05 }else
L5~G {e7o06 if(newStatusCode.equals("OBS") && (OBSDate == null ||
+x*t_:m|1G-z6C07 todayDate.compareTo(OBSDate)<0))
8Pe6b#l!K)YO08 {
5`l4Z T;rnRC09 newStatusCode = "NYP";
#k |?x7[p4i~D010 }
51Testing软件测试网4M u L%a9g7p$t6H

51Testing软件测试网#q,z'kpUl5F[9~

51Testing软件测试网)Mid}!V \%NP

  这样可读性不是更好吗?的确,我们写了重复语句;的确,我们多写了一个if和2个大括号;但是代码确实更加易读、更加容易理解了!51Testing软件测试网FQ?-rbRo"C8h

51Testing软件测试网P"Cu%Evt a

  4、不要“硬编码"(No hard coding please)。– 由于时间紧迫,开发者总是会忘记或故意忽略这一条。然而另一种可能是,遵循这条戒律,我们就不会陷入“时间紧迫”的困境。定义一个static final 变量,增加一行代码,又能花多长时间呢?譬如:

yJ#t1Wm8z {^051Testing软件测试网|s+n8h.U

*@"I2_y q0
1 public class A {51Testing软件测试网*t7E8vts[
251Testing软件测试网N xG5W$eVWE7AO
3         public static final String S_CONSTANT_ABC = "ABC";51Testing软件测试网\*c%~+i9IT
4
3eEr%k:Y+@1M {X9b05         public boolean methodA(String sParam1){
9M-nk Au9F x06
wo[9v{T07             if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){51Testing软件测试网|5Bs4gtci'u
8                 return true;51Testing软件测试网5G-gt8p;_MS/I
9             }51Testing软件测试网@IG%[\R,W%Y
10             return false;
A K9})riPM/?M011         }
0g[3QB9Y+U |T012 }
51Testing软件测试网"V jOB*[2n,shK

5E)_ G?],dD$h0

A5g dr%Tn8G1ef6`*C0  现在,每次需要比较字符串“ABC”与某个变量的时候,我们只要引用 A.S_CONSTANT_ABC 即可,而不必记住它本身是什么。对这个常量的修改也非常方便,改一个地方即可,而不必在全部代码中查找。51Testing软件测试网#x(Ln M0]\.m0[!@

@ @:aVE Mg&boR0  5、不要发明你自己的框架(Do not invent your own frameworks)。– 不夸张地讲,已经有几千个框架存在了,大多数还是开源的。很多框架都是极完美的解决方案,并已被用到成千的系统中。我们只要关注最新的流行的框架,至少表面上要熟悉一下。一个最成功的、也是被广泛使用的例子是Struts框架,这个开源的web框架是建立web系统的极佳选择,不要试图构造你自己的Struts版本,会累死的。但你必须记住第2条(译注:原文是“第3条”,显然不对)戒律 —— 不要把简单事情复杂化。如果你要开发的系统只有3个界面,就不要用Struts. 对于这样一个系统,没有足够的需要被“控制”的东西(译注:Struts将界面做MVC划分,C即controller,所以作者说there isn't much "controlling" required)。

HH+?&qW,](n5YUL0
6、对Print行或字符串说不(Say no to Print lines and String Concatenations)。– 我知道为了调试方便,程序员喜欢到处用System.out.println ,然后对自己说过一会就删掉。但我们常常忘记删掉这些行或不愿删掉,我们用System.out.println 做测试,为什么测完后还要去改代码?这很可能导致误删一行我们需要的代码。不要低估System.out.println 的危害,看下面代码:

c3u.Kvf'C M V(x0

Ogm)Gs0B0SY k[f0
1 public class BadCode {
*N%y x ^'S N_@ PL A02 public static void calculationWithPrint(){
hRFn0{03 double someValue = 0D;
`3L&^%T+^5E04 for (int i = 0; i < 10000; i++) {
bnrb4]tJe;VI05 System.out.println(someValue = someValue + i);51Testing软件测试网};Z5C$gv^k gx
6 }
xJ9M~3w+M0` MO]:y$G07 }51Testing软件测试网:MK6YJp Bve
8 public static void calculationWithOutPrint(){
+LmjF(q*g5j%l@~09
G5Q6JF5u%I hX010 double someValue = 0D;51Testing软件测试网 CQ.["s6s
11 for (int i = 0; i < 10000; i++) {
8e2?b q c012 someValue = someValue + i;
Y CMNdq013 }
I%A-YbL&v Z9lZT014
gLD3o y i015 }51Testing软件测试网+lGgFD{%gW s
16 public static void main(String [] n) {51Testing软件测试网:s)^+\,xI+br^ v?
17 BadCode.calculationWithPrint();51Testing软件测试网.k,QB3x6y'N/qY a4IV
18 BadCode.calculationWithOutPrint();51Testing软件测试网 d)gy;]p^
19 }51Testing软件测试网/^'iT'Z"k
20 }

1Bb8f&@F |051Testing软件测试网FH2d ^Q7W

Jix-|7R4I0  下面表格可以看出,calculationWithOutPrint() 方法执行时间是0.001204 s. 作为对比,calculationWithPrint() 方法居然需要令人难以置信的10.52 s来执行!51Testing软件测试网6Z&YP)U5s I

51Testing软件测试网Q v9[2m7b;a S

  (若你想知道怎么做一个这样的表,请阅读另一篇文章"Java Profiling with WSAD")

6elC6hs7r}:c0

  为了避免CPU浪费,最好的办法是引入一个包装的方法,如下:

PS-mSJ2Z qh0`0

51Testing软件测试网\^6D7^ I#H1U,w#g)`5F

1 public class BadCode {
\&PW.{ CN7o0251Testing软件测试网Nd}d8vW
3         public static final int DEBUG_MODE = 1;51Testing软件测试网!VX-X"Kc4_pw
4         public static final int PRODUCTION_MODE = 2;
[i.|zj6c05
"c+R4Mn3W,s"Y1T06     public static void calculationWithPrint(int logMode){
1}0g2cMp$yN07         double someValue = 0D;
,b:l(N1i XIKG08         for (int i = 0; i < 10000; i++) {
3K]#ut8N09             someValue = someValue + i;
w*[Cy c'h010             myPrintMethod(logMode, someValue);51Testing软件测试网I @$Y'e#{a6i^
11         }51Testing软件测试网2J dr4E Zq3o/~
12     }51Testing软件测试网]%y FB7r
1351Testing软件测试网_+?`+D"DA
14     public static void myPrintMethod(int logMode, double value) {
%p8[ M {z|cN015         if (logMode > BadCode.DEBUG_MODE) {    return; }
U%e:B0d2UT-w+}016         System.out.println(value);51Testing软件测试网WJ'D M.{p!aj^
17     }
l o,lXx018     public static void main(String [] n) {51Testing软件测试网v0\X;e&y;Oa3W@
19         BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);51Testing软件测试网6aj,gj2B$J;v
20         }51Testing软件测试网)_3k.uM v/v
21 }

&aA^ E8o&q-{0

q5X+T5b)AT c4YY0

  字符串(String)连接是另一种CPU浪费方式,看下面的例子:

8ih3A`)gJ:{D g0

51Testing软件测试网bq:BN"x

1 public static void concatenateStrings(String startingString) {
}:Y A2si"D0fC02 for (int i = 0; i < 20; i++) {
4i[H^5rA"gu#o03 startingString = startingString + startingString;51Testing软件测试网E qc:e gP
4 }
7W7J;hLy(JWb05 }
&ECB C)d7Z;yN0651Testing软件测试网!T#l4n,F3R7sq'T%Y
7 public static void concatenateStringsUsingStringBuffer(51Testing软件测试网1R;ri&u+huQxan2H
8 String startingString) {51Testing软件测试网DYJ OsrR
9 StringBuffer sb = new StringBuffer();51Testing软件测试网 ~pY7F,Q N
10 sb.append(startingString);
'x"^:u@)a011 for (int i = 0; i < 20; i++) {51Testing软件测试网)a:jE*E+} le5q
12 sb.append(sb.toString());
%LV ["?@ }013 }51Testing软件测试网-u| f|T*Y
14 }
51Testing软件测试网/W.F p6cb#[Mh

}~2Qyh1S0

TAG:

 

评分:0

我来说两句

Open Toolbar