Java程序员有许多应遵循的守则或最佳实践方式。本文概述了每一个开发者最应该遵循的10条守则或戒律,若是不遵循它们,将会致使灾难性后果。html
1. 为代码添加注释(Add comments to your code). – 每一个人都知道这一点,但不是每一个人都会这么作。你有多少次“忘记”添加注释了?确实,注释不会为你的程序增长任何函数功能。可是,有多少次,看到2周前写的代码,你都记不起它是干什么的?你很幸运,那些未注释的代码是你本身写的,你脑海中还会有残存的印象。很是不幸,大多时候,代码是别人写的,而且那我的极可能已经离开公司了。有句谚语说的好:“有来有往,互惠互利”,所以程序员应该体谅彼此(还有你本身),给你的代码加上注释。java
2. 不要把简单事情复杂化(Do not complicate things). – 我曾经这么作过,我相信你也同样。开发者都倾向于采用复杂方式解决简单问题。咱们在一个只有5个用户的系统中引入EJB,为一个并不须要框架的应用实现一套框架,采用属性文件、采用面向对象解决方案、使用线程,而这些根本用不着。为何会这么作?一些人可能不知道有更好的解决方案,但另外一些人可能故意这样作来学习新知识,或仅仅是由于有趣。对那些不知道更好解决方案的人,要多听有经验程序员的建议。对于那些纯粹出于我的目的而将设计复杂化的人,我建议你要更加专业一点。程序员
3. 记住 - “越少越好”并不是老是如此(Keep in Mind – “Less is more” is not always better). – 高效率的代码是件好事,但不少状况下,并不是代码行数越少效率就越高。看下面这个“简单”的例子:web
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条件是什么有多困难?再设想一下,写这段代码的人并没遵循第1条 - 为代码添加注释。编程
把if条件分解成2个if语句不是更容易理解吗?如今让咱们看一下修改过的代码:ruby
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和2个大括号;可是代码确实更加易读、更加容易理解了!app
4. 不要“硬编码”(No hard coding please). – 因为时间紧迫,开发者老是会忘记或故意忽略这一条。然而另外一种多是,遵循这条戒律,咱们就不会陷入“时间紧迫”的困境。定义一个static final 变量,增长一行代码,又能花多长时间呢?譬如:框架
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 便可,而没必要记住它自己是什么。对这个常量的修改也很是方便,改一个地方便可,而没必要在所有代码中查找。函数
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)。单元测试
6. 对Print行或字符串说不(Say no to Print lines and String Concatenations). – 我知道为了调试方便,程序员喜欢处处用System.out.println ,而后对本身说过一会就删掉。但咱们经常忘记删掉这些行或不肯删掉,咱们用System.out.println 作测试,为何测完后还要去改代码?这极可能致使误删一行咱们须要的代码。不要低估System.out.println 的危害,看下面代码:
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 s. 做为对比,calculationWithPrint() 方法竟然须要使人难以置信的10.52 s来执行!
(若你想知道怎么作一个这样的表,请阅读另外一篇文章”Java Profiling with WSAD” Java Profiling with WSAD )
为了不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);
}
}
字符串(String)链接是另外一种CPU浪费方式,看下面的例子:
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 s 而使用String 链接须要0.08 s,选择哪一种应该很明显了。
7. 注意图形用户界面(Pay attention to the GUI). – 不管听上去多荒谬,但有一点我注意过屡次了:图形用户界面(GUI)对于商业用户而言与程序功能及执行效率同样重要。GUI对于应用程序的成功相当重要。 IT管理者(译注:这里应该是指程序开发方的IT management)经常忽略GUI的重要性,不少公司为了省钱而不雇佣Web设计人员,而这些设计人员有足够的经验来设计“用户友好”的应用软件。 Java程序员不得不依赖他们有限的HMTL知识。我见过很是多对“计算机友好”而非对“用户友好”的应用程序,同时精通软件开发和用户界面开发的开发者很是少见。 若是你是一位不幸被指派作界面开发的Java程序员,你要遵循下面3条规则:
8. 提早准备需求文档(Always Prepare Document Requirements). – 每项业务需求都记入文档。这在童话故事中可能实现,而现实中很难作到。不管时间多么紧迫,不管截止日期如何迫近,你必须确保业务需求被记录下来。(译注:这条明显悖于敏捷开发的观念,你们要独立思考,甄别是非)
9. 单元测试,单元测试,单元测试 (Unit-test. Unit-test. Unit-test). – 我不许备讨论如何单元测试的细节,我只是想说这必需要作。这是编程中最基本的规则了,尤为不能忽略。若是你同事能为你的代码建立一个测试计划,那就再好不过了;若是不能,那就要本身作。作单元测试计划时,遵循下面原则:
10. 记住:质量,而非数量(Remember – quality, not quantity). - 不要待的太晚(除非有必要)。我知道有时由于产品问题,截止期限或其余突发事件,不能按时下班。但经理不会由于你为通常问题待的太晚而感激或奖励你;他们会为有质量的工做而感激你。若是你遵循上面的列的原则,你就会写更健壮的、少bug的程序。这才是你最应该作的。
结论
本文中总结了Java程序员最应注意的10项守则。仅仅知道是不够的,还要遵循它们。但愿这些守则能让咱们作更加专业的程序员。
不是每一个人都能成为高手,可是不努力,就算有再高的天分,也白痴一个!