提高程式碼質量,從觀念到實踐--Clean Code 培訓總結
阿新 • • 發佈:2019-02-03
程式設計價值觀
之前我總是認為好的程式碼精簡是第一位,這樣才夠“優雅”,我寫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, 封裝第三方方法
工程的世界中,需求總是在變得,程式碼也要跟著不停迭代。考慮到你使用的第三方方法也會更改,把它封裝一下,這樣第三方程式碼更改時你只需要更改一處。