.NET 快速重构概要1

1.封装集合

        在某些场景中,向类的使用者隐藏类中的完整集合是一个很好的做法,比如对集合的 add/remove 操作中包 含其他的相关逻辑时。因此,以可迭代但不直接在集合上进行操作的方式来暴露集合,是个不错的主意。

public class Order { private int _orderTotal; private List<OrderLine> _orderLines; public IEnumerable<OrderLine> OrderLines { get { return _orderLines; } } public void AddOrderLine(OrderLine orderLine) { _orderTotal += orderLine.Total; _orderLines.Add(orderLine); } public void RemoveOrderLine(OrderLine orderLine) { orderLine = _orderLines.Find(o => o == orderLine); if (orderLine == null) return; _orderTotal -= orderLine.Total; _orderLines.Remove(orderLine); } } 

        我们对集合进行了封装,没有将 Add/Remove 方法暴露给类的使用者。在.NET Framework 中,有 些类如 ReadOnlyCollection,会由于封装集合而产生不同的行为,但它们各自都有防止误解的说明。这是一 个非常简单但却极具价值的重构,可以确保用户不会误用你暴露的集合,避免代码中的一些 bug。

2.Move方法

        重构同样非常简单,以至于人们并不认为这是一个有价值的重构。迁移方法(Move Method),顾名 思义就是将方法迁移到合适的位置。在开始重构前,我们先看看一下代码:

public class BankAccount
{public BankAccount(int accountAge, int creditScore, AccountInterest accountInterest){AccountAge = accountAge;CreditScore = creditScore;AccountInterest = accountInterest;}public int AccountAge { get; private set; }public int CreditScore { get; private set; }public AccountInterest AccountInterest { get; private set; }public double CalculateInterestRate(){if (CreditScore > 800)return 0.02;if (AccountAge > 10)return 0.03;return 0.05;}
}public class AccountInterest
{public BankAccount Account { get; private set; }public AccountInterest(BankAccount account){Account = account;}public double InterestRate{get { return Account.CalculateInterestRate(); }}public bool IntroductoryRate{get { return Account.CalculateInterestRate() < 0.05; }}
}

         这里值得注意的是 BankAccount.CalculateInterest 方法。当一个方法被其他类使用比在它所在类中的使用还要 频繁时,我们就需要使用迁移方法重构了——将方法迁移到更频繁地使用它的类中。由于依赖关系,该重 构并不能应用于所有实例,但人们还是经常低估它的价值。

最终的代码应该是这样的:

public class BankAccount
{public BankAccount(int accountAge, int creditScore, AccountInterest accountInterest){AccountAge = accountAge;CreditScore = creditScore;AccountInterest = accountInterest;}public int AccountAge { get; private set; }public int CreditScore { get; private set; }public AccountInterest AccountInterest { get; private set; }
}public class AccountInterest
{public BankAccount Account { get; private set; }public AccountInterest(BankAccount account){Account = account;}public double InterestRate{get { return CalculateInterestRate(); }}public bool IntroductoryRate{get { return CalculateInterestRate() < 0.05; }}public double CalculateInterestRate(){if (Account.CreditScore > 800)return 0.02;if (Account.AccountAge > 10)return 0.03;return 0.05;}
}

3.上拉法

上移方法(Pull Up Method)重构是将方法向继承链上层迁移的过程。用于一个方法被多个实现者使用时。

