Java程序员十戒-1

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

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

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

$g4z+R^z*MkUS2e051Testing软件测试网;q `&Wn fs

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

]R qq*]AT$v051Testing软件测试网0WU+OT\^

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

`5q"ki4l z1f3i051Testing软件测试网6xy/I*z F|5{

if(newStatusCode.equals("SD") && (sellOffDate == null ||
/V9C N_(k3k;f"Vn0todayDate.compareTo(sellOffDate)<0 ||51Testing软件测试网$s+f.t~d`b
(lastUsedDate != null && todayDate.compareTo(lastUsedDate)>0))
&_@0_:ki0||(newStatusCode.equals("OBS") && (OBSDate == null ||51Testing软件测试网pZklE(x
todayDate.compareTo(OBSDate)<0))){
z?$?d#txU0        newStatusCode = "NYP";
;E$BZ^V0o0}
51Testing软件测试网'HE:{ qmj c2h

]f-r)i,yF;}051Testing软件测试网$k!\tSveO-b9R

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

X{A5FV4]I051Testing软件测试网hB$Jr WKS Y

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

Yi.a{.g1k&l Q as)E0

6vq$`/m-J$h |051Testing软件测试网&t4Ro pc0N

1 if(newStatusCode.equals("SD") && (sellOffDate == null ||
)zLQxD?N1?02 todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
,h/G7MR1d-Rt'i03 todayDate.compareTo(lastUsedDate)>0))){51Testing软件测试网 T4p?7|4b!C V]
4 newStatusCode = "NYP";
n`$D}9Q05 }else
TSpvN l06 if(newStatusCode.equals("OBS") && (OBSDate == null ||51Testing软件测试网z*m`;qKRJ4L
7 todayDate.compareTo(OBSDate)<0))
/_ Y7w(}*G.S%l F^3~c08 {
I \%DTZOeW09 newStatusCode = "NYP";
I,au'NnO9|010 }

"X6s|&NA0

z9J'z G4Co;j B&p0

8di7c5M |z,h0  这样可读性不是更好吗?的确,我们写了重复语句;的确,我们多写了一个if和2个大括号;但是代码确实更加易读、更加容易理解了!51Testing软件测试网-N)o oq%l a

@&EGU,A n1D+f;r2e Wf0  4、不要“硬编码"(No hard coding please)。– 由于时间紧迫,开发者总是会忘记或故意忽略这一条。然而另一种可能是,遵循这条戒律,我们就不会陷入“时间紧迫”的困境。定义一个static final 变量,增加一行代码,又能花多长时间呢?譬如:51Testing软件测试网6T;e\bl,f'r

51Testing软件测试网 y:G_)A/Z8v

51Testing软件测试网8E'{!`{0Lank`

1 public class A {51Testing软件测试网gT!].j.A0[d
2
5Yr?\X/h4YH:k03         public static final String S_CONSTANT_ABC = "ABC";
u*B+J0^3c0451Testing软件测试网7~^n Y?3\
5         public boolean methodA(String sParam1){51Testing软件测试网C G1~ S"N
651Testing软件测试网.od}"_?!R@$?(n
7             if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
d,B-jPz08                 return true;
'w4^6WM Q H A09             }51Testing软件测试网jO,GWJ G)}7Nl2NF
10             return false;51Testing软件测试网a#u1kCeb{"K'Z
11         }
$`+Jv+LT+SG5q012 }
51Testing软件测试网:RJB&tO0Sg0F

*a??dyAue;R0

Y)Y't}WY2Xb G0  现在,每次需要比较字符串“ABC”与某个变量的时候,我们只要引用 A.S_CONSTANT_ABC 即可,而不必记住它本身是什么。对这个常量的修改也非常方便,改一个地方即可,而不必在全部代码中查找。

)^yn t@^ Aka(A0

1C v8vWo3L*]k:m(j0  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软件测试网$ecb;E!Y4t O^v.Q

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

51Testing软件测试网 EJ'^Q~ y

1 public class BadCode {
&UQrS#R:_02 public static void calculationWithPrint(){
'[$}/nR#V03 double someValue = 0D;
;Jt~ M1E4UL^04 for (int i = 0; i < 10000; i++) {
*B:h!U&g5QF'F0t6D#d05 System.out.println(someValue = someValue + i);
7\7`%_[^ s J#_06 }
`m_ yb sz1D07 }
f$a-{~$fnAv$c08 public static void calculationWithOutPrint(){
^sk5L ri L$T0951Testing软件测试网.[:FHb!wB
10 double someValue = 0D;
`[E!EH0ZjB%y!T011 for (int i = 0; i < 10000; i++) {
0M'N-c J6R&q"d012 someValue = someValue + i;51Testing软件测试网(o-`I#l/J'Q+D9@
13 }
k0n-Vi{2g014
.gs6s#OQA9c1~015 }51Testing软件测试网1_ RP3m:Q:s
16 public static void main(String [] n) {51Testing软件测试网"G+U S$e1I[ |
17 BadCode.calculationWithPrint();51Testing软件测试网earR$d,ZQ G{P
18 BadCode.calculationWithOutPrint();51Testing软件测试网Q7B:ogR
19 }
+osE;dxEn020 }

0X{,HF*IT}EVEL0

` [ ` p U O051Testing软件测试网0i-s D%@)t+D;U&St

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

0H\!Po0Qfk0

f9d!}fV F0

  (若你想知道怎么做一个这样的表,请阅读另一篇文章"Java Profiling with WSAD")51Testing软件测试网4|6|la` ~W'J

  为了避免CPU浪费,最好的办法是引入一个包装的方法,如下:51Testing软件测试网2L$E+cV%F&PS!g

G!vPc|+[+D[!ZY0
1 public class BadCode {
,xI e8ss)ON0251Testing软件测试网v1x"ZV ~ ?
3         public static final int DEBUG_MODE = 1;
[3YFCYO.|04         public static final int PRODUCTION_MODE = 2;
`5g-\U-p3y/K0551Testing软件测试网2L4|D} y
6     public static void calculationWithPrint(int logMode){51Testing软件测试网/}$TP&B7k_q#u#S
7         double someValue = 0D;
fI2k cmA @ g08         for (int i = 0; i < 10000; i++) {51Testing软件测试网/L;Xf$h*Z/s!@
9             someValue = someValue + i;51Testing软件测试网\'?"Ux;Bf,|.Q
10             myPrintMethod(logMode, someValue);51Testing软件测试网'v0u~3d{|)B"H
11         }51Testing软件测试网 yW8X1^,gS%A4f
12     }51Testing软件测试网g_ I g:_
1351Testing软件测试网)O*c]0{:|Q'Hug
14     public static void myPrintMethod(int logMode, double value) {
:C$LqN[sRS015         if (logMode > BadCode.DEBUG_MODE) {    return; }
)T ZCA6N@/\i|016         System.out.println(value);
&e\$c)C gM-@/wPb017     }
*W,aX(VA FW \]018     public static void main(String [] n) {51Testing软件测试网o7s%l {/`-^vW9\h Xf
19         BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
+gLnKK4j [020         }51Testing软件测试网:AF!hK.g&`*R$O
21 }
51Testing软件测试网)EJ+MM])M/m

rIt1OK9ccWs0

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

K6|"RUj4I,lUV0

m#[ L8ZNAQ0
1 public static void concatenateStrings(String startingString) {51Testing软件测试网/zF+L)jf)A
2 for (int i = 0; i < 20; i++) {
J[3H8[*k{.u/]03 startingString = startingString + startingString;
!FoF%B~3d2Z:p4Z@04 }51Testing软件测试网;VszXVj8g
5 }51Testing软件测试网bG\8?E-F
651Testing软件测试网FG'aC/sI
7 public static void concatenateStringsUsingStringBuffer(
.y"W+z9j ab{08 String startingString) {51Testing软件测试网J;C,Y9Qo@0^ u5[)z0Z Mk
9 StringBuffer sb = new StringBuffer();
6xB!|]X%l+dxe_m010 sb.append(startingString);51Testing软件测试网vo Z8b+f8oNZ
11 for (int i = 0; i < 20; i++) {
x/IC6cw012 sb.append(sb.toString());
I+\Jbg0Bw!K013 }
pz SE l7}_%Yv4f014 }

p-HrW"Ek c051Testing软件测试网+mHM8H Nx,^K0k \


TAG:

 

评分:0

我来说两句

Open Toolbar