官术网_书友最值得收藏!

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 
    } 
主站蜘蛛池模板: 依安县| 鄯善县| 绥滨县| 济源市| 甘洛县| 合川市| 天镇县| 锦屏县| 十堰市| 太康县| 邵阳县| 蓝田县| 江山市| 宁乡县| 皮山县| 蛟河市| 吴旗县| 榆林市| 靖远县| 灵武市| 康保县| 都安| 黄骅市| 务川| 茂名市| 邵东县| 阜平县| 洱源县| 许昌县| 读书| 达州市| 三门县| 内黄县| 仙桃市| 南岸区| 泽库县| 珲春市| 南昌市| 奉贤区| 全南县| 仙居县|