分類
Coding Principle

撰寫變數的原則(Variable Principle)

分別從 Code Complete2 , Clean Code , The art of readable code 中擷取命名,變數的部份重點。
 
The art of readable code
1.更具體的描述(考慮名詞使用什麼,動詞使用如何來修飾)。
2.更合適的同義詞。
3.更多的意義(加入單位以及特殊意義)。
4.移除不需要的部份。
5.使用 Min and Max 代表極值。
6.使用 First and Last 代表包含值。
7.使用 Begin and End 代表包頭去尾。
8.boolean 可以使用 is , has , should , can 來修飾。
9.依照情況選擇 getXXX() , countXXX() , computeXXX()。


 
 
Code Complete2
1.盡量保持8~20字元長度。
2.問題導向,表示什麼(what)而不是如何。
3.關於計算的限定詞放到句尾,e.g. Sum , Total , Average , Max , Min。
4.小心魔術數字,可排除0和1。
5.小心除零錯誤(分母為零)
6.小心不同類型的轉換
7.小心編譯器的警告
8.狀態變數的命名,不要使用state , flag 等等看不出意義的字詞。
9.暫時變數的命名,不要使用temp , 除非真的作為temp使用。
10.布林變數的命名,常見的為 done , found , success , ok , error , 考慮使用更具體的名稱來取代以上命名。
11.列舉的命名格式,e.g.

public enum ErrorType{
DISCONNECT_ERROR , CONNECT_ERROR}

12.常數的命名,盡量不要加入具體數字。


 
Clean Code
1.名副其實(具體的描述變數與變數單位)
2.避免誤導(不要使用縮寫,不要加入型態)
3.有意義的區別(不要同時使用難以區別的名稱,不要加入不必要的字詞)
4.優先使用電腦領域術語
5.介面與實作
6.類別與方法
7.每種概念使用同一種字詞。


 
 
 

分類
Coding Principle

計算函式複雜度(by decision points – Tom McCabe)

使用 Tom McCabe 的 decision points(決策點)計算函式複雜度。
Step 1.從函式開頭以 1 開始計算。
Step 2.遇到if , while , repeat , for , and , or 類似關鍵字,加 1。
note : switch 每一個case 都要加1。
e.g.

    private void exampleCountDecisionPoints()
    {
        if((isProcess && isDone) || !isLimit) && numberLines > numberLinesLimit){
        }
    }

if +1
&& + 1
|| + 1
&& +1
total decision points = 5


 
複雜度對應原則表

0 ~ 5  -> 複雜度低可以接受
6 ~ 10 -> 複雜度中考慮簡化
10up    -> 複雜度高必須簡化

 
 

分類
Coding Principle

布林表達式(Boolean Expression)

布林表示式:
1.不要用數字(0,1)來表示布林邏輯,改用boolean。
2.使用隱式表達。e.g.

if(isDone == true) -> if(isDone)

3.可用解釋性布林變數(重構:引入解釋性變數)增加可讀性。
4.把複雜的表達式改為為布林函式(重構:分解條件式)。
5.盡量在if-else中把判斷條件轉為肯定並互換 if else的代碼。
6.使用狄摩根簡化否定的表達式。
邏輯互換表

not A and not B → not(A or B)
not A and B → not(A or not B)
A and not B → not(not A or B)
A and B → not(not A or not B)
not A or not B → not( A and B)
not A or B → not(A and not B)
A or not B → not(not A and B)
A or B → not(not A and not B)

 
 

分類
Coding Principle

撰寫迴圈的原則(loop principle)

Java 迴圈表達的方式共有 while,do-while,for,for-each。
以下列出撰寫迴圈需要注意的原則。
1.迴圈的種類可以分為以下幾種:

計次循環:循環次數固定。

連續求值循環:預先不知道循環次數,會在每次循環檢查中止條件。

無限循環:不會停止的循環。

迭代器循環:對容器每個元素進行操作。


 
2.通用性:

1.迴圈內使用的變數相關初始化動作盡量靠近迴圈前方。

2.使用while(true) or for(;;) 代表無限循環。