public abstract class Vehicle
{// other methods 
}public class Car : Vehicle
{public void Turn(Direction direction){// code here }
}public class Motorcycle : Vehicle
{
}public enum Direction
{Left,Right
}

        如你所见,目前只有 Car 类中包含 Turn 方法,但我们也希望在 Motorcycle 类中使用。因此,如果没有基类, 我们就创建一个基类并将该方法“上移”到基类中,这样两个类就都可以使用 Turn 方法了。这样做唯一的 缺点是扩充了基类的接口、增加了其复杂性,因此需谨慎使用。只有当一个以上的子类需要使用该方法时 才需要进行迁移。如果滥用继承,系统将会很快崩溃。这时你应该使用组合代替继承。重构之后的代码如 下:

public abstract class Vehicle
{public void Turn(Direction direction){// code here }
}public class Car : Vehicle
{
}public class Motorcycle : Vehicle
{
}public enum Direction
{Left,Right
}

4.下推法

昨天我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作。重构 前的代码如下:

public abstract class Animal
{public void Bark(){// code to bark }
}public class Dog : A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20197.shtml

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

相关文章

Camunda BPM架构

Camunda BPM既可以单独作为流程引擎服务存在,也能嵌入到其他java应用中。Camunda BPM的核心流程引擎是一个轻量级的模块,可以被Spring管理或者加入到自定义的编程模型中,并且支持线程模型。 1,流程引擎架构 流程引擎由多个组件构成,如下所示: API服务 API服务,允许ja…

逻辑回归分类算法

文章目录 算法推导 线性回归解决连续值的回归预测&#xff1b;而逻辑回归解决离散值的分类预测&#xff1b; 算法推导 逻辑回归可以看作是两部分&#xff0c;以0、1分类问题说明&#xff1b; 线性回归部分 对于一个样本 x i x_i xi​&#xff0c;有n个特征 x i ( 1 ) x_i^{(1)…

蒙自源儿童餐新品上市,引领健康美味新潮流

随着夏日的热烈与儿童节的欢乐氛围到来&#xff0c;蒙自源品牌隆重推出儿童餐新品&#xff0c;以“快乐不分大小&#xff0c;谁还不是个宝宝”为主题&#xff0c;为广大消费者带来一场健康与美味的盛宴。新品上市活动将于5月25日举行&#xff0c;蒙自源将以其独特的产品魅力和创…

install

目录 1、 install 1.1、 //creates form with validation 1.2、 onStepChanging: function (event, currentIndex, newIndex) { 1.3、 onFinishing: function (event, currentIndex) { 1.4、 //init inst

最新 HUAWEI DevEco Studio 调试技巧

最新 HUAWEI DevEco Studio 调试技巧 前言 在我们使用 HUAWEI DevEco Studio 编辑器开发鸿蒙应用时&#xff0c;免不了要对我们的应用程序进行代码调试。我们根据实际情况&#xff0c;一般会用到以下三种方式进行代码调试。 肉眼调试法注释排错调试法控制台输出法弹出提示法断…

【算法实战】每日一题:将某个序列中内的每个元素都设为相同的值的最短次数(差分数组解法,附概念理解以及实战操作)

题目 将某个序列中内的每个元素都设为相同的值的最短次数 1.差分数组&#xff08;后面的减去前面的值存储的位置可以理解为中间&#xff09; 差分数组用于处理序列中的区间更新和查询问题。它存储序列中相邻元素之间的差值&#xff0c;而不是直接存储每个元素的值 怎么对某…

STM32 入门教程(江科大教材)#笔记2

3-4按键控制LED /** LED.c**/ #include "stm32f10x.h" // Device headervoid LED_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_I…

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…

微信小程序中应用van-calendar时加载时间过长,以及设置min-data无效的问题解决

一、我们微信小程序中应用van-calendar时&#xff0c;如果没有设置min-data&#xff0c;那么页面的加载时间会非常长&#xff0c;所以&#xff0c;一定一定要配置min-data&#xff1b; 二、vue中min-data的写法是:min-data“new Date(2023, 0, 1)”&#xff0c;而在小程序中的写…

docker使用docker logs命令查看容器日志的几种方式

以下是如何使用docker logs命令的基本示例&#xff1a; docker logs [容器ID或名称]如果想要实时查看日志&#xff0c;可以加上-f参数&#xff0c;这样日志就会像使用tail -f命令一样实时输出。 docker logs -f [容器ID或名称]如果只想查看最近几行的日志&#xff0c;可以使用…

让表单引擎插上AI的翅膀-记驰骋表单引擎加入AI升级

让表单引擎插上AI的翅膀 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们工作和生活的每一个角落。在数字化办公领域&#xff0c;表单引擎作为数据处理和流程自动化的重要工具&#xff0c;也迎来了与AI技术深度融合的新机遇。让表单引擎…

Java对象的比较——equals方法,Comparable接口,Comparator接口

Java对象的比较——equals方法&#xff0c;Comparable接口&#xff0c;Comparator接口 1. equals方法2. Comparable接口3. Comparator接口 1. equals方法 在判断两个整数是否相同时&#xff0c;我们可以使用以下方式&#xff1a; System.out.println(1 2); System.out.printl…

安防综合管理系统EasyCVR平台GA/T1400视图库:基于XML的消息体格式

GA/T 1400标准的应用范围广泛&#xff0c;涵盖了公安系统的视频图像信息应用系统&#xff0c;如警务综合平台、治安防控系统、交通管理系统等。在视频监控系统中&#xff0c;GA/T 1400公安视图库的对接是实现视频图像信息传输、处理和管理的重要环节。 以视频汇聚EasyCVR视频监…

【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖

父子项目工程创建 步骤 先创建父项目 具体操作步骤请看本文章&#xff1a;使用maven工程创建spring boot项目 创建子项目 file- project structure module–new module 剩下步骤请看创建父工程时的操作使用maven工程创建spring boot项目 应用 确认即可 之后创建启动类…

ARM32开发——LED驱动开发

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求介绍现实问题需求分析测试案例构建BSP驱动构建业务实现 需求介绍 开发版中有4个灯&#xff0c;现在需要用4个灯显示充电情况&a…

618大促有哪些好物是最值得入手的的?请收下这份618必买好物清单!

最近聊的最多的话题就是618&#xff0c;年中购物大狂欢马上来了&#xff01;&#xff01;今天整理了一下之前购买的好物&#xff0c;发现相比之前的价格真的是太划算了&#xff0c;赶紧分享出来给大家&#xff0c;趁着这个大促赶紧多存入手~ 推荐1、南卡Neo 2——不伤耳黑科技…

SPHINX的输出文档格式

SPHINX的输出文档格式 SPHINX的输出文档格式更多信息 SPHINX的输出文档格式 用rst编写&#xff0c;然后用sphinx-build进行编译&#xff0c;还是效果相当不错地&#xff0c;只要掌握了格式&#xff0c;可以一次编译&#xff0c;多种格式输出&#xff0c;主要是用的可能是html和…

记一次netty客户端的开发

背景 近日要开发一个tcp客户端程序去对接上游厂商的数据源&#xff0c;决定使用netty去处理&#xff0c;由于很久没有开发过netty了&#xff0c;顺便学习记录下 netty搭建 考虑到我们需要多个client去对接server服务&#xff0c;所以我们定义一个公共的AbstractNettyClient父…

机器学习:人工智能中实现自动化决策与精细优化的核心驱动力

机器学习在人工智能中确实扮演着实现自动化决策与精细优化的核心驱动力角色。以下是关于这一点的详细分析: 一、机器学习在自动化决策中的应用 数据驱动:机器学习依赖于大量的数据来进行模型训练和评估,从而确保决策的准确性。通过自动化数据分析和处理,机器学习能够从海量…

LabVIEW与Arm控制器之间的通讯

LabVIEW是一个强大的图形化编程环境&#xff0c;广泛应用于自动化控制、数据采集和测试测量等领域。而Arm控制器则是嵌入式系统中常用的处理器架构&#xff0c;广泛用于各种控制和计算任务。将LabVIEW与Arm控制器进行通讯控制&#xff0c;可以结合二者的优势&#xff0c;实现高…