`
javasee
  • 浏览: 927200 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java开发者的十大戒律

阅读更多

有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。

  一、为代码加注释。 虽然每个人都知道这点,但有时却不自觉忘了履行,今天你“忘了”加注释了吗?虽然注释对 程序的功能没什么“贡献”,但过一段时间,比如说两星期之后或者更长,回过头来看看自己的代码,说不定已经记不住它是干什么的了。如果这些代码是你个人 的,那还算是走运了,不幸的是,当然了,大多数时候都是别人的不幸,很多时候大家都是在为公司写代码,写代码的人也许早已经离开了公司,但别忘了一句古 话,有来有往嘛,为他人,也为我们自己,请为你的代码加上注释。

  二、不要让事情复杂化。 程序员有时候总是对简单问题想出复杂的解决方案,比如说,在只有五个用户的程序中引 入EJB、对程序实现了并不需要的框架(framework),之类的还有属性文件、面向对象解决方案、多线程等等。为什么要这样做呢?也许我们并不知道 是否这样会更好,但这样做也许可以学到一些新东西,或者让自己更感兴趣一些。如果是不知道为什么这样做,建议多请教经验丰富的程序员,如果是为了个人的目 的,麻烦让自己更专业一点。

  三、始终牢记——“少即是好(Less is more)并不总是对的”。 代码效率虽然很重要,但在许多解 决方案中,编写更少的代码并不能改善这些代码的效率,请看下面这个简单的例子:


  1. if (newStatusCode.equals( "SD" ) && (sellOffDate ==  null  ||   
  2.         todayDate.compareTo(sellOffDate)<0  || (lastUsedDate !=  null  &&   
  3.         todayDate.compareTo(lastUsedDate)>0 )) ||   
  4.         (newStatusCode.equals("OBS" ) && (OBSDate ==  null  ||   
  5.         todayDate.compareTo(OBSDate)<0 ))){   
  6.         newStatusCode = "NYP" ;   
  7.     }  
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))){ 
		newStatusCode = "NYP"; 
	}

   能看明白if条件语句是干什么的吗?能想出来是谁写的这段代码吗?如果把它分成两段独立的if语句,是不是更容易理解呢,下面是修改后的代 码:


  1. if (newStatusCode.equals( "SD" ) && (sellOffDate ==  null  ||   
  2.     todayDate.compareTo(sellOffDate)<0  || (lastUsedDate !=  null  &&   
  3.     todayDate.compareTo(lastUsedDate)>0 ))){   
  4.         newStatusCode = "NYP" ;   
  5. }  
  6. else   if (newStatusCode.equals( "OBS" ) && (OBSDate ==  null  ||   
  7.         todayDate.compareTo(OBSDate)<0 )) {   
  8.     newStatusCode = "NYP" ;   
  9. }  
	if(newStatusCode.equals("SD") && (sellOffDate == null || 
		todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null && 
		todayDate.compareTo(lastUsedDate)>0))){ 
			newStatusCode = "NYP"; 
	}
	else if(newStatusCode.equals("OBS") && (OBSDate == null || 
			todayDate.compareTo(OBSDate)<0)) { 
		newStatusCode = "NYP"; 
	}

   是不是读起来容易多了呢,在此只是多加了一个if和两个花括号,但代码的可读性与可理解性就一下子提高了一大截。

  四、请不要硬编码。 开发者经常有意“忘记”或忽略掉这点,因为有些时候开发日程逼得实在太紧。其实,多写一 行定义静态变量的代码能花多少时间呢?


  1. public   class  A {   
  2.   public   static   final  String S_CONSTANT_ABC =  "ABC" ;   
  3.   public   boolean  methodA(String sParam1){   
  4.       if  (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){   
  5.            return   true ;   
  6.       }   
  7.       return   false ;   
  8.   }   
  9. }  
public class A { 
  public static final String S_CONSTANT_ABC = "ABC"; 
  public boolean methodA(String sParam1){ 
      if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){ 
           return true; 
      } 
      return false; 
  } 
}

   现在,每次需要将“ABC”与其他变量进行比较时,不必记住实际代码,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要进行 修改时,也可在一处修改,不会翻遍整个源代码逐个修改了。

  五、不要“创造”自己的框架(framework)。 确切来说,有数以千计的各种框架存在,而且大多数是开 源的,这些框架都是优秀的解决方案,可用于日常程序开发中,我们只需使用这些框架的最新版本就行了,至少表面上要跟上形势吧。被大家广为接受的最为明显的 一个例子就是Struts了,这个开源web框架非常适合用在基于web的应用程序中。是不是想开发出自己的Struts呢,还是省点力气吧,回头看看第 二条——不要让事情复杂化。另外,如果正在开发的程序只有3个窗口,就不要使用Struts了,对这种程序来说,不需要那么多的“控制”。

  六、不要使用println及字符串连接。 通常为了调试方便,开发者喜欢在可能的所有地方都加上 System.out.println,也许还会提醒自己回过头来再来删除,但有些时候,经常会忘了删除或者不愿意删除它们。既然使用 System.out.println是为了测试,那么测试完之后,为什么还要留着它们呢,因为在删除时,很可能会删除掉真正有用的代码,所以不能低估 System.out.println危害啊,请看下面的代码:

 


  1. public   class  BadCode {   
  2.     public   static   void  calculationWithPrint(){   
  3.         double  someValue = 0D;   
  4.         for  ( int  i =  0 ; i <  10000 ; i++) {   
  5.             System.out.println(someValue = someValue + i);   
  6.       }   
  7.     }   
  8.     public   static   void  calculationWithOutPrint(){   
  9.         double  someValue = 0D;   
  10.         for  ( int  i =  0 ; i <  10000 ; i++) {   
  11.             someValue = someValue + i;   
  12.       }   
  13.     }   
  14.     public   static   void  main(String [] n) {   
  15.         BadCode.calculationWithPrint();   
  16.         BadCode.calculationWithOutPrint();   
  17.     }   
  18. }  
	public class BadCode { 
		public static void calculationWithPrint(){ 
			double someValue = 0D; 
			for (int i = 0; i < 10000; i++) { 
				System.out.println(someValue = someValue + i); 
		  } 
		} 
		public static void calculationWithOutPrint(){ 
			double someValue = 0D; 
			for (int i = 0; i < 10000; i++) { 
				someValue = someValue + i; 
		  } 
		} 
		public static void main(String [] n) { 
			BadCode.calculationWithPrint(); 
			BadCode.calculationWithOutPrint(); 
		} 
	}

 

  从测试中可以发现,方法calculationWithOutPrint()执行用了0.001204秒,作为对比,方法 calculationWithPrint()执行可是用了10.52秒。

  要避免浪费CPU时间,最好的方法是引入像如下的包装方法:

 


  1. public   class  BadCode {  
  2.     public   static   final   int  DEBUG_MODE =  1 ;  
  3.     public   static   final   int  PRODUCTION_MODE =  2 ;  
  4.   
  5.     public   static   void  calculationWithPrint( int  logMode){   
  6.         double  someValue = 0D;   
  7.         for  ( int  i =  0 ; i <  10000 ; i++) {   
  8.             someValue = someValue + i;   
  9.             myPrintMethod(logMode, someValue);   
  10.       }  
  11.   } public   static   void  myPrintMethod( int  logMode,  double  value) {   
  12.     if  (logMode > BadCode.DEBUG_MODE) {  return ; }   
  13.         System.out.println(value);   
  14.   } public   static   void  main(String [] n) {   
  15.         BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);   
  16.   }  
  17. }  
public class BadCode {
	public static final int DEBUG_MODE = 1;
	public static final int PRODUCTION_MODE = 2;

	public static void calculationWithPrint(int logMode){ 
		double someValue = 0D; 
		for (int i = 0; i < 10000; i++) { 
			someValue = someValue + i; 
			myPrintMethod(logMode, someValue); 
	  }
  }	public static void myPrintMethod(int logMode, double value) { 
	if (logMode > BadCode.DEBUG_MODE) { return; } 
		System.out.println(value); 
  }	public static void main(String [] n) { 
		BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE); 
  }
}

 

  另外,字符串连接也是浪费CPU时间的一个大头,请看下面的示例代码:


  1. public   static   void  concatenateStrings(String startingString) {   
  2.     for  ( int  i =  0 ; i <  20 ; i++) {   
  3.         startingString = startingString + startingString;   
  4.     }   
  5. }   
  6.   
  7. public   static   void  concatenateStringsUsingStringBuffer(String startingString) {   
  8.     StringBuffer sb = new  StringBuffer();   
  9.     sb.append(startingString);   
  10.     for  ( int  i =  0 ; i <  20 ; i++) {   
  11.         sb.append(sb.toString());   
  12.     }   
  13. }  
	public static void concatenateStrings(String startingString) { 
		for (int i = 0; i < 20; i++) { 
			startingString = startingString + startingString; 
		} 
	} 
	
	public static void concatenateStringsUsingStringBuffer(String startingString) { 
		StringBuffer sb = new StringBuffer(); 
		sb.append(startingString); 
		for (int i = 0; i < 20; i++) { 
			sb.append(sb.toString()); 
		} 
	}

 

 

  在测试中可发现,使用StringBuffer的方法只用了0.01秒执行完毕,而使用连接的方法则用了0.08秒,选择显而易见了。

  七、多关注GUI(用户界面)。 再三强调,GUI对商业客户来说,与程序的功能及效率同等重要,GUI是一 个成功程序的最基本部分,而很多IT经理往往都没注意到GUI的重要性。在现实生活中,许多公司可能为了节省开支,没有雇用那些有着设计“用户友好”界面 丰富经验的网页设计者,此时Java开发者只能依赖他们自身的HTML基本功及在此领域有限的知识,结果,很多开发出来的程序都是“计算机友好”甚于“用 户友好”。很少有开发者同时精通软件开发及GUI设计,如果你在公司“不幸”被分配负责程序界面,就应该遵守下面三条原则:

  1、 不要再发明一次轮子,即不做无用功。现有的程序可能会有类似的界面需求。

  2、 先创建一个原型。这是非常重要一步,用户一般想看到他们将使用的东西,而且可以先利用这个原型征求用户的意见,再慢慢修改成用户想要的样子。

  3、 学会换位思考。换句话来说,就是从用户的角度来审查程序的需求。举例来讲,一个汇总的窗口可以跨页或者不跨页,作为一个软件开发者,可能会倾向于不跨页, 因为这样简单一些。但是,从用户的角度来看,可能不希望看到上百行数据都挤在同一页上。

  八、文档需求不放松。 每个商业需求都必须记录在案,这可能听上去像童话,似乎在现实生活中很难实现。而我们 要做的是,不管开发时间多紧迫,不管最终期限多临近,对每个商业需求都必须记录在案。

  九、单元测试、单元测试、单元测试。 关于什么是单元测试的最好方法,在此不便细说,只是强调,单元测试一定 要完成,这也是编程中最基本的原则。当然了,如果有人帮你做单元测试自然是最好,如果没有,就自己来做吧,当创建一个单元测试计划时,请遵守以下三条最基 本的原则:

  1、 先于编写类代码之前编写单元测试。

  2、 记录单元测试中的代码注释。

  3、 测试所有执行关键功能的公有方法,这里不是指set和get方法,除非它们是以自己独特方式执行set和get方法。

  十、质量,而不是数量。 有些时候因为产品问题、期限紧迫、或一些预料之外的事情,导致常常不能按时下班,但 一般而言,公司不会因为雇员经常加班而对之表扬和奖励,公司只看重高质量的工作。如果遵守了前九条原则,你会发现自己写出的代码bug少且可维护性高,无 形中质量提高了一大步。

3
5
分享到:
评论
2 楼 chenquaner 2011-01-14  
第六条,我是常犯。不是常犯,是根本不改。
1 楼 eriol 2011-01-10  
记住第六条了

相关推荐

Global site tag (gtag.js) - Google Analytics