自学内容网 自学内容网

重构复杂简单变量之用类替换类型码

用类替换类型码 是一种重构手法,用于将代码中使用的类型码(Type Code)替换为类。这种类型码通常是一些预定义的常量(如 intstring 等),表示不同的类型、状态或类别。使用类代替类型码有助于减少错误,增强代码的可读性和可扩展性。

一、什么时候使用

  • 当代码中存在多处判断逻辑依赖于类型码,比如使用 if-elseswitch-case 语句来处理不同的类型。
  • 当类型码携带的不只是标识,还需要附加行为或数据。
  • 当类型码可能会在未来增加新的类型或需要更多扩展。

二、优化步骤

  1. 识别类型码:首先找到代码中使用类型码(常常是 intstring 或枚举)来表示不同类别的地方。
  2. 创建类封装类型码:为每个类型码创建一个类,封装类型码所代表的行为和数据。
  3. 替换类型码:将代码中所有使用类型码的地方替换为类的实例。
  4. 移植行为:将与类型码相关的行为移动到新创建的类中。

三、示例

假设你有一个类 Employee,其中有一个类型码 EmployeeType 来表示员工的类型(如 1 表示全职员工,2 表示兼职员工):

public class Employee
{
    public int EmployeeType { get; set; } // 1: Full-time, 2: Part-time

    public decimal GetBonus()
    {
        if (EmployeeType == 1)
        {
            return 1000;
        }
        else if (EmployeeType == 2)
        {
            return 500;
        }
        else
        {
            throw new ArgumentException("Invalid employee type.");
        }
    }
}
4.1 优化后的代码

首先为每种员工类型创建一个类,并将行为迁移到类中:

public abstract class EmployeeType
{
    public abstract decimal GetBonus();
}

public class FullTimeEmployee : EmployeeType
{
    public override decimal GetBonus()
    {
        return 1000;
    }
}

public class PartTimeEmployee : EmployeeType
{
    public override decimal GetBonus()
    {
        return 500;
    }
}

然后将 Employee 类中的类型码替换为 EmployeeType 对象:

public class Employee
{
    public EmployeeType Type { get; set; }

    public Employee(EmployeeType type)
    {
        Type = type;
    }

    public decimal GetBonus()
    {
        return Type.GetBonus();
    }
}

在客户端代码中使用时:

var fullTimeEmployee = new Employee(new FullTimeEmployee());
var partTimeEmployee = new Employee(new PartTimeEmployee());

Console.WriteLine(fullTimeEmployee.GetBonus()); // 输出 1000
Console.WriteLine(partTimeEmployee.GetBonus()); // 输出 500

四、优化的好处

  1. 减少条件判断:通过面向对象的多态性替代 if-elseswitch-case 语句,代码更清晰。

  2. 增强扩展性:增加新的类型时,只需添加新的类,不需要修改原有的代码,遵循了开闭原则(Open/Closed Principle)。

  3. 集中行为逻辑:将与类型相关的行为放到类中,避免了行为分散在多个地方,提升了代码的维护性。

  4. 类型安全:使用类而非简单的常量,可以让代码更具类型安全性,减少使用错误值的可能性。

五、适用场景

  • 复杂业务逻辑:当类型码的值决定了不同的行为或状态,使用类可以更好地组织代码。
  • 未来扩展性:当你预期将来会增加更多的类型或需要为类型码添加行为逻辑时,用类来代替更灵活。
  • 增强可读性:类型码作为数字或字符串存在时,含义不直观,使用类名则更具表达力。

这种优化适用于复杂系统中涉及多种状态、类型的情况,将类型码替换为类不仅能增强代码的灵活性,还能更好地遵循面向对象设计原则。


原文地址:https://blog.csdn.net/gangzhucoll/article/details/143086701

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!