提取方法是重構中最常用、最基礎的技巧之一。當一個方法過於冗長,或者其中某段代碼需要靠註釋才能說明用途時,就是提取方法的最佳時機。將這些邏輯獨立成單獨方法,不僅能讓主流程一目了然,還能提升代碼的複用性與模組化程度。
以下是一個典型的「大方法」範例,負責列印欠款明細:
void PrintOwing()
{
double outstanding = 0;
//print banner
Console.WriteLine("**********");
Console.WriteLine("***Owes***");
Console.WriteLine("**********");
//Calculate outstanding
foreach(Order o in orders)
{
outstanding += o.Amount;
}
//print details
Console.WriteLine("Name: " + name);
Console.WriteLine("Amount: " + outstanding);
}
這個方法混雜了三種職責:列印標題、計算欠款總額、列印明細。雖然有註釋分隔,但閱讀與維護成本仍然很高。
應用提取方法重構後,主方法變成清晰的協調者:
void PrintOwing()
{
PrintBanner();
double outstanding = GetOutstanding();
PrintDetails(outstanding);
}
void PrintBanner()
{
Console.WriteLine("**********");
Console.WriteLine("***Owes***");
Console.WriteLine("**********");
}
void PrintDetails(double outstanding)
{
Console.WriteLine("Name: " + name);
Console.WriteLine("Amount: " + outstanding);
}
double GetOutstanding()
{
double result = 0;
foreach(Order o in orders)
{
result += o.Amount;
}
return result;
}
GetOutstanding() 可被其他地方呼叫PrintBanner,不影響計算邏輯提取方法是重構的入門功夫,也是最高頻操作。養成「看到註釋就想提取方法」的習慣,代碼品質會自然提升。