Move Method
概述
程式中,有個函數與其所駐class之外的另一個class進行更多交流,調用後者或被後者調用
動機(Motivation)
如果一個class有太多行為,或如果一個class與另一個class有太多合作而形成高度耦合(highly coupled),我們就會搬移函數。通過這種手段,我們可以使系統中的classes更簡單,這些classes最終也將更幹凈利落地實現系統交付的任務。
示例
public class MoveMethod
{
private AccountType _type;
private int _daysOverdrawn;
public double OverDraftCharge()
{
if (_type.IsPremium())
{
double result = 10;
if (_daysOverdrawn > 7)
result += (_daysOverdrawn – 7) * 0.85;
return result;
}
else
return _daysOverdrawn * 1.75;
}
public double BankCharge()
{
double result = 4.5;
if (_daysOverdrawn > 0)
result += OverDraftCharge();
return result;
}
}public class AccountType
{
public bool IsPremium()
{
return true;
}
}
改為
public class MoveMethod
{
private AccountType _type;public double BankCharge()
{
double result = 4.5;
if (_type._daysOverdrawn > 0)
result += _type.OverDraftCharge();
return result;
}
}public class AccountType
{
private int _daysOverdrawn;public int DaysOverdrawn
{
get { return _daysOverdrawn; }
set { _daysOverdrawn = value; }
}public bool IsPremium()
{
return true;
}public double OverDraftCharge()
{
if (IsPremium())
{
double result = 10;
if (_daysOverdrawn > 7)
result += (_daysOverdrawn – 7) * 0.85;
return result;
}
else
return _daysOverdrawn * 1.75;
}
}
Move Field(搬移值域)
概述
在target class建立一個new field,修改source field的所有用戶,令它們改用new field。
動機(Motivation)
對於一個field(值域),在其所駐class之外的另一個class中有更多函數使用瞭它,我就會考慮搬移這個field。
示例
public class MoveMethod
{
private AccountType _type;
private double _interestRate;
public double InterestForAmountDay(double amount,int days)
{
return _interestRate * amount * days / 365;
}
}public class AccountType
{}
改為
public class MoveMethod
{
private AccountType _type;public double InterestForAmountDay(double amount, int days)
{
return _type.InterestRate * amount * days / 365;
}
}public class AccountType
{
private double _interestRate;
public double InterestRate
{
get { return _interestRate; }
set { _interestRate = value; }
}
}