打造可維護軟體C#-Ch02

打造可維護軟體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#中一個方法只能回傳一個值。在這情況下,就可以用這個重構技巧來處理。