3.在適當的情況多使用for 迴圈,for好處在於所有的判斷條件都寫在頂端。

4.使用{}包括循環體。

5.避免空循環。

6.把控制循環操作(i++)放在循環的開始或是循環的結束而不是放在中間。

7.避免依賴循環結束後再對循環下標取值的動作。

8.對於容易出錯的迴圈考慮使用安全計數器。

9.了解continue用途。

10.小心巢狀區塊中break的退出範圍。

11.小心有很多break的循環。

12.不要使用浮點數來代表循環變量。

13.在巢狀循環使用有意義的下標名取代i e.g. i → xxxIndex

14.迴圈深度不要超過2層。


 
2.while迴圈:

1.只知道中止條件但預先不知道循環要多少次結束就使用while迴圈。

2.while迴圈依照中止條件可分為3種。

1.在開頭檢查中止條件為while迴圈,e.g.

while(condition){
//do action
}

2.在結尾檢查中止條件為do-while迴圈,e.g.

do{
//do action
}
while(condition)

3.在中間檢查結束條件為while迴圈但中止條件在中間,使用中間檢查結束條件注意兩點,

1.檢查條件集中同一個位置。

2.考慮使用註解說明退出條件。e.g.

while(true){
    //do action
    if(condition){
        break;
    }
    //do action
}

3.while迴圈適合複雜的情況。


 
3.for迴圈:

1.如果需要次數固定的循環就使用for迴圈。

2.如果在迴圈中必須存在結束條件就盡量改用while迴圈。

3.不要在for迴圈中修改下標值使其終止,如果需要修改下標值,改用while。

4.for迴圈適合簡單的情況。


4. for-each迴圈:

1.適合用於數組或容器的各項元素操作。

2.優點為消除循環控制索引出錯的可能性。


 
 

分類
Coding Principle

撰寫條件式的原則(condition principle)

Java 條件式主要有 if-else 以及 switch 2種,撰寫條件式有一些原則可以參考。
 
1.通用性原則:

    1.條件式的判斷邏輯順序可以依照 “正常流程 or 重要性 > 執行頻率 > 字母或數字順序” 來排列。

e.g. 判斷英文字母或是數字,因為2者都是屬於正常流程,重要性也相同,但英文字母的執行頻率比數字高,

因此應該把英文字母的判斷放在上方。

private void isNumberOrLetter(char source)
{
        if (source == 'a' || source == 'b' || source == 'c' ...) {
        } else if (source == '1' || source == '2' ...) {
        }
}

    2.switch用於簡單的條件判斷,if-else用於複雜的條件判斷。

    3.若執行區塊的複雜度高,可以使用 “重構:提取函式” 來提取複雜度高的區塊。

    4.if-then-else 最後一個 else 和 switch 的 default 必須注意不包含的條件,可以使用 assert 或 throw new illegalArgumentException 來處理。

    5.為了提高可讀性,判斷邏輯的寫法可以依照數軸來寫。e.g.

    判斷 i 是否在 min 和 max之間 → min <= i && i <= max

if(0 <= i && i <= 10)

判斷 i是否在 min 和 max 之外 → i < min or i > max

if(i < 0 || i >10)

判斷 i 應該小於或大於某個值 → i < min  or  i > max 。 ref to: The art of readable code

if(i < 0)
if(i > 10)

 


2. If-else:

    1.不要寫空的if,可以反轉if判斷條件並把原本對應else的動作放到if中。e.g.

if(condition){
}else{
//do else action
}

改為

if(!condition){
//do else action
}

    2.判斷條件多且複雜時,可使用 “重構分解條件式”。e.g.

if(color == green && color == red){
}else if(color == red && color == black){
}else if(color == black && color == green){
}

改為

if(isGreenAndRed(color)){
}else if(isRedAndBlack(color)){
}else if(isBlackAndGreen(color)){
}

    3.分解巢狀條件式,可以使用 “重構-以衛述句取代巢狀條件式” 。


3. Switch:
    1.不要摻雜多個case,每個case都應該使用break跳出。