重构代码之移动方法
在代码重构中,移动方法 是一种将方法从一个类移动到另一个类的重构技术。这种重构主要用于解决类之间职责不清、依赖过重的问题。当一个方法对另一个类的数据或逻辑依赖过多时,把这个方法移动到它所依赖的类中,可以让代码更易读且更易维护。
一、何时使用移动方法?
如果发现一个方法经常访问其他类的数据或方法,或者仅对另一个类有意义时,这通常是一个信号,表明该方法可能不应该位于当前类中。通过将方法移动到更合适的类,可以增强代码的内聚性,减少类之间的耦合度,从而提高代码的可维护性。
二、举例说明
假设我们有一个 Order
类和一个 Customer
类。Order
类包含计算订单折扣的方法 CalculateDiscount()
,但该方法严重依赖于 Customer
类中的数据。重构前的代码如下:
public class Order
{
public decimal Amount { get; set; }
public Customer Customer { get; set; }
public decimal CalculateDiscount()
{
if (Customer.IsLoyalCustomer)
{
return Amount * 0.10m; // loyal customers get a 10% discount
}
return 0;
}
}
public class Customer
{
public string Name { get; set; }
public bool IsLoyalCustomer { get; set; }
}
在这里,CalculateDiscount()
方法虽然在 Order
类中,但它依赖于 Customer
的 IsLoyalCustomer
属性。为了更清晰的职责分离,可以将 CalculateDiscount()
方法移到 Customer
类中。
三、重构后的代码
在重构后,CalculateDiscount()
方法将被移至 Customer
类:
public class Order
{
public decimal Amount { get; set; }
public Customer Customer { get; set; }
public decimal GetDiscountedAmount()
{
return Amount - Customer.CalculateDiscount(Amount);
}
}
public class Customer
{
public string Name { get; set; }
public bool IsLoyalCustomer { get; set; }
public decimal CalculateDiscount(decimal amount)
{
if (IsLoyalCustomer)
{
return amount * 0.10m; // loyal customers get a 10% discount
}
return 0;
}
}
四、重构后的优点
- 提高内聚性:
CalculateDiscount()
方法现在直接访问Customer
的属性,更符合逻辑。 - 降低耦合度:
Order
类不再需要知道折扣的具体计算逻辑,只需要调用Customer
的方法即可。 - 可维护性更高:折扣逻辑集中在
Customer
类中,未来如需调整逻辑,不会影响Order
类。
五、总结
Move Method 是一种增强代码结构的有效手段,特别是在分离职责和降低耦合度方面。通过正确地移动方法,可以让代码结构更加清晰,维护起来也更加方便。