###### tags: `CleanCode`
<STYLE>
p,li,oi,h3{
font-family:"微軟正黑體";
}
</STYLE>
# 基本觀念
特點:
> 戴夫.湯馬斯(Dave Thomas);羅恩.傑佛瑞(Ron Jeffries)
* ==充分表達系統設計的構思,使用有意義的名稱,增加程式的**可讀性**==
* ==單一職責原則,一個類別應該只有一個職責==
:::info
<h2>沒有重複的程式碼!必須盡可能減少程式碼的相依性</h2>
:::
---
### 1️⃣命名
* 使用具有意義的名稱
* 選擇能反映出類別或函式的抽象層次之名稱
* 避免使用常見字詞(ex:hp、sco..)
* 避免使用與變數型態無相關的相近字詞(ex:accountList)
* 要區別相似功能的function,需使用能辨識其不同處的命名
* 相同概念使用同一字詞
* 單一字母或數字可用於小函式中,其餘盡量使用可被搜尋的名稱(ex:用sum取代s)
* 不應該將型態編碼到名稱裡
**類別**:使用名詞or名詞片語,不該使用動詞;避免用Manager、Processor、Data、Info。
**方法**: 使用動詞or動詞片語。
> overload時,使用含參數資訊的方式。
> 例:將new Complex(23.0)改以Complex.FromRealNumber(23.0)方式產生,並考慮將後者建構子設為private
---
### 2️⃣函式
* 簡短、短小精幹,讓函式長度愈短愈好
* 每個函式都只做一件事
* *檢測方式:是否能從中提煉出另一個函式?且新函式不能只用來重新詮釋原函式的實作*
* 將例外處理(try/catch)提取成一個函式
#### ※注意事項
:::info
* 避免過多的參數:避免參數超過3個。
* 避免輸出型參數(在非物件導向程式設計可見):函式盡量只能修改其所屬物件的狀態。
* 避免旗標參數(Flag):表示此函式只做了不只一件事情,違反單一職責原則。
* 移除被遺棄的函式:刪除不會用到的函式(若要查找,請記住可以從原始碼管控系統查找)
:::
---
### 3️⃣註解
避免多餘的註解,會增加閱讀複雜度與誤導。
* 有益:提供函式的基本資訊、解釋某行程式之意圖、闡明參數與回傳值、待辦事項
* 有害:日誌型註解、干擾無益的註解
#### ※注意事項
:::info
* 註解應該保留技術性紀錄(ex:程式或設計方面的資訊),歷史修改則不太適合放在此。
* 若發現註解過時,最好盡快更新或移除它。
* (1)如果程式碼已能表達意圖,則不需要多餘註解。(2)註解應該說明程式本身無法表達的意圖。
* 選用詞彙與正確的文法及符號,不說廢話。
* 移除被註解掉的程式碼
:::
---
### 4️⃣程式碼編排
* 垂直空白:不同概念間使用換行區隔
* 垂直密度:避免在函式裡使用多行註解
* 垂直距離:變數宣告應盡量靠近被使用的地方/概念相似的函式首要放在一起;而相依的函式在編排上則盡量次要靠近
* 水平空白:用於突出重要的元素。避免將高度相關的元素分開(ex:函式名與參數)。
---
肯特.貝克(Kent Beck)提出簡單設計的四原則,前三點是最為重要的守則。:
* 執行完所有的測試
* 程式重構(**禁止重複的程式碼**、**程式碼具表達力**、**最小化類別與方法的數量**)
#### 1. 執行完所有的測試
撰寫容易測試的程式,並且持續執行程式測試。讓程式碼保持低耦合度與高凝聚度。
#### 2. 禁止重複的程式碼
不論是完全相像或者看似相像的程式碼,都需要經過重構。甚至能將提取出來的方法移至另一個類別,遵守單一職責原則(SRP)。
#### 3. 程式碼具表達力
* 可以利用**選擇合適的名稱來命名類別或函式**
* 透過**讓函式和類別簡短化**,通常較容易撰寫、命名與理解。
* 利用**標準命名法**,(使用標準化名稱,如COMMAND或VISITOR,當作實作模式的類別名稱。)
#### 4.最小化類別及方法的數量
建議保持類別、函式,以及系統的簡短。
{"metaMigratedAt":"2023-06-15T09:06:25.622Z","metaMigratedFrom":"Content","title":"基本觀念","breaks":true,"contributors":"[{\"id\":\"643f6227-3151-4d5a-9f93-b74508353312\",\"add\":1930,\"del\":114}]"}