0%

重構筆記

 

最近接了個超級複雜程式碼翻寫任務 , 算是最害怕的任務吧 , 就順便重構一些過去的技術債 , 所以筆記一下

好的程式碼原則

  • 少於 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
2
3
4
5
6
7
if(x == "Dev"){
return 1;
}

if(x == "Prod"){
return 2;
}
1
2
3
4
5
6
7
8
var dict = new Dictionary<string,int>(){
{"Dev",1},
{"Prod",2}
};

if (dict.ContainsKey(x)){
return dict[x];
}

out 消除

工作常我 99% 自己不會用 out , 偏偏老舊 code 一堆 out

1
2
3
public string ToolMan(int money , Food food , out string byebye){
//todo
}

改建立類別 , 把掰掰變成屬性即可成為沒出局的工具人 ~

1
2
3
4
5
6
public class Man {
public string ByeBye { get; set; }
public string ToolMan(int money , Food food){
//todo
}
}

壞味道

神秘命名 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
2
3
4
5
6
7
8
9
class Man{
public static void HowLong(Ruler r){
return r.Meaure();
}
}

class Ruler{
public int Measure(){ return 30; }
}

資料泥團 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

工具

FindBugs
PMD
Checkstyle

關閉