1. 程式人生 > >阿里巴巴開發手冊解析個人筆記(七)流程控制

阿里巴巴開發手冊解析個人筆記(七)流程控制

註釋規範為純記憶,不再說明

1. 【強制】在一個 switch 塊內,每個 case 要麼通過 break/return 等來終止,要麼註釋說明程
序將繼續執行到哪一個 case 為止; 在一個 switch 塊內,都必須包含一個 default 語句並且
放在最後,即使空程式碼。

例項程式

public class MainTest {
	public static void main(String[] args) {
		switch (1) {
		case 1:
			System.out.println("你好");
		case 2:
			System.out.println(" 我是");
		case 3:
			System.out.println(" switch");
		case 4:
			System.out.println(" 程式的");
		default:
			System.out.println("小例子");
		}
	}
}

這個很容易想明白,因為case沒碰到break會執行下去,而沒有defult流程會不完成。

2. 【強制】在 if/else/for/while/do 語句中必須使用大括號。 即使只有一行程式碼,避免採用
單行的編碼方式: if (condition) statements;

例項程式


public class MainTest {
	public static void main(String[] args) {
		int i=2;
		while (i==2) 
			i=1;
			if ( i==1){
				i=2;
			}
	}
}

以為是死迴圈,結果執行一次結束。

3. 【強制】在高併發場景中,避免使用”等於”判斷作為中斷或退出的條件。
解析:
解析來自:https://blog.csdn.net/zxm1306192988/article/details/59701101
例項程式

package ClassFiveDotFive;

/*
 * 一、用於解決多執行緒安全問題的方式:
 * synchronized:隱式鎖
 * 1、同步程式碼塊
 * 2、同步方法
 * jdk 1.5後
 * 3、同步鎖 Lock  
 * 注意:是一個顯式鎖,通過lock()方式上鎖,必須通過unlock()方法釋放鎖
 */
public class TestLock {
	public static void main(String[] args) {
		Ticket ticket = new Ticket();
		new Thread(ticket, "1號視窗").start();
		new Thread(ticket, "2號視窗").start();
		new Thread(ticket, "3號視窗").start();
	}
}

class Ticket implements Runnable {
	private int tick = 100000;

	@Override
	public void run() {
		while (true) {
			--tick;
			System.out.println(Thread.currentThread().getName() + "剩餘票數:" + tick);
			if (tick == 0) {
				break;
			}

		}
	}

}

併發異常的一個例子

2號視窗剩餘票數:25
2號視窗剩餘票數:0
1號視窗剩餘票數:1
3號視窗剩餘票數:15
4. 【推薦】 表達異常的分支時, 少用 if-else 方式, 這種方式可以改寫成:
if (condition) {
...
return obj;
}
// 接著寫 else 的業務邏輯程式碼;
說明: 如果非得使用 if()...else if()...else...方式表達邏輯,【強制】 避免後續程式碼維
護困難, 請勿超過 3 層。
正例: 超過 3 層的 if-else 的邏輯判斷程式碼可以使用衛語句、策略模式、狀態模式等來實現,
其中衛語句示例如下:
public void today() {
		if (isBusy()) {
			System.out.println("change time.");
			return;
		}
		if (isFree()) {
			System.out.println("go to travel.");
			return;
		}
		System.out.println("stay at home to learn Alibaba Java Coding Guidelines.");
		return;
	}

解析

多餘三個表示式會導致業務理解維護困難

下一個

5. 【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將
複雜邏輯判斷的結果賦值給一個有意義的布林變數名,以提高可讀性。
說明: 很多 if 語句內的邏輯相當複雜,閱讀者需要分析條件表示式的最終結果,才能明確什麼
樣的條件執行什麼樣的語句,那麼,如果閱讀者分析邏輯表示式錯誤呢?
正例:
// 虛擬碼如下
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
反例:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
...
}

解析

多於兩個條件,我覺的即可使用
6. 【推薦】迴圈體中的語句要考量效能,以下操作儘量移至迴圈體外處理,如定義物件、變數、
獲取資料庫連線,進行不必要的 try-catch 操作(這個 try-catch 是否可以移至迴圈體外)。

解析:
trycatch 會增加位元組碼的執行量,減弱效能。

下一個

7. 【推薦】避免採用取反邏輯運算子。
說明: 取反邏輯不利於快速理解,並且取反邏輯寫法必然存在對應的正向邏輯寫法。
正例: 使用 if (x < 628) 來表達 x 小於 628。
反例: 使用 if (!(x >= 628)) 來表達 x 小於 628。

解析:不用了

下一個

8. 【推薦】介面入參保護,這種場景常見的是用作批量操作的介面。
9. 【參考】 下列情形,需要進行引數校驗:
1) 呼叫頻次低的方法。
2) 執行時間開銷很大的方法。 此情形中, 引數校驗時間幾乎可以忽略不計,但如果因為參
數錯誤導致中間執行回退,或者錯誤,那得不償失。
3) 需要極高穩定性和可用性的方法。
4) 對外提供的開放介面,不管是 RPC/API/HTTP 介面。
5) 敏感許可權入口。
10.【參考】 下列情形, 不需要進行引數校驗:
1) 極有可能被迴圈呼叫的方法。但在方法說明裡必須註明外部引數檢查要求。
2) 底層呼叫頻度比較高的方法。畢竟是像純淨水過濾的最後一道,引數錯誤不太可能到底
層才會暴露問題。一般 DAO 層與 Service 層都在同一個應用中,部署在同一臺伺服器中,所
以 DAO 的引數校驗,可以省略。
3) 被宣告成 private 只會被自己程式碼所呼叫的方法,如果能夠確定呼叫方法的程式碼傳入參
數已經做過檢查或者肯定不會有問題,此時可以不校驗引數。

解析

controller層做程式碼校驗,service和dao層不需要,除非執行開銷比較打