假如有個很長的函數, 有很多的區域變數且交織在一起, 難以用Extract Method.
這是一種Long Method smell.
假設有個員工類別, 要計算年終獎金, 開發Bonus()
函數.
年終獎金依據多種條件, 比如職稱、年資、自我績效、團體績效...等
class Employee
{
// ...
public double Bonus()
{
double jobTitleBonus;
double seniorityBonus;
double selfPerformanceBonus;
double supervisorPerformanceBonus;
// Perform long computation.
}
}
想像Bonus
函數很長, 且計算年終邏輯交錯, 使維護成本高.
因此, 可建立一個BonusCalculator
類別, 將那些區域變數變成BonusCalculator
的field,
再分出其他的函數來計算結果.
class Employee
{
// ...
public double Bonus()
{
return new BonusCalculator(this).Compute();
}
}
class BonusCalculator
{
private double jobTitleBonus;
private double seniorityBonus;
private double selfPerformanceBonus;
private double supervisorPerformanceBonus;
// ... other fields from local variables
public BonusCalculator(Employee employee)
{
// Copy relevant information from the employee object.
}
public double Compute()
{
// Perform long computation.
}
}
經過這種重構, 讓Employee
的Bonus()
的計算委託給BonusCalculator
,
避免Employee
的功能(職責)越來越龐大.
二來可分開測試兩類別的邏輯. 只是對Employee
來說, 會需要另外的Factory與BonusCalculator 介面做mock.
因為多了新類別, 增加程式的複雜度.