Java程序员十戒-1

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

Java程序员有许多应遵循的守则或最佳实践方式。本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果。51Testing软件测试网GS]"Mw0q N!M N0W5^Z({

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

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

`,G1rS'LW"d051Testing软件测试网xW1VW.NYBw3o k,y

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

/i/q)S\6wg7B z e0

jlh/S5aj0

E/CG&^ zssu4P)pv0
if(newStatusCode.equals("SD") && (sellOffDate == null ||51Testing软件测试网6_N["`sDw
todayDate.compareTo(sellOffDate)<0 ||51Testing软件测试网\!S]O#N0l$A7U g
(lastUsedDate != null && todayDate.compareTo(lastUsedDate)>0))51Testing软件测试网!x#rz$]4_.@
||(newStatusCode.equals("OBS") && (OBSDate == null ||51Testing软件测试网,]w:g${0o?%d
todayDate.compareTo(OBSDate)<0))){
.`9jCZhq0        newStatusCode = "NYP";
*WLB#U/?}!F0}
51Testing软件测试网|+pG4\Yz3R

E8~:f{"l0

y9MrA*Z0D1H4C4y0  指出这个if条件是什么有多困难?再设想一下,写这段代码的人并没遵循第1条 - 为代码添加注释。

8W0u"`} ~Kb(vNw0

j!Gc&o4Q:|0  把if条件分解成2个if语句不是更容易理解吗?现在让我们看一下修改过的代码:51Testing软件测试网+Fh2Y9W:i y$t[5{ C8g

_v.X [{051Testing软件测试网"~3lQ me g?x

1 if(newStatusCode.equals("SD") && (sellOffDate == null ||51Testing软件测试网+\AR(y-z
2 todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
#Mz \?!N)zm03 todayDate.compareTo(lastUsedDate)>0))){51Testing软件测试网]7x;S @+u7\
4 newStatusCode = "NYP";51Testing软件测试网&zY0u.F kd
5 }else51Testing软件测试网:S#tik9|c7M%d
6 if(newStatusCode.equals("OBS") && (OBSDate == null ||51Testing软件测试网X.{G5k gE
7 todayDate.compareTo(OBSDate)<0))51Testing软件测试网H,H*~XZ3a:_Lz.?
8 {51Testing软件测试网;Lv}}xh
9 newStatusCode = "NYP";51Testing软件测试网xW-_1k*{e1k&G\?+N
10 }
51Testing软件测试网 zJ*V?X

51Testing软件测试网VGXJ McR

51Testing软件测试网$q6@_ }j

  这样可读性不是更好吗?的确,我们写了重复语句;的确,我们多写了一个if和2个大括号;但是代码确实更加易读、更加容易理解了!

_y|)f{051Testing软件测试网-O2U YM/P.@

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

R%X0^)V;A.C1q5ou`"n }0

|8P0b~L)ZD'lM0

V S)^x3P1X0
1 public class A {51Testing软件测试网 o }F({'N#s \:_;^
2
#?0{u%BsS _5O)t03         public static final String S_CONSTANT_ABC = "ABC";51Testing软件测试网e7Q`"v%_ z$gt
4
6Cg bq z'\f!Y-C05         public boolean methodA(String sParam1){51Testing软件测试网dh!V:H dD
651Testing软件测试网5[#zRG9R6]q*p9~:s
7             if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
&y&[9K o4W(p4eUpT08                 return true;
6O$]/uq lT^09             }
'g`pt Dz,? \010             return false;51Testing软件测试网+?"{&_|G4vK)s Gf'I
11         }
n`1kVkqC c012 }
51Testing软件测试网(^^%lp} s5u8V-e3|

5oDCak[Wgd0

C?*\ z0VF;I0  现在,每次需要比较字符串“ABC”与某个变量的时候,我们只要引用 A.S_CONSTANT_ABC 即可,而不必记住它本身是什么。对这个常量的修改也非常方便,改一个地方即可,而不必在全部代码中查找。51Testing软件测试网fz\T9RAW'a"X

51Testing软件测试网@NrLE

  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)。51Testing软件测试网U}(W{q

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

8eLwp4a$q6~0
1 public class BadCode {51Testing软件测试网B ki.Avq
2 public static void calculationWithPrint(){51Testing软件测试网E)Vz }N9S{t
3 double someValue = 0D;
(AQ&SAy'D:cvZ04 for (int i = 0; i < 10000; i++) {
[p4l:IKLS05 System.out.println(someValue = someValue + i);51Testing软件测试网$e&}'Ugm$A m4Y
6 }51Testing软件测试网l2C0}4U8e p
7 }51Testing软件测试网+Y1Lng2x-i
8 public static void calculationWithOutPrint(){51Testing软件测试网 N-vj}v$z
9
O1dM jOT010 double someValue = 0D;51Testing软件测试网[,tFM/W
11 for (int i = 0; i < 10000; i++) {51Testing软件测试网0D'yag$|4?"[
12 someValue = someValue + i;51Testing软件测试网hk~Z8xIM
13 }51Testing软件测试网l ncK$Tx
1451Testing软件测试网;smM'D9\WuX
15 }
s4[Mk3A%g~016 public static void main(String [] n) {
-Z;T:F:h\|017 BadCode.calculationWithPrint();
lZ9S N.ED7G(deL018 BadCode.calculationWithOutPrint();51Testing软件测试网o:b!{a/N
19 }51Testing软件测试网 d;}4_{ByAs
20 }
51Testing软件测试网S0Z%P0q2t,[ z-C;V

@Nue$s_0v)f051Testing软件测试网6jmD(A+]S

  下面表格可以看出,calculationWithOutPrint() 方法执行时间是0.001204 s. 作为对比,calculationWithPrint() 方法居然需要令人难以置信的10.52 s来执行!

VH p8hK#c1Fqn0

_ kp3~VJ0

  (若你想知道怎么做一个这样的表,请阅读另一篇文章"Java Profiling with WSAD")51Testing软件测试网4gnL"S[bo2d

  为了避免CPU浪费,最好的办法是引入一个包装的方法,如下:51Testing软件测试网#b1qg&@Wr

8d@g t:|3O0
1 public class BadCode {51Testing软件测试网B&XUK*H _#@1[|
2
*Z` r3WoL _03         public static final int DEBUG_MODE = 1;51Testing软件测试网 J'DSY:Tqg^
4         public static final int PRODUCTION_MODE = 2;
K%X4rVX3g5g05
k8n#q x&cwZE06     public static void calculationWithPrint(int logMode){51Testing软件测试网Yjqh`7y!`?.b%d
7         double someValue = 0D;
(e:{5_M0o8Ss2G7H08         for (int i = 0; i < 10000; i++) {51Testing软件测试网5rfj X+KF
9             someValue = someValue + i;51Testing软件测试网M sg6ux
10             myPrintMethod(logMode, someValue);
/`K q{c9@+RWj011         }
hSlRgf)v}012     }
[iA0[Y n[,_013
(t+kD4P5R0J ~x#} f014     public static void myPrintMethod(int logMode, double value) {51Testing软件测试网1AV!be2s;h
15         if (logMode > BadCode.DEBUG_MODE) {    return; }
y0ta5]5r^OY016         System.out.println(value);51Testing软件测试网 ib~/]:Q.AI(unf0T G
17     }
5c@P:Q c NBD018     public static void main(String [] n) {
`@;o]$qB J019         BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);51Testing软件测试网Wt]E8z6Pwh
20         }
(e,Hcx8S021 }
51Testing软件测试网.ZVgL~"eCW

51Testing软件测试网0P0rnD;Ce6]SW+M

  字符串(String)连接是另一种CPU浪费方式,看下面的例子:51Testing软件测试网c4aRwmgCWJy?5M@

51Testing软件测试网V7D;}8@Zjk'F}

1 public static void concatenateStrings(String startingString) {51Testing软件测试网(op!Z2c,l5RRSp"|iD*^+^
2 for (int i = 0; i < 20; i++) {
-so(z|PAr6`03 startingString = startingString + startingString;51Testing软件测试网(loX Z^*x!L7d
4 }
| f)nW8\05 }
lHOx O/@0651Testing软件测试网X"~a^;ywH c.G
7 public static void concatenateStringsUsingStringBuffer(
@ff!B1_^08 String startingString) {51Testing软件测试网hO2h?4B
9 StringBuffer sb = new StringBuffer();51Testing软件测试网:A2E2DSv
10 sb.append(startingString);51Testing软件测试网~'z:\z,};{
11 for (int i = 0; i < 20; i++) {51Testing软件测试网3o!l[#dv2w @Q
12 sb.append(sb.toString());51Testing软件测试网tyBRTY4?,`$w-C
13 }
3Ypc%m1O'd B\014 }

c Gj*e'Ir051Testing软件测试网6Wk;STG(z+n0|


TAG:

 

评分:0

我来说两句

Open Toolbar