什麼是程式碼整理?

banq發表於2018-09-09
這是kent Beck大師有關一篇編碼工藝的文章:

在“改變生活的魔法”一文中,我描述了一種零碎的、日常程式碼衛生學,程式碼將變得混亂。好像沒有沒有羞恥感嗎,看到程式碼雜亂表明你已經學到了一些東西,整理就是做一些關於凌亂程式碼的事情。

TLCMOTUC描述了整理過程:讓事情變得更好,保持安全,慶祝進步。以下是一些需要整理的內容:

名稱
隨著時間的推移,名稱和意義可能會分開,團隊使用的詞彙不斷髮展,昨天的話可能不是今天的話。

整潔的名字是一次一個,讓下一位讀者理解更容易一些。

條件語句
條件邏輯是很好整理的,你希望程式碼閱讀者檢視條件時,能立即瞭解發生的情況。條件的某些用法會掩蓋了程式設計師的意圖。

錯誤使用條件的一種方式是隱藏簡單案例:

if(condition){ 
 ...很多行... 
} else { 
 ... 一行 ... 
}

<p class="indent">

整理成:

if(!condition){ 
 ... 一行 ... 
} else { 
 ... 多行 ... 
}
<p class="indent">


條件的意思是:“這裡有兩種可能的計算路徑。”然而,有時程式設計師想說,“這是一個先決條件。如果不滿足,則此計算無效/無必要。“例如,如果快取了值,則無需計算值。

if(cache){ 
 return cache; 
} else { 
 ...計算快取的值... 
 return cache; 
}
<p class="indent">

這段程式碼實際上並不是兩個條件同樣平衡的,它是有一個先決條件,如果不滿足才計算,使用Guard子句整理好:

if(cache)return cache; 
...計算快取值..
<p class="indent">
.
返回快取;

下一位讀者會感謝你。

最後,有時程式設計師的意思是“按兩種方式中的一種計算值”,而不是“遵循這兩種執行方式中的一種”,整理這個:

if (condition) {
 temp := …something…
} else {
 temp := …something else…
}
<p class="indent">

要使用三元運算子:

temp := condition
 ? …something…
 : …something else…
<p class="indent">


冗餘
隨著程式碼的發展,本地最佳化的程式設計決策可能會留下混亂,這裡就有餘地實現更短、更清晰的替換。透過一次修復這些斑點來整理,將“if(flag == true)”替換為“if(flag)”(假設您的程式語言支援此項);將“collection.size == 0”替換為“collection.isEmpty”。

這種整理的想法是找到一種表達計算的主導統一方式,這樣能更短,更清晰地表達,而且在各方面都更好。

一個更極端的例子是當使用異常處理時,函式的返回值還能正常使用,不要使用比必要的更大的棍子。

萃取Extraction
表示式可以從簡單開始然後再增長,在每個步驟中,新增比分解更容易,這裡有需要整理的地方。

提取部件,併為臨時變數提供暗示名稱,這是一種整理表示式方式,如:

return new Point(...長表示式來計算x ...,...長表示式來計算y,y與x有很多不同地方...)
<p class="indent">


整理成:

x:=計算x的表示式; 
y:=計算y的表示式; 
return new Point(x, y);
<p class="indent">


在整理它時完全可以提取單個解釋變數,稍後才有時間整理表達的其餘部分。

提取例程也可以整理,所有人性化的IDE現在都支援自動提取功能。整理時,對函式可自由提取為一種helper性質函式,稍後才有時間呼叫您的新helper函式。

一個更雄心勃勃的(也許我應該說“勇敢”)整理是提取一個方法物件。方法物件通常可以實現戲劇性的後續清理。在整理時只需提取成新物件並呼叫即可,許多工作其實只需要一次程式碼提交就完成。

重新排序
最後的整理是按照讀者想要的順序對檔案中的元素進行排序。取決於你的程式碼閱讀者,可能會先將所有幫助程式放在最後;然後將主邏輯流程放在最後;或者可能先擁有主流程,然後再執行幫助程式等。

input(){ 
 ... stuff ... 
}
process(){ 
 ... stuff ... 
}
output(){ 
 ... stuff ... 
}
main(){ 
 input()
 process()
 output()
}
<p class="indent">


要麼 主在前:

main(){ 
 input()
 process()
 output()
}
input(){ 
 ... stuff ... 
}
process(){ 
 ... stuff ... 
}
output(){ 
 ... stuff ... 
}
<p class="indent">

在重新排序時,可能會看到其他整理的可能性。那就不得不等待下一個差異。完成重新排序並進行整理,然後再整理一些。

總結
寫這篇文章時我很驚訝。我曾經一直說,“保持很小的整理差異,因為以後會有時間再進行更多的整理。”那種以後會有足夠時間的態度與我通常的情況完全相反,他們會說“我們現在必須清理,因為我們永遠不會有另一次機會。”

如果你有足夠的時間,你會怎麼樣?嘗試一下,也許額外的能量、創造力和整潔性將使你能夠完成更多整理,而不是更少,每次只整理一點,等有時間再進行更多整理,也許會有更多驚喜發現,那多酷啊!

但是,整理不能變為程式新增新邏輯,這是一個富有成效的小工具微調器,當你知道你想寫什麼,然後寫它,後面再整理。

What To Tidy – Kent Beck – Medium

相關文章