Google Earth发现中国“晋”级核潜艇!
【IT168 专稿】对于一名Java开发者来说,有许多编程规范和最优方法需要学习。本文概括了是个最为基本的十大戒律,以供每位Java开发者学习和遵守,如果不遵守的话,就会出现一些灾难性的结果。
第一条:务必在代码中添加注释。
这是每个人都知道的,但是并不是每个人都能做到,有时总是忘了执行这条戒律。你自己扪心自问,有多少次“忘了”添加注释了?的确,注释并不能实现你程序的任何有用的功能。但是,当你回头看你两个星期前写的程序的时候,你却想不起来这些代码真正想实现什么功能。如果这些代码是你写的话,那么你还是非常幸运的。在这种情况下,你或许能回忆起来。不幸的是,在大多数情况下,这些代码并不是你亲自写的,并且写这些代码的人已经不再在你现在的公司。俗语说的好啊,“己所不欲,勿施于人”。所以,要替他人着想,也替你自己着想,记住:往你的代码里添加注释。
第二条:不要将事情复杂化。
我以前干过这种事情,并且我也可以很负责人的说,所有人肯定也干过这种事情。开发者倾向于简单问题复杂化,本来一个很简单的问题,却拿出了很复杂的解决方案。我们为只有五个用户的应用程序却引进了EJBs。我们还为一些不需要框架的应用程序实施了框架。另外,我们给应用程序添加配置文件,面向对象方案,和线程,其实,这些应用简单的应用程序根本不需要这些复杂的东西。细想这些问题,我觉得是由于一下原因造成的:我们中的一些人是由于不知道怎么做才是更好的解决方案,所以被迫使用这些复杂的方案,而另外一些人是故意用的,他们想学习一些新的技术,满足自己的兴趣。对于那些不知道怎么做才是更好的解决方案的人来说,我建议他们向更有经验的程序员请教。而对于我们中的那些故意把应用程序设计复杂化,以满足自己的个人兴趣的人,我建议你们要更有职业道德,更加专业。
第三条:“代码越少越好”并不是放任四海皆准的。
没错,代码更加有效率,是一件重要的事情,但是,在许多的情况下,编写行数少的代码并没有提高你代码的效率。下面我举个简单的例子:
判断这个"if"语句的执行是非常简单的。注意,看看是谁写的这些代码,他没有遵守第一条:务必在代码中添加注释。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"条件语句,但是代码更加易读和容易理解了。效率也没有差多少。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";
}
第四条:不要埋头coding,注意技巧。
开发者通常会忘记或者故意忽略这一条,因为我们通常时间很宝贵,抓紧时间,勤勤恳恳编写代码。但是,如果你遵守这条戒律的话,或许能从这种忙绿的情况下解脱出来。用一行定义一个静态常量能需要你多长时间?
举个例子:
现在你每次需要和一些变量比较"ABC"的时候,你可以引用A.S_CONSTANTpublic 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,而不是记住实际的代码。同时,它还是很容易修改这个常量,而不用在你的整个代码中一一修改。
第五条:不要发明自己的框架。
已经有上千种的框架,并且大部分都是开源的。这些框架已经是非常好的解决方案了,并且应经应用于上千种的应用程序。我们需要紧跟学习这些新的框架,至少不会犯大的错误。Struts就是一个使用广泛并且非常好的例子之一。对于基于web的应用程序来说,这个开源的框架是非常完美的。请不要拿出自己的Struts版,你的版本会很快消亡的。你应该牢记第二条:不要将事情复杂化。如果你的程序只有三个用户的话,请不要使用Struts,这种应用程序是不需要Struts的。
第六条:慎用Print语句和字符串。
我知道为了调试的需要,许多程序员喜欢添加到处添System.out.println语句。事先我们会告诉自己我们过一会把它删除掉。但是,我们常常忘了删除这些代码,或者我们不想删除这些代码。我们使用System.out.println去测试,这是好事,为什么我们还要去批评这件事情?因为我们有可能误删除我们真正需要的System.out.println语句。或许你是低估了System.out.println语句的危害性,看看下面的代码:
如下图所示,你会发现calculationWithOutPrint()方法运行花了0.001204秒,而calculationWithPrint()竟然用了10.52秒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();
}
}
避免浪费CPU时间的最后方法是引入一个测试方法,如下所示:
字符串是浪费cpu资源的另一原因。看看下面的例子: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);
}
}
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());
}
}
0
相关文章
