1. 程式人生 > >提高程式碼質量,從觀念到實踐--Clean Code 培訓總結

提高程式碼質量,從觀念到實踐--Clean Code 培訓總結

程式設計價值觀

之前我總是認為好的程式碼精簡是第一位,這樣才夠“優雅”,我寫20行程式碼的功能,別人10行就能實現就是比我厲害。但在工程的世界,程式設計師寫程式碼不只是給自己看的,還要考慮到後面會有同事要來維護你的程式碼。因此什麼是好程式碼要重新定義:不應該追求程式碼行數最少,而應該將閱讀程式碼所用時間最少作為第一位
下面列出的這些組織程式碼原則可以幫助實現這一核心目標:

  • 公有方法應該像目錄一樣,展示的是流程邏輯,具體實現封裝為私有方法
  • 查詢與操作分離
  • 一行程式碼只做一件事
  • 一個方法只做一件事。不要抽象出 queryDataAndPrint()這種方法
  • 一個迴圈中只做一件事
  • 每個變數只用於單一用途
  • 巢狀深度不超過3層
  • 一個方法長度不超過30行

經常說:所有那些函式呼叫都增加了不必要的負擔。事實上,一流的編輯器優化通常會自動把短的程式碼段轉成行內函數。在現代的計算機上,函式呼叫的代價接近於0.

程式設計技巧(乾貨)

下面介紹一些具體的提升程式碼質量的技巧。

1, 使用衛語句

Replace Nested Conditional with Guard Clauses (以衛語句取代巢狀條件表示式)的精髓是:給某個分支以特別的重視。它告訴閱讀者:這種情況很罕見,如果它真的發生了,請做一些必要的整理工作,然後退出。請對比下面兩種寫法:

// 多重巢狀,不好的實現
double
getPayAmount(){ double result; if(_isDead){ result = deadAmount(); } else { if (_isSeparated){ result = separatedAmount(); } else { if (_isRetired){ result = retiredAmount(); } else { result = normalPayAmount() } } } return
result; }
// 衛語句方式
double getPayAmount(){
    if(_isDead){
        return deadAmount();
    }
    if(_isSeparated){
        return separatedAmount();
    }
    if(_isRetired){
        return retiredAmount();
    }
    return normalPayAmount();
}

可以看出,使用衛語句把複雜的的條件表示式拆分成多個條件表示式後,結構清晰了很多。

2, 正常程式碼和異常處理分離

先看一下你是不是也寫過這樣的程式碼,巢狀好幾層的條件表示式,只為了拿到正常條件下的非空值

// 從第三方查詢資訊
queryCustCashAmout(){
    QueryCustResponse response = thirdPartyFacade.getCustInfo();
    if(response != null) {
        CustomerLoanInfo cust = response.getCustLoanInfo();
        if(cust != null){
            return cust.getCashAmount();
        }
    }
    return -1;
}

一種有效的方式是將正常的處理流程和異常的流程分離,看下面的程式碼是不是結構清晰多了

queryCustCashAmout(){
    try{
        QueryCustResponse response = thirdPartyFacade.getCustInfo();
        CustomerLoanInfo cust = response.getCustLoanInfo();
        return cust.getCashAmount();
    }catch(Exception e){
        log.error('查詢客戶現金額度異常',e);
        return -1;
    }
}

3, 消除控制標記

先看一段程式碼

var remove_one = function(array,value_to_remove){
    var index_to_remove = null;
    for(var i=0; i< array.length; i++){
        if(array[i] === value_to_remove){
            if(array[i] === value_to_remove){
                index_to_remove = i;
                break;
            }
        }
    }
    if(index_to_remove !== null) {
        array.splice(index_to_remove,1);
    }
}

這個方法中的index_to_remove就是控制標記,用來判斷是否執行某個操作。它所帶來的麻煩遠超過它帶來的便利。檢查下你程式碼中有沒有控制標記,去除他們條件語句真是的用途會清晰的多。

var remove_one = function(array,value_to_remove){
    for(var i=0; i< array.length; i++){
        if(array[i] === value_to_remove){
            if(array[i] === value_to_remove){
                array.splice(index_to_remove,1);
                return;
            }
        }
    }

}

4, 封裝第三方方法

工程的世界中,需求總是在變得,程式碼也要跟著不停迭代。考慮到你使用的第三方方法也會更改,把它封裝一下,這樣第三方程式碼更改時你只需要更改一處。