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

重构代码之提取子类

提取子类主要用于精简类结构和增强代码的灵活性。这个方法适用于当类中的某些字段或方法只适用于特定对象的情况。通过提取子类,可以将这些特定的字段和方法分离到一个新的子类中,使代码结构更清晰。

一、为什么要使用提取子类

  1. 提高代码的可读性:当类包含与特定需求无关的字段和方法时,类会显得冗杂。提取子类后,代码的职责会变得更加清晰。
  2. 增强扩展性和复用性:将特定功能放入子类,便于在不修改原始类的情况下进行扩展。
  3. 减少条件判断:避免主类中使用大量条件语句(如 ifswitch)来处理不同的对象类型。

二、示例

假设我们有一个 Employee 类,其中包含了部分只适用于销售人员的属性和方法,例如 salesTargetachieveSalesTarget() 方法:

public class Employee
{
    public string Name { get; set; }
    public decimal Salary { get; set; }
    public decimal SalesTarget { get; set; }

    public Employee(string name, decimal salary)
    {
        Name = name;
        Salary = salary;
    }

    public void AchieveSalesTarget()
    {
        Console.WriteLine($"{Name} 已经完成了销售目标");
    }
}

对于非销售人员的员工对象,这些特定的字段和方法可能毫无意义。此时我们可以考虑提取一个 SalesEmployee 子类,来包含这些特定于销售的逻辑。

2.1 重构后的代码

通过提取 SalesEmployee 子类,将销售相关的内容与一般员工类分离:

public class Employee
{
    public string Name { get; set; }
    public decimal Salary { get; set; }

    public Employee(string name, decimal salary)
    {
        Name = name;
        Salary = salary;
    }
}

public class SalesEmployee : Employee
{
    public decimal SalesTarget { get; set; }

    public SalesEmployee(string name, decimal salary, decimal salesTarget)
        : base(name, salary)
    {
        SalesTarget = salesTarget;
    }

    public void AchieveSalesTarget()
    {
        Console.WriteLine($"{Name} has achieved the sales target!");
    }
}

现在 SalesEmployee 仅包含销售相关的逻辑,而 Employee 类保持简洁,包含通用属性。对于非销售员工,只需使用 Employee 类即可。

三、适用场景

  • 类中存在特定逻辑:当类包含仅针对某些情况或对象的逻辑时。
  • 频繁出现条件语句:当某些属性和方法通过条件语句控制时,通过提取子类可以减少分支判断。

四、使用提取子类的好处

  • 职责单一:每个类承担单一职责,遵循单一职责原则。
  • 代码易于扩展:新特性可以通过子类化实现,而不会污染主类。
  • 减少重复代码:在父类和子类之间共用通用逻辑,减少重复代码。

重构代码是一种常用的重构方式,尤其在类职责不明确、逻辑过于混杂时可以起到显著优化效果。


http://www.kler.cn/a/372434.html

相关文章:

  • 简述Git中如何将一个新增文件添加到本地仓库?
  • 【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较
  • 大语言模型中的Agent;常见的Agent开发工具或框架
  • 强化特种作业管理,筑牢安全生产防线
  • Text组件的用法
  • 【联动】【MSS】【AF】
  • 聚水潭商品信息集成到MySQL的高效解决方案
  • 蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位
  • PyTorch distributions模块介绍
  • Mybatis-09.基础操作-删除(预编译SQL)
  • 从零学习大模型(八)-----P-Tuning(上)
  • 【大数据学习 | kafka】kafka的shell操作
  • 【数据库】数据库管理(下)存储过程 触发器 慢查询日志 备份与恢复
  • 在vue项目中,如何写一个自定义指令
  • 【JavaScript】JavaScript 进阶-3-编程思想构造函数原型(更新中)
  • python 实现了一个简单的五子棋游戏
  • 三季度业绩获多家机构首肯,“听劝的”B站终于“起死回生”?
  • Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化
  • 【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程
  • 小红书小眼睛低于100的进
  • 视频协议与封装格式
  • 题目:输入某年某月某日,判断这一天是这一年的第几天?
  • 【Qt】QProcess用法小结
  • C# Solidworks二次开发:宏录制实战讲解(第一讲)
  • echarts属性之axisPointer
  • SELS-SSL/TLS