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# 中的提取方法重构技术

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

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

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

相关文章

C++ AVL树 详细讲解

目录 一、AVL树的概念 二、AVL树的实现 1.AVL树节点的定义 2.AVL树的插入 3.AVL树的旋转 4.AVL树的验证 三、AVL树的性能 四、完结撒❀ 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查 …

Redis限流方案

限流简介 限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压,是一个需要重视的问题。 除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求&a…

Python基础语法(五):循环语句

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

企业公户验证API在Java、Python、PHP中的使用教程

在金融和商业领域,企业公户验证API是一种用于验证企业对公账户的真实性和合法性的技术解决方案。这种API通常由金融机构或第三方服务提供商提供,旨在帮助企业加快账户认证流程,提高效率,降低审核成本,并确保符合法规要…

苹果Safari怎么清理缓存?原来快速清除浏览器的历史记录那么容易

在数字化时代,互联网已经成为我们日常生活中不可或缺的一部分。我们使用各种设备,如智能手机、平板电脑和笔记本电脑来浏览网页、获取信息、娱乐和社交。而在这些设备中,iPhone无疑是最受欢迎的选择之一。iPhone搭载的Safari浏览器以其简洁的…

ui自动化中,鼠标操作

from selenium.webdriver import ActionChainsaction ActionChains(driver) # 然后把driver作为参数,实例化一个action对象 练习地址:https://sahitest.com/demo/ 悬停例子(百度首页) action.move_to_element(ele).perfor…

深入浅出服务网格(Service Mesh):现代微服务架构的护航者

什么是服务网格? 服务网格是一种专用于处理微服务间通信的基础设施层,通常以轻量级代理(sidecar)的形式部署在每个服务实例旁边。它主要负责以下几项任务: 服务发现:自动检测和注册服务实例,使…

Springboot注意点

1.Usermapper里加param注解 2.RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody的区别: RequestParam 和 RequestBody 是Spring框架中用于处理HTTP请求的两个不同的注 get请求一般用url传参数,所以参数名和参数的值就在ur…

Type-C音频转接器方案

在数字化时代,音频设备作为我们生活中不可或缺的一部分,其连接方式的便捷性和高效性显得尤为重要。Type-C音频转接器,作为一种新型的音频连接解决方案,正逐渐走进我们的生活,以其独特的优势改变着我们的音频体验。 一、…

Vue Router 4与路由管理实战

title: Vue Router 4与路由管理实战 date: 2024/6/7 updated: 2024/6/7 excerpt: 这篇文章介绍了如何在Vue.js应用中利用Vue Router实现单页面应用的路由管理,包括配置路由、导航守卫的使用、路由懒加载以优化性能以及动态路由的实现方法,旨在提升用户体…

Python3 笔记:字符串的 strip()、lstrip()、rstrip()

1、strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。 语法:str.strip([chars]) chars:移除字符串头尾指定的字符序…

JAVA多维动态数组

JAVA多维动态数组 一维数组数组大小 size()增加元素 add获取元素 get删除元素 remove修改元素 set输出 二维数组三维数组 ArrayList 类是一个可以动态修改的数组(队列),与普通数组的区别就是它是没有固定大小的限制,提供了相关的添…

xiaolingcoding 图解网络笔记——基础篇

文章目录 参考一、网络模型有哪几层DMANAPI 机制二、键入网址到网页显示,期间发生了什么?1. HTTP2. DNS3. 协议栈4. TCP5. IP6. MAC7. 网卡8. 交换机9. 路由器10. 服务器 与 客户端的互相扒皮(添加、删除头部信息)参考图HTTP 请求…

Vue3【六】setup的使用和setup的返回值

Vue3【六】setup的使用和setup的返回值 setup函数的使用,和vue2的选项式不同 vue3的组合式使用的是setup函数 通过返回值将数据和方法传到页面 返回值也可以是一个箭头函数 setup先于 data和method执行所有无法读取到this和data,method的内容&#xff0c…

顶顶通呼叫中心中间件-asr录音路径修改(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-asr录音路径修改(mod_cti基于FreeSWITCH) 录音路径模板。如果不是绝对路径,会把这个路径追加到FreeSWITCH的recordings后面。支持变量,比如日期 ${strftime(%Y-%m-%d)}。最后一个录音文件路径会保存到变量 ${cti_asr_last_record_…

几个日期和时间相关的函数,用于格式化日期、时间和毫秒数

几个日期和时间相关的函数,用于格式化日期、时间和毫秒数。 javascript /** 返回年月日param {Date} date - 日期对象param {string} [splitor‘-’] - 分隔符,默认为’-’returns {string} - 格式化后的日期字符串,格式为YYYY-MM-DD */ exp…

Vue3实现当访问的路由不存在时跳转到404页面的方法详解

Vue3实现当访问的路由不存在时跳转到404页面的方法详解 一、前言1. 创建 404 组件2. 配置路由3. 使用 router-link 一、前言 在 Vue 3 中,你可以使用 Vue Router 来实现当访问的路由不存在时跳转到 404 页面。以下是详细的方法: 1. 创建 404 组件 首先…

03-3.2.4 双端队列

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

1348:【例4-9】城市公交网建设问题

【解题思路】 该题难点是要保存最小生成树的所有边&#xff0c;对于不同的求最小生成树的算法&#xff0c;有不同的方法来完成。 【参考代码】 prim算法 #include<bits/stdc.h> using namespace std; const int N 105; // 定义常量 N&#xff0c;表示数组大小 int n…

Vue3 时间格式化

1、基础使用 https://juejin.cn/post/6933548549321785352 2、template里面直接使用 $dayjs(info.patientBirthday).format("YYYY-MM-DD") 3、script里面使用 import { ref, reactive, getCurrentInstance } from "vue"; const { proxy } getCurren…