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

重构长方法之提取方法

本篇文章将讲解解决长方法的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.kler.cn/news/325703.html

相关文章:

  • 9.26-9.29学习
  • 信息安全数学基础(21)高次同余式的解数及解法
  • 【C++题目】7.双指针_和为 s 的两个数字
  • Python | Leetcode Python题解之第447题回旋镖的数量
  • 【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
  • 【C++——文件操作】
  • Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo
  • Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】
  • 四十四、多云/混合云架构设计(安全与合规策略)
  • watchEffect工作原理
  • docker学习笔记(1.0)
  • 面经4——亚信
  • Visual Studio Code 高级使用技巧:插件推荐、调试技巧与工作流优化
  • 【HTML5】html5开篇基础(5)
  • 怎么屏蔽统计系统统计到的虚假ip
  • 【分布式微服务云原生】探索RPC:远程过程调用的奥秘与技术实现
  • 汽车信息安全 -- 再谈车规MCU的安全启动
  • 【小程序 - 大智慧】Expareser 组件渲染框架
  • CSS学习 - 常用属性
  • python自动更新chromedriver
  • ExpansionPanelList组件的用法
  • 【Android 14源码分析】Activity启动流程-2
  • 大模型使用vLLM推理加速
  • 一篇讲完HTML核心内容
  • 超大规模钢筋计数数据集,共23400组图像,多视角,多角度,多场景,采用voc方式标注 智慧工地资产盘点
  • 【Linux 22】生产者消费者模型
  • 多线程(一):线程的基本特点线程安全问题ThreadRunnable
  • 新买的笔记本电脑如何打开和使用显示卡的问题
  • Windows11系统下Docker环境搭建教程
  • 每天一个数据分析题(四百七十四)- 柱状图