顯示具有 Clean Code 標籤的文章。 顯示所有文章
顯示具有 Clean Code 標籤的文章。 顯示所有文章

2014年4月2日 星期三

Clean Code - Class

類別的首要準則為簡短,

再來根據Java的慣例,

一開始通常是宣告公用靜態變數,

再來是私有靜態變數,

然後是私有實體變數,

接著為公用函式,

緊接私有函式,

盡量讓公用函式裡會呼叫到的私有函式,

2014年3月23日 星期日

Clean Code - Note

在程式中下註解是很常見的,

但在看完clean code後,

我開始思考註解的適當性及必要性,

有些書中提到的要點可以分享一下:

1.用code代替註解

書中有提到一個重要的觀念,

不要用註解拯救糟糕的code,

寧可重新改寫code,
 //to check the member's level is enough
 if(member.level <= office_premium && member.level > office_higher){
  
 }
 
 if(member.hasEnoughLevel()){
  
 }

第一個敘述看了註解之後,

或者你可以了解if中的判斷,

但採用第二種方式之後,

你便可以繼續往下閱讀並了解此段程式碼要做什麼事情。

2.不要留註解的程式碼

以前的code中很常看到這樣的方式,

有時候是為了測試,

有時候是流程或業務內容改變,

但也怕會忘記以前的寫法所以用註解的方式保存,

但現在都有版控的機制,

可以清楚記錄每次的改版,

所以,把註解的程式碼刪除,

避免久了造成不必要的誤會。

Clean Code - function

不論是維護或者是開發時,

常常會遇到幾十、幾百甚至是幾千行的function,

當然再一邊抱怨的同時,

也同時告誡自己不要創造出如此的怪物,

在clean code中有提到一些寫function的建議:

1.只做一件事

每一個function應該只有一個目標,

只要完成一個工作,

例如if、else、while,

也應該只包含一行呼叫function的敘述,

當把握這個原則後,

你的function內也不會有幾百幾千行的code。

2.使用具描述能力的名稱

如同命名原則一樣,

countOfItem()的function應該會比count()這樣的名稱容易理解,

在思考function名稱時,

以能讓別人一眼看到就知道其含意為原則。

3.不要傳遞旗標參數

不要讓你的function接收true/false這樣的參數,

除了代表你的function做了不只一件事外,

也會影響命名function的難度。

4.以物件傳遞代替一串參數

function接收的參數盡量越少越好,

如果需要傳遞一整串的參數(2、3個以上),

可以使用物件來封裝傳遞。

5.使用try/catch代替錯誤代碼

避免使用錯誤處理代碼如error_code_1,

利用try/catch/finally來代替error_code,

就能將錯誤處理代碼的敘述抽出來並簡化,

且try/catch/finally裡面也應該只處理一件事。

2014年3月9日 星期日

Clean Code - Meaningful Names

在coding的過程中,

命名一直是大家常常討論的事情,

不論是package、class、jar、file、document、properties等等,

這邊分享一些書中提到的觀念,

我想寫程式的方式每個人都有自己的想法,

看到別人提出的論點可以多聽多看多了解,

覺得好的可以學起來用,

但不認同的也可以提出來討論,

畢竟這也不是聖經或是spec,

不會有人逼你一定要用,

在此將一些覺得不錯的條列如下:

1. 名符其實

每一段Code中的所有變數,應該要可以解答所有讀者的疑惑,

可以比較以下兩段程式碼,第二段會比第一段容易理解每個變數代表的涵義,

很常看到在宣告m這種變數後,再寫一段註解解釋m是什麼意思,

如果這樣的話,不如直接宣告為month更顯得淺顯易懂。
        int m;
        String str;
        List<Integer> list=null;
 
        int month;
        String memberName;
        List<Integer> memberList=null; 

2. 有意義的區別

不要使用會讓人搞不清楚的命名,例如Member和MemberInfo兩個類別,

直覺上看起來是一樣的,或是使用a、an、the這種名稱,

像account和theAccount,或Item和ItemObject。

3. 可被搜尋

當一個變數或常數在程式中很常用到,最好給一個容易被搜尋到的名稱來代替,

比較以下兩段程式碼,for迴圈中的數字,

當使用變數名稱取代後,會更好搜尋及了解涵義。
  int sum = 0;
  for (int i = 0; i < 10; i++) {
   sum += i * 2;
  }

  int total_item_count = 10;
  int item_exchange = 2;
  for (int i = 0; i < total_item_count; i++) {
   sum += i * item_exchange;
  }

4. 類別和方法的命名

類別的命名盡量使用名詞,例如Member、Account、Item等等,

方法的名稱則使用動詞,例如save、update、delete、add等等,

取出使用get,設定修改用set,判定或flag使用is。

5. 避免雙關語

有時候你會常常使用add這樣的名稱,

不論是增加、插入、附加等等,

但你可以考慮用add、insert、append等等的命名來區別這其中的差異,

可以幫助讀者更好理解。