打造可維護軟體C# 讀書筆記記錄
傻瓜也可寫出電腦能懂的程式碼,但優秀的工程師才能寫出人類能夠理解的程式碼。
-Martin Fowler
- 程式碼單元的長度應該限制在15行以內,並且仔細挑選可以描述功能的方法名稱
- 為此,一開始就撰寫不超過15行的程式碼單元,或者將長單元分解成多個短單元,直到每個單元不超過15行
- 簡短的程式碼容易理解、測試及重構
程式碼單元是可以獨立維護及執行的最小程式碼集合。在c#中,程式碼單元就是方法或建構式。
範例一:超過15行的程式碼
public void Start(){
if(inProgress){
return;
}
inProgress = true;
//如果玩家掛掉 告知所有觀察者
if(!IsAnyPlayerAlive()){
foreach(LevelObserver o in observers){
o.LevelLost();
}
}
//如果豆子全部吃完 告知所有觀察者
if(RemainingPellets()==0){
foreach(LevelObserver o in observers){
o.LevelWon();
}
}
}
重構技巧:
1.提取方法(Extract Method)
將不同作用的程式碼拆分到不同的方法裡
public void Start(){
if(inProgress){
return;
}
inProgress = true;
UpdateObserversPlayerDied();
UpdateObserversPelletsEaten()
}
void UpdateObserversPlayerDied(){
if(IsAnyPlayerAlive()){
return;
}
foreach(LevelObserver o in observers){
o.LevelLost();
}
}
void UpdateObserversPelletsEaten(){
if(RemainingPellets()>0){
return;
}
foreach(LevelObserver o in observers){
o.LevelWon();
}
}
當拆分後的方法名稱足以表達意涵,也就不再需要註解。
2.以方法物件取代方法(Replace Method with Method Object)
當想要提取的方法有存取區域變數,雖然可以將區域變數當作參數傳遞給被提取出來的方法,但這可能導致冗長的參數列,回傳值甚至更難處理,因為在C#中一個方法只能回傳一個值。在這情況下,就可以用這個重構技巧來處理。