重构长方法之提取方法

devtools/2024/10/9 4:58:15/

本篇文章将讲解解决长方法的6钟解决方案中的提取方法
1. 什么是长方法
长方法通常指的是代码中功能过于复杂或包含过多逻辑的函数或方法。这种方法往往难以阅读、理解和维护,可能违反单一职责原则。为了提高可读性和可维护性,建议将长方法拆分成多个小方法,每个方法负责一个具体的功能。

2. 提取方法
我们先来看一段代码:

public void ProcessData(List<int> numbers)
{if (numbers == null || !numbers.Any()){Console.WriteLine("No data to process.");return;}int sum = 0;int count = 0;List<int> processedNumbers = new List<int>();foreach (var number in numbers){if (number > 0){sum += number;processedNumbers.Add(number * 2);count++;}}double average = count > 0 ? (double)sum / count : 0;Console.WriteLine($"Processed {count} positive numbers.");Console.WriteLine($"Sum: {sum}, Average: {average}");Console.WriteLine("Processed Numbers: " + string.Join(", ", processedNumbers));
}

我们阅读这段代码,发现在这个方法包含了多个职责,比如处理输入、计算总和和平均值、生成输出。这么多职责都写在了一个方法里,想要弄清这个方法功能就稍显困难(方法中的行数/职责越多,就越难弄清该方法的功能)。
使用提取方法这个解决方案可以轻松的处理前面所说的问题,我们一起来看一下更新后的代码:

public void ProcessData(List<int> numbers)
{if (!ValidateInput(numbers)) return;var processedData = ProcessNumbers(numbers);DisplayResults(processedData);
}private bool ValidateInput(List<int> numbers)
{if (numbers == null || !numbers.Any()){Console.WriteLine("No data to process.");return false;}return true;
}private (int Sum, double Average, List<int> ProcessedNumbers) ProcessNumbers(List<int> numbers)
{int sum = 0;int count = 0;List<int> processedNumbers = new List<int>();foreach (var number in numbers){if (number > 0){sum += number;processedNumbers.Add(number * 2);count++;}}double average = count > 0 ? (double)sum / count : 0;return (sum, average, processedNumbers);
}private void DisplayResults((int Sum, double Average, List<int> ProcessedNumbers) data)
{Console.WriteLine($"Processed {data.ProcessedNumbers.Count} positive numbers.");Console.WriteLine($"Sum: {data.Sum}, Average: {data.Average}");Console.WriteLine("Processed Numbers: " + string.Join(", ", data.ProcessedNumbers));
}

通过提取方法对不同的职责进行封装,我们看到代码既清晰又容易理解,而且更加易维护了。
3. 提取方法的步骤
首先,分析出长方法中所包含的职责,然后根据这些职责创建多个新方法,接着将每种职责的代码复制到对应的新方法中,紧接着从长方法中删除这些代码,并替换为对新方法的调用,最后查找每种职责代码中使用的变量,如果这些变量是在职责代码片段中声明的并且没有在片段外使用,那么只需将它们将做为新方法的局部变量即可。如果变量是在多种职责代码都在用的,则需要将这些变量作为传递给新方法的参数,以便使用其中之前。

4. 提取方法的优点
首先使代码更易读,这里要注意的是提取的方法的名称一定要是对方法体内代码职责的喵叔。其次减少代码重复,方法中的代码可以在程序的其他地方重复使用。 然后每个方法中的代码是独立的,这就表示出错的可能性较低,即使出错了排查和修改也简单。


http://www.ppmy.cn/devtools/120796.html

相关文章

Spring Boot 和 MyBatis-Plus凑一块儿了,这份教程你得看

一、引言 MyBatis-Plus 是 MyBatis 的增强版&#xff0c;提供了 CRUD 接口、分页插件、性能分析插件等特性&#xff0c;简化了开发过程。本文将详细介绍如何在 Spring Boot 项目中集成 MyBatis-Plus。 支持的数据看也越来越多&#xff0c;值得去搞一下&#xff0c;写了一个小例…

前端编程艺术(2)----CSS

目录 1.CSS 2.CSS引入 3.选择器 1.标签选择器 2.类选择器 3.id选择器 4.属性选择器 5.后代选择器 5.直接子元素选择器 6.伪类选择器 链接相关 动态伪类 结构化伪类 否定伪类 其他伪类 UI元素状态伪类 4.字体 1.font-family 2.font-size 3.font-style 4.fo…

Vue.js组件开发教程

Vue.js 组件开发教程 Vue.js 是一款流行的前端框架&#xff0c;组件是其核心概念之一。通过将页面拆分为可复用的组件&#xff0c;可以提高代码的可维护性和可重用性。本教程将带您一步步学习如何开发 Vue.js 组件。 目录 什么是组件创建一个简单的组件组件注册 全局注册局部…

Mybatis(进阶部分)

四 Mybatis完成CURD&#xff08;二&#xff09; 4.5 多条件CRUD 之前的案例中&#xff0c;接口里方法的形参个数都是1个&#xff1b;如果方法形参是两个或者两个以上时&#xff0c;MyBatis又该如何获取获取参数呢&#xff1f; Mybatis提供了好几种方式&#xff0c;可以获取多…

Linux之进程概念

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux专栏 创作时间 &#xff1a;2024年9月28日 基本概念&#xff1a; 进程说白了其实就是一个程序的执行实例&#xff0c;正在执行的程序。 在内核层面来说&#xff0c;就是一个担当分配资源&#xff08;CPU时间…

Lazada API 获取商品详细数据信息指南

以下是一个使用 Python 的 requests 库与 Lazada API 进行交互以获取商品详细数据信息的示例代码。请注意&#xff0c;以下代码仅为示例结构&#xff0c;实际的 API 端点、认证方式和参数需要根据 Lazada 的实际 API 文档来确定和调整。 python import requests import js…

扣子创建的智能体,发布成api,使用java进行调用

扣子平台的api是我见过最不友好的&#xff0c;折腾了半天才调通。基础版和专业版&#xff0c;建议还是选择专业版吧&#xff08;因为相同的问题会得到不同的结果&#xff09; public static void main(String[] args) { String prompt ““输入下面的信息&#xff1a;我路过街…

如何配置路由器支持UDP

一、UDP协议简介 UDP是一种传输层协议&#xff0c;与TCP&#xff08;传输控制协议&#xff09;不同&#xff0c;它不需要建立连接&#xff0c;因此传输速度较快。由于UDP不需要确认数据包的接收状态&#xff0c;它适用于不需要严格数据完整性但需要低延迟的场景。 常见的UDP应…