最近接了個超級複雜程式碼翻寫任務 , 算是最害怕的任務吧 , 就順便重構一些過去的技術債 , 所以筆記一下
好的程式碼原則
- 少於 10 行程式碼的方法 (最好不超過 4 行) , 不超過兩個參數的方法 , 超過的話重構為物件 DTO => 在座的各位都是垃圾的意思 ~
- 函數不會修改資料或是狀態 immutable
- boolean 盲性 => 用列舉 enum 解決
- 在大型類別中使用區域 (region)
- 遇到 switch 時重構那個片段成為 function
- 永遠將函數的回傳值命為 result
- 使用動態語言時參數預設戴上類別名稱 => 這個還挺有用 , 但是會變很長
- 移除臨時變數 => 實戰感覺吃 ide , 有的沒法一眼看到 debug 狀態還是挺麻煩
- 拆開 loop , 如果不太影響效能最好拆成兩個 loop , 不要讓邏輯混在一起
- 兩頂帽子理論 => 添加新功能時不重構 , 重構時不加上新功能
- 三次法則 => 第一次做事就放手做 , 第二次作類似的事會賭爛 , 但是還能做 , 第三次再發生就該重構
手法
if 消除
如果遇到這種 if 結構可以用 Dictionary 重構 , 消除 switch-case 可以參考這篇(https://ronsun.github.io/content/20180412-anti-switch-case.html)
1 | if(x == "Dev"){ |
1 | var dict = new Dictionary<string,int>(){ |
out 消除
工作常我 99% 自己不會用 out
, 偏偏老舊 code 一堆 out
1 | public string ToolMan(int money , Food food , out string byebye){ |
改建立類別 , 把掰掰變成屬性即可成為沒出局的工具人 ~
1 | public class Man { |
壞味道
神秘命名 mysterious name
我曾經接過一包很爛的 code 一堆朝狀 if else , 變數名稱是用 fuck
來命名 , code 爛不說連變數都這樣搞
就不能乖乖取名 _30cm
這種有意義又好看的命名嗎?
重複代碼 duplicated code
過長函數 long function
在鄉民的世界裡 30cm 幾乎是標準配備 , 在 coding 的世界裡越是行數多的程式碼越難一眼理解
依據大師原則 , 少於 10 行程式碼的方法 (最好不超過 4 行)
所以大師規定 10cm 才是好的 code 最好不要超過 4cm ~ 這下館長有救了!
過長參數列表 long parameter list
依據大師原則 => 不超過兩個參數的方法 , 超過的話重構為物件 DTO
全局資料 Global Data
可變資料 Mutable Data
發散式變化 Divergent Change
散彈式修改 Shotgun Surgery
依戀情節 Feature Envy
我不太會形容 , 感覺有點像是這樣 , 明明可以直接在 Ruler 搞定的事硬要搬到 Man 裡面 , 像是 30cm 情節
1 | class Man{ |
資料泥團 Data Clumps
基本類型偏執 Primitive Obsession
重複的 switch Repeated Switches
循環 loops
大師意思就是寫 for or foreach 的 code 都是垃圾 ~
多餘的元素 lazy element
臨時欄位 temporary field
過長的消息鍊 message chains
coding 標準參考
https://www.c-sharpcorner.com/UploadFile/ankurmalik123/C-Sharp-coding-standards
https://www.dofactory.com/reference/csharp-coding-standards
https://blog.submain.com/coding-standards-c-developers-need