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

C# 中提取方法进行重构

文章目录

  • 1、什么是提取方法重构技术?
  • 2、提取方法重构 C# 代码示例
  • 3、提取方法重构技术的好处
  • 4、提取方法重构有用的场景
  • 5、总结 C# 中的提取方法重构技术


1、什么是提取方法重构技术?

重构代码是软件工程师的一项重要技能,因为它有助于提高代码库的可读性和可维护性。其中一种可以极大地帮助我们实现这一目标的技术就是 Extract Method 技术。我经常使用它,几乎在编写一些代码后我都会立即使用它!

提取方法技术涉及提取方法中的代码块并将其提取到单独的方法中。通过这样做,我们可以将代码分解成更小、更易于管理的部分,从而提高代码的清晰度和可理解性。不要等到你有一个 2000 行的方法才明白为什么这很有用!

2、提取方法重构 C# 代码示例

为了演示这种技术,请考虑以下 C# 中的订单处理示例:

public class OrderProcessing
{public void ProcessOrder(Order order){Console.WriteLine("Processing order...");// Calculate order totaldouble total = 0;foreach (var item in order.Items){total += item.Price * item.Quantity;}// Apply discountif (order.Customer.IsPremium){total *= 0.9; // 10% discount for premium customers}// Add taxtotal *= 1.2; // Assuming a fixed tax rate of 20%// Print order summaryConsole.WriteLine($"Order ID: {order.Id}");Console.WriteLine($"Customer: {order.Customer.Name}");Console.WriteLine($"Total due: {total:C}");Console.WriteLine("Order processed.");}
}

在上面的代码中,这个类只有一个方法,但具有多项职责。虽然我并不特别注重使用单一职责原则,但我认为它作为指导还是很有用的。这个单一方法处理客户订单,包括计算订单总额、应用折扣、添加税费和打印订单摘要。最初,这些操作都在一个方法中完成,这可能会使代码难以阅读和维护——尤其是随着时间的推移,人们不断添加更多代码。

让我们考虑以下使用提取方法重构技术的代码:

public class OrderProcesser
{public void ProcessOrder(Order order){Console.WriteLine("Processing order...");double total = CalculateOrderTotal(order);total = ApplyDiscount(total, order.Customer);total = AddTax(total);PrintOrderSummary(order, total);Console.WriteLine("Order processed.");}private double CalculateOrderTotal(Order order){double total = 0;foreach (var item in order.Items){total += item.Price * item.Quantity;}return total;}private double ApplyDiscount(double total, Customer customer){if (customer.IsPremium){return total * 0.9; // 10% discount for premium customers}return total;}private double AddTax(double total){return total * 1.2; // Assuming a fixed tax rate of 20%}private void PrintOrderSummary(Order order, double total){Console.WriteLine($"Order ID: {order.Id}");Console.WriteLine($"Customer: {order.Customer.Name}");Console.WriteLine($"Total due: {total:C}");}
}

在重构版本中,我提取了用于计算订单总额、应用折扣、添加税费和打印订单摘要的方法。通过清晰地分离关注点,这提高了可读性,并通过允许每个功能单独重用,提高了可重用性。虽然对于这个简单的例子来说,这只是小事一桩,但希望这能清楚地说明这个概念!

3、提取方法重构技术的好处

提取方法技术是我们拥有的最基本的重构工具之一,但它本身就为我们带来了好处。除了作为更复杂的重构技术的基石之外,它还提高了我们代码的可读性。通过创建专注于单一职责的较小、不言自明的方法,代码可以变得更具表现力和易懂。这使得其他开发人员更容易阅读和维护代码。即使前面的示例很简单,您也可以看到,这使我们更接近代码的单一职责设置。

其次,它提高了代码的可重用性。通过将代码块提取到单独的方法中,我们可以轻松地在代码库中的多个位置重复使用它。这减少了重复并强制执行了 DRY(不要重复自己)原则。如果我们需要扩展 OrderProcesser 类,我们可以利用折扣和税费计算以及在需要时打印出订单摘要。

4、提取方法重构有用的场景

提取方法重构技术在以下场景中特别有用:

方法内的代码块变得太长且太复杂——通过将代码提取到单独的方法中,我们可以使原始方法更简洁、更易于理解。
通用功能需要在不同的方法中重用——将通用功能提取到单独的方法中可以促进代码重用并消除重复。
一个方法负责多个关注点——通过将方法的特定部分提取到单独的方法中,我们可以提高代码的清晰度和可维护性。
提取方法重构技术是一种基本的重构技术,一旦开始使用,它几乎会成为您编码的第二天性。通过将复杂的方法分解为更小、更集中的方法,我们可以创建更易于理解和维护的代码。

5、总结 C# 中的提取方法重构技术

重构涉及许多工具、技能和技术,需要练习才能掌握。提取方法重构技术是我们必须使用的重构基础方面之一。我们可以利用它来重用代码,并通过将逻辑分组到方法中来使代码的意图更加明显。

相关文章:

C# 中提取方法进行重构

文章目录 1、什么是提取方法重构技术?2、提取方法重构 C# 代码示例3、提取方法重构技术的好处4、提取方法重构有用的场景5、总结 C# 中的提取方法重构技术 1、什么是提取方法重构技术? 重构代码是软件工程师的一项重要技能,因为它有助于提高…...

每天一个数据分析题(三百四十三)

同环比是帮助阅读者了解维度项表现水平有没有随着时间的推移而得以增长提升,以下对于同环比的说法正确的是? A. 同环比计算方法一般适用于对长周期业务行为结果的观测 B. 若产品具备季节属性特征,则应优先使用同比计算方法 C. 上期值一般指…...

【leetcode--统计优美子数组】

解题思路 一、滑动窗口 不断右移 right 指针来扩大滑动窗口,使其包含 k 个奇数; 若当前滑动窗口包含了 k 个奇数,则如下「计算当前窗口的优美子数组个数」: 统计第 1 个奇数左边的偶数个数 leftEvenCnt。 这 leftEvenCnt 个偶数…...

开源模型应用落地-LangChain高阶-LCEL-表达式语言(二)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...

shell脚本对编码和行尾符敏感吗

问题 我正在 macOS 上制作一个 NW.js 应用程序,并想通过双击图标在开发模式下运行该应用程序。在第一步中,我试图使我的 shell 脚本正常工作。 在 Windows 上使用 VS Code,我在项目的根目录下创建了一个 run-nw 文件,包含以下内…...

神经网络----现有网络的下载和使用(vgg16)

以下两种方法已经用不了 vgg16_false torchvision.models.vgg16(pretrainedFalse) vgg16_true torchvision.models.vgg16(pretrainedTrue) 改为 vgg16_model0 vgg16(weightsNone) #vgg16_false vgg16_model1 vgg16(weightsVGG16_Weights.DEFAULT) # pretrained vgg16_…...

Java 异常处理 - 自定义异常

在Java中,自定义异常是一种创建新异常类的方式,这些异常类继承自Throwable类或其子类Exception(或RuntimeException,如果它是运行时异常的话)。自定义异常通常用于描述特定于应用程序的错误情况,以便为调用…...

Excel 交叉表的格转成列,行转成格

Excel里交叉表的左表头是卡车号,上表头是工作,交叉格是工作编号。 ABCD1Truck NumberJob1Job2Job3271592859285928372395859282971473297159282971 要求:将交叉格转为列,左表头转为格。 ABC1297139585928272727137371473715726…...

【C++软件调试技术】什么是pdb文件?如何使用pdb文件?哪些工具需要使用pdb文件?

目录 1、什么是pdb文件? 2、如何配置生成pdb文件? 3、pdb文件的时间戳和文件名称 3.1、pdb文件的时间戳 3.2、pdb文件的文件名称 4、有pdb文件才能在Visual Studio中调试代码 5、在Windbg中使用pdb文件 5.1、使用lm命令查看二进制文件的时间戳,去查找对应版本的pdb文…...

如何搭建一台永久运行的个人服务器?

一、前言 由于本人在这段时候,看到了一个叫做树莓派的东东,初步了解之后觉得很有意思,于是想把整个过程记录下来。 二、树莓派是什么? Raspberry Pi(中文名为树莓派,简写为RPi,(或者RasPi / RPI) 是为学习计算机编程…...

Ant Design+react 表单只读

表单禁用,样式不好看,不符合甲方标准,看了一下文档,select、radio等都不支持只读状态。 解决方法: 利用css3的point-events属性,设置为none 在查看弹窗时,传入一个变量,当变量为true…...

推荐系统三十六式学习笔记:原理篇.近邻推荐07|人以群分,你是什么人就看到什么世界

目录 协同过滤基于用户的协同过滤背后的思想原理实践1、构造矩阵2、相似度计算3、推荐计算4、一些改进 应用场景:总结 谈及推荐系统,不得不说大名鼎鼎的协同过滤。协同过滤的重点在于协同,所谓协同,也就是群体互帮互助&#xff0c…...

要改进单例模式的实现以确保线程安全并优化性能,有几种常见的方法

要改进单例模式的实现以确保线程安全并优化性能,有几种常见的方法。以下是几种改进 ThreadUtil 单例实现的方法: ### 1. 懒汉式(线程安全版) 使用同步机制来确保线程安全,但只在第一次创建实例时同步,这样…...

k8s——Pod容器中的存储方式及PV、PVC

一、Pod容器中的存储方式 需要存储方式前提:容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。 首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态&…...

Java/Golang:活用interface,增加程序扩展性

场景 在paas中间件众多的场景下,做一款用于巡检多个paas组件健康状态的工具。工具的编写需要具备一定的扩展性,便于后续新增某个paas组件巡检的功能。 管理多个paas组件,需要方便扩展新增。 思路 使用面向对象编程思想,首先对…...

SQL语句练习每日5题(四)

题目1——查找GPA最高值 想要知道复旦大学学生gpa最高值是多少,请你取出相应数据 题解: 1、使用MAX select MAX(gpa) FROM user_profile WHERE university 复旦大学 2、使用降序排序组合limit select gpa FROM user_profile WHERE university 复…...

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一):冒泡排序 Java排序算法(二):选择排序 Java排序算法(三):插入排序 Java排序算法(四):快速排序 Java排序算法(五):归并排序 Java排序算法(六):希尔排序 Java排序算法(…...

R语言探索与分析20-北京市气温预测分析

一、序言 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。气象温度的预测一直以来都是天气预…...

2024年安全现状报告

2024 年安全现状报告有些矛盾。尽管安全专业人员的道路困难重重,比如说严格的合规要求、不断升级的地缘政治紧张局势和更复杂的威胁环境,但整个行业还是在取得进展。 许多组织表示,与前几年相比,网络安全变得更容易管理。组织之间…...

OV通配符ssl证书是什么

通配符https证书的产品比较丰富,为了方便区分,可以按照验证方式将通配符https证书分为DV基础型通配符https证书和OV企业型通配符https证书两种。其中OV通配符https证书申请条件高,审核也比较严格,相比于DV基础型通配符https证书&a…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...