当前位置: 首页 > article >正文

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

用类替换类型码 是一种重构手法,用于将代码中使用的类型码(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. 类型安全:使用类而非简单的常量,可以让代码更具类型安全性,减少使用错误值的可能性。

五、适用场景

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

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


http://www.kler.cn/news/363380.html

相关文章:

  • 【c++差分数组】P9583涂色
  • day7:软件包管理
  • [Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)
  • 【设计模式系列】命令模式
  • raidrive 访问搭建的ftp服务报错超时的情况
  • 客户端工具xshell/finalshell连接Vagrant创建的虚拟机并上传本地文件
  • DevExpress WPF中文教程:Data Grid的视图概述及主要功能一览
  • Java之动态代理
  • MoeCTF 2024 ---Misc方向WP
  • 【WPF】中Dispatcher的DispatcherPriority参数使用
  • 滚雪球学Redis[8.2讲]:Redis的未来发展趋势:从云服务到AI与物联网的前沿探索
  • javaWeb项目-ssm+jsp大学生校园兼职系统功能介绍
  • 【网络安全渗透测试零基础入门】之Hydra密码爆破工具使用教程图文教程,超强干货建议收藏!
  • AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务
  • 【表情识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+算法模型+TensorFlow
  • Windows.h 和pcl有冲突
  • 通用序列化和反序列化实现思路
  • 使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
  • 【已解决】【Hadoop】HDFS操作时:未找到命令的解决办法
  • 无线领夹麦克风哪个牌子好,麦克风品牌排行榜前十名,选购推荐
  • 人工智能:重塑未来生活与工作的科技力量
  • QT 实现随机码验证
  • Spring + WebSocket
  • SparkSQL整合Hive
  • Java集合(2 :List)
  • 【数据库】postgres数据库命令