重构代码之移动方法

在代码重构中,移动方法 是一种将方法从一个类移动到另一个类的重构技术。这种重构主要用于解决类之间职责不清、依赖过重的问题。当一个方法对另一个类的数据或逻辑依赖过多时,把这个方法移动到它所依赖的类中,可以让代码更易读且更易维护。

一、何时使用移动方法?

如果发现一个方法经常访问其他类的数据或方法,或者仅对另一个类有意义时,这通常是一个信号,表明该方法可能不应该位于当前类中。通过将方法移动到更合适的类,可以增强代码的内聚性,减少类之间的耦合度,从而提高代码的可维护性。

二、举例说明

假设我们有一个 Order 类和一个 Customer 类。Order 类包含计算订单折扣的方法 CalculateDiscount(),但该方法严重依赖于 Customer 类中的数据。重构前的代码如下:

csharp 复制代码
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 类中,但它依赖于 CustomerIsLoyalCustomer 属性。为了更清晰的职责分离,可以将 CalculateDiscount() 方法移到 Customer 类中。

三、重构后的代码

在重构后,CalculateDiscount() 方法将被移至 Customer 类:

csharp 复制代码
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;
    }
}

四、重构后的优点

  1. 提高内聚性CalculateDiscount() 方法现在直接访问 Customer 的属性,更符合逻辑。
  2. 降低耦合度Order 类不再需要知道折扣的具体计算逻辑,只需要调用 Customer 的方法即可。
  3. 可维护性更高 :折扣逻辑集中在 Customer 类中,未来如需调整逻辑,不会影响 Order 类。

五、总结

Move Method 是一种增强代码结构的有效手段,特别是在分离职责和降低耦合度方面。通过正确地移动方法,可以让代码结构更加清晰,维护起来也更加方便。

相关推荐
喵叔哟2 天前
重构代码之引入本地扩展
重构
喵叔哟2 天前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
seraph9992 天前
python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
重构
喵叔哟5 天前
重构代码之删除对参数的赋值
重构
fishjam5 天前
[开源重构]Search(Elasticsearch/OpenSearch) Sync Tool
elasticsearch·重构·开源
多多*5 天前
Vue.js 插槽 Slots 实际应用 最近重构项目的时候遇到的...
前端·vue.js·重构
喵叔哟7 天前
重构代码之内联类
服务器·重构
喵叔哟7 天前
重构代码之替换算法
重构
有趣的杰克11 天前
移动端【01】面试系统的MVVM重构实践
面试·职场和发展·重构