重构代码之提取子类

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

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

  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.mzph.cn/news/884111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm设定代码模板

1、在文件点击设置 ​​​​​​​ ​​​​​​​ 2、点击编辑器--实时模板--找到需要插入模板的位置如我要插入HTML的模板---选择--点击实时模板 3、如图: 4、添加模板内容,如果模板有变量可以在编辑变量处点击编辑 5、编辑变量 6、点…

蘑菇书(EasyRL)学习笔记(2)

1、序列决策 1.1、智能体和环境 如下图所示,序列决策过程是智能体与环境之间的交互,智能体通过动作影响环境,环境则返回观测和奖励。智能体的目标是从这些反馈中学习出能最大化长期奖励的策略,这一过程通过不断试错和调整实现强化…

SQL进阶技巧:如何利用三次指数平滑模型预测商品零售额?

目录 0 问题背景 1 数据准备 2 问题解决 2.1 模型构建 (1)符号规定 (2)基本假设 (3)模型的分析与建立 2.2 模型求解 3 小结 0 问题背景 1960年—1985年全国社会商品零售额如图1 所示 表1全国社…

Rsync远程同步详细介绍

一、rsync介绍 rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。 rsync软件支持跨平台,适用于unix/ linux/windows等多种操作系统平台。rsyn…

无人机之自动控制原理篇

一、飞控系统 无人机飞控是指无人机的飞行控制系统,是无人机的大脑。飞控系统通过传感器、控制器和执行机构三部分实现对无人机的自动控制。 传感器:传感器负责收集无人机的姿态、速度、高度等信息。常见的传感器包括陀螺仪、加速度计、磁力计、气压计、…

得物App获评新奖项,正品保障夯实供应链创新水平

近日,得物App再度获评新奖项——“2024上海市供应链创新与应用优秀案例”。 本次奖项为上海市供应链领域最高奖项,旨在评选出在供应链创新成效上处于领先地位、拥有成功模式和经验的企业。今年以来,得物App已接连获得“上海市质量金奖”、“科…

STM32F103C8T6学习笔记3--按键控制LED灯

1、实验内容 S4、S5分别接PB12和PB13,实验要求,按下S4,D1亮,D2灭;按下S5,D2亮,D1灭。 由于按键学习的是GPIO口的输入功能,和输出功能的配置略有区别。本次通过按键触发相应功能没有…

10.27复习day —— 药销系统分页前(上)

登陆界面 1.auto 水平方向 —— 占据尽量多的空间 margin:auto —— 水平居中 2.块状:block main、div、p 特点: 独占一行 水平方向占满父元素可用空间(所以得设置宽度) 垂直方向占据空间由其内容大小决定 行内:inlin…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件:先了解集群搭建流程是什么样,需要改哪些配置,有哪些环境,这个文章目的是简化部署。 clickhouse运维篇(一):docker-compose 快速部署clickhouse集群 clickhouse运维篇(二&am…

快速入门kotlin编程(精简但全面版)

注:本文章为个人学习记录,如有错误,欢迎留言指正。 目录 1. 变量 1.1 变量声明 1.2 数据类型 2. 函数 3. 判断语句 3.1 if 3.2 when语句 4. 循环语句 4.1 while 4.2 for-in 5. 类和对象 5.1 类的创建和对象的初始化 5.2 继承 5…

云原生Istio基础

一.Service Mesh 架构 Service Mesh(服务网格)是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来,放到一个独立的层中进行管理。传统的微服务架构中&#x…

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1.合理利用display:block属性2.利用margin-bottom设置间隔效果3.利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题,国家正在大力推进软硬件系统的信创替代,对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

什么是x86架构,什么是arm架构

什么是 x86 架构? x86 架构是一种经典的指令集架构(ISA),最早由英特尔在 1978 年推出,主要用于 PC、服务器等领域。 它是一种复杂指令集计算(CISC)架构,支持大量的复杂指令和操作&…

客户的奇葩要求—在CAN网络的基础上加入了CAN_FD的节点

1:客户的奇葩要求 最近的工作中,遇到了一个有点奇葩的事,客户需要开发一个系统,我们负责其中的一个ECU,这个系统采取的是经典11bit ID的CAN网络。 今天突然提了一个要求,说要在网络中,加入支持…

4G 模组的 FTP 应用:技术科普

众所周知FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端,今天我将为大家带来一场4G 模组的 FTP 应用技术科普: 以低功耗模组Air780E核心板为例。 1、FTP 概述 FTP(File Transfer Protocol,文件…

PAT甲级-1074 Reversing Linked List

题目 题目大意 给一个链表的头结点和总节点个数,以及k。每k个节点的链表都要翻转。 思路 链表可以用一个结构体数组来存储,先遍历一遍,过滤掉不在链表中的节点。然后将过滤好的节点放入res数组中,每k个元素用一次reverse()&…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中,已经识别到了camera sensor ID,并且可以拿到raw图和isp处理后的图像,但是isp处理后的图像偏绿,来看查看后台服务发现rkaiq_3A_server没有运行,然后单独运行rkaiq_3A_s…

Python 变量在函数中的作用域

什么是局部变量? 作用范围在函数内部,在函数外部无法使用 什么是全局变量? 在函数内部和外部均可使用 如何将函数内定义的变量声明为全局变量? 使用global关键字, global变量 练习: 演示局部变量 #…

百数功能更新——表单提交支持跳转到外部链接并支持传参

百数的表单外链功能允许用户将表单以链接的形式分享给外部用户,外部用户无需登录或加入团队即可访问并填写表单。 本次更新的表单提交后跳转指定链接的功能,在支持跳转内部链接的基础上,支持用户在完成表单填写并提交后,自动跳转…