Java高级程序设计实战教程
上QQ阅读APP看书,第一时间看更新

1.4 拓展知识

相对于之前所提到的一些基本的编程需要注意的惯例,其他惯例(Miscellaneous Practices)也是非常重要的,下面就列出相对应的惯例。

1. 每次保存的时候,都让你的代码是最美的

使用Ctrl+Shift+F快捷键优化代码的格式和结构,调整代码。

2. 使用log而不是System.out.println()

log可以设定级别,可以控制输出到哪里,容易区分是在代码的什么地方打印的,而System.out.print则不行。而且,System.out.print的速度很慢。所以,除非是有意的,否则都要用log。至少在提交到svn之前把System.out.print换成log。

3. 每个if while for等语句,都不要省略大括号{}

if (a>b) { 
    a++; 
} 

4. 善用TODO

在代码中加入//TODO:,大部分的ide都会帮你提示,让你知道你还有什么事没有做,比如:

if (order.isPaid()) { 
   //TODO: 更新订单 
   
} 

5. 在需要留空的地方放一个空语句或注释

比如:

if (!exists(order)) { 
   ; 
} 

或:

if (!exists(order)) { 
     //nothing to do 
} 

6. 不要再对boolean值做true、false判断

比如:

if (order.isPaid() == true) { 
   // Do something here 
} 

不如写成:

if (order.isPaid()) { 
//Do something here 
} 

这样相对来说提高了代码的理解程度,更方便了其他人员阅读理解。

7. 减少代码嵌套层次

代码嵌套层次达3层以上时,一般人理解起来都会困难。下面的代码是一个简单的例子。

public void demo(int a, int b, int c) { 
        if (a > b) { 
            if (b > c) { 
                doJobA(); 
            } else if (b < c) { 
                doJobB(); 
            } 
        } else { 
            if (b > c) { 
                if (a < c) { 
                    doJobC(); 
                } 
            } 
        } 
    } 

减少嵌套的方法有很多,例如下面几个:

• 合并条件;

• 利用return以省略后面的else;

• 利用子方法。

比如上例,合并条件后成为

public void demo(int a, int b, int c) { 
        if (a > b && b > c) { 
            doJobA(); 
        } 
        if (a > b && c > b) { 
            doJobB(); 
        } 
        if (a <= b && c < b && a < c) { 
            doJobC(); 
        } 
    } 

如果利用return则成为

public void demo(int a, int b, int c) { 
        if (a > b) { 
            if (b > c) { 
                doJobA(); 
                return; 
            } 
            doJobB(); 
            return; 
        } 
        if (b > c) { 
            if (a < c) { 
                doJobC(); 
            } 
        } 
    } 

利用子方法,就是将嵌套的程序提取出来放到另外的方法里。

8. 程序职责单一

关注点分离是软件开发的真理。人类之所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。

9. 变量的声明、初始化和被使用尽量放到一起

比方说如下代码:

int orderNum= getOrderNum(); 
//do something withou orderNum here 
call(orderNum); 

上例中的注释处代表了一段和orderNum不相关的代码。orderNum的声明和初始化与被使用的地方相隔了其他的代码,这样做不好,不如这样:

//do something withou orderNum here
int orderNum= getOrderNum(); 
call(orderNum);

10. 缩小变量的作用域

能用局部变量的,不要使用实例变量;能用实例变量的,不要使用类变量。变量的生存期越短,它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。比如如下代码:

public class OrderPayAction { 
    private Order order; 
    public void doAction() { 
        order = orderDao.findOrder(); 
        doJob1(); 
        doJob2(); 
    } 
    private void doJob1() { 
        doSomething(order); 
    } 
    private void doJob2() { 
        doOtherThing(order); 
    } 
} 

上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:

public class OrderPayAction { 
    public void doAction() { 
        order = orderDao.findOrder();
        doJob1(order); 
        doJob2(order); 
    } 
    private void doJob1(Order order) { 
        doSomething(order); 
    } 
    private void doJob2(Order order) { 
        doOtherThing(order); 
    } 
} 

11. 尽量不要用参数来带回方法运算结果

比如:

public void calculate(Order order) { 
        int result = 0; 
        // do lots of computing and store it in the result 
        order.setResult(result); 
    } 
    public void action() { 
        order = orderDao.findOrder(); 
        calculate(order); 
        // do lots of things about order 
    } 

例子中calculate方法通过传入的order对象来存储结果,不如用如下方式写:

public int calculate(Order order) { 
        int result = 0; 
        // do lots of computing and store it in the result 
        return result; 
    } 
    public void action() { 
        order = orderDao.findOrder(); 
        order.setResult(calculate(order)); 
        // do lots of things about order 
    }