- Java高級程序設計實戰教程
- 戴遠泉 李超 秦爭艷
- 1069字
- 2019-10-23 17:28:10
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 }
- 一步一步學Spring Boot 2:微服務項目實戰
- 案例式C語言程序設計
- Mastering OpenCV Android Application Programming
- 控糖控脂健康餐
- 程序員數學:用Python學透線性代數和微積分
- AIRAndroid應用開發實戰
- Production Ready OpenStack:Recipes for Successful Environments
- JavaScript by Example
- Hands-On Full Stack Development with Go
- 軟件品質之完美管理:實戰經典
- Python Data Structures and Algorithms
- 區塊鏈技術與應用
- Getting Started with Nano Server
- 安卓工程師教你玩轉Android
- Java編程指南:語法基礎、面向對象、函數式編程與項目實戰