用通义灵码如何快速合理解决遗留代码问题?

news/2024/9/28 23:06:47 标签: log4j

本文首先介绍了遗留代码的概念,并对遗留代码进行了分类。针对不同类型的遗留代码,提供了相应的处理策略。此外,本文重点介绍了通义灵码在维护遗留代码过程中能提供哪些支持。

什么是遗留代码

  • 与过时技术相关的代码:

    • 与不再受支持的操作系统或软件库相关的代码。

    • 依赖于已淘汰的技术栈或编程语言的代码。

  • 为兼容老旧功能而保留的代码:

    • 在现代软件中为了兼容旧版本功能而保留的代码片段。

    • 为了确保向后兼容性而不得不保留的代码。

  • 缺乏文档和维护的代码:

    • 没有良好文档支持的旧代码。

    • 缺乏现代开发实践(如单元测试、代码审查等)的代码。

解决遗留代码的方法

解决遗留代码有以下三种常见的处理方法:

处理方式

利弊

推翻重来

成本高,系统正在运行,会带来代码风险。

进行重构

补充单元测试

通过单元测试识别现有代码中的问题,为未来可能的代码变更提供质量保障。

根据上述描述,补充单元测试是一种有效解决遗留代码问题的方法。然而,这种方法仍然存在一些问题:

  • 大量遗留代码缺少单元测试,并且由于代码间的复杂依赖关系,进行测试的成本非常高。

  • 具体的衡量标准却不够清晰,无法定义好的单元测试。

  • 哪些代码需要添加单元测试?

单元测试常见的误区

  • 缺乏断言的假单元测试:开发者可能会采取仅调用函数而不进行断言的方式,以提高覆盖率指标,导致了许多无效的单元测试。

  • 把单元测试当成白盒测试:一些观点将单元测试归类为白盒测试,但实际上应将其视为针对函数签名的黑盒测试。

  • 依赖真实环境的单元测试:阻碍单元测试的主要因素包括惰性和依赖环境配置。若不使用Stub或Mock解除对外部环境(如网络IP、数据库)的依赖,单元测试将难以达到FIRST原则(快速、独立、可重复、自我验证、及时性)。

选择性的进行单元测试

单元测试除了带来收益外,本身也会产生一定的成本。如果从收益与成本的角度分析遗留代码,将有助于明确为遗留代码补充单元测试的策略,此策略被称为选择性单元测试。那么,如何界定成本与收益呢?

遗留代码单元测试的成本收益象限分类

针对遗留代码的单元测试,可以根据其成本和收益进行象限分类。根据下图,对分类标准和各象限进行详细说明:

组 1@1x (4)

分类标准
  • X轴(成本):代码依赖程度越高,测试成本越大。

  • Y轴(收益):代码复杂度越高,质量收益越大。

四个象限

代码分类

特性

描述

收益

成本

算法类代码(Algorithms Code)

圈复杂度高,扇入大。

包含较多条件判断和循环语句,依赖其他代码少,但被大量代码依赖。

琐碎代码

(Trivial Code)

圈复杂度小,扇入大。

通常是一些简单的方法,只有一两行代码。

协调类代码(Coordinators Code)

圈复杂度小,扇出大。

处于调用关系的上层,通过调用其他代码来反映特定业务场景。

复杂代码(Overcomplicated Code)

圈复杂度大,扇出大。

逻辑复杂,依赖多,函数冗长且参数繁多,是典型的代码异味。

圈复杂度与依赖的概念理解
  • 圈复杂度(Cyclomatic Complexity):衡量代码中逻辑分支的数量。

  • 扇入(Fan-In):直接调用该模块的上级模块的个数,扇入大表示模块的复用程度高。

  • 扇出(Fan-out):一个模块直接调用的其他模块的数量,扇出大表示该模块依赖其他模块越多。

不同类型代码的处理策略

根据上述的分析,遗留代码的处理策略就变得十分明确:

  • 算法类代码(Algorithms Code):生成单元测试。

  • 协调类代码(Coordinators Code):进行接口测试。

  • 复杂代码(Overcomplicated Code):寻找合适的机会进行重构。

  • 琐碎代码(Trivial Code):不做处理。

组 1@1x (3)

使用通义灵码处理遗留代码

1. 了解项目工程

在维护一个工程的遗留代码,首先可通过 @workspace 功能了解整个工程的目的及其涉及的各个模块。

整屏示例@1x (16)

2. 对不同类型代码进行处理

针对算法类(Algorithms)代码生成单元测试针对协调类代码(Coordinators)进行接口测试超复杂的代码(Overcomplicated Code)找机会进行重构

选中需要基于生产代码进行代码生成的部分。在生成时,请注意所需的框架及Mock等依赖信息,可以通过生成单元测试命令后追加相关信息进行补充。如 /generate unit testingCppUTest

对于协调类代码而言,单元测试并不是一种理想的解决方案,由于存在过多的依赖,测试成本显著提高。针对此类代码,应该采用接口测试或功能测试的方式进行覆盖,然而在编写自动化测试用例时,开发者常常会遇到相关问题。因此,可以通过通义灵码,快速掌握并理解测试框架。

针对超复杂的代码,可以使用通义灵码的 /generate optimization 命令,以获得针对所选代码的优化建议。代码审查与优化将从语法问题、异常改进、代码整洁度、安全性及风险等多个维度给出相应的优化建议。

一般而言,基于现有代码生成的单元测试用例数量通常较为有限。如果对单元测试的测试场景及用例数量有具体要求,可以在新生成的单元测试文件中,通过测试函数的续写方式生成更多的单元测试。在续写过程中,通义灵码将尽可能遵循已有用例,以此作为上下文进行参考。

1723362748120-1844d330-a97d-48bd-8315-bade66ecc5a7

结语

以上便是在处理遗留代码时可参考的实践。处理遗留代码需要深入代码的复杂结构,细致地追踪每一个可能的分支节点。在这一过程中,除了识别并修复潜在的缺陷外,还必须在有限的时间内完成所有任务。为了避免这一局面的发生,最佳的策略是预防代码的腐化,善用工具,并在编写初期遵循良好的编程原则。


http://www.niftyadmin.cn/n/5682027.html

相关文章

【linux进程】深度理解进程--什么是进程什么是pcb进程创建

目录 前言一,对PCB的理解二,CPU对进程列表的处理三,进程标识符:pid1. 查看系统进程1: ps axj2. 查看系统进程2: /proc 四,系统调用函数:getpid五,父进程和子进程的概念六,创建子进程--fork函数的使用1. 创建…

胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑

当AI遇上“记忆橡皮擦”,电量不再是问题! 嘿,朋友们,你们是否曾经因为手机电量不足而焦虑得像个无头苍蝇?想象一下,如果这种“电量焦虑”也蔓延到了AI界, 特别是那些聪明绝顶但“耗电如喝水”的…

map的键排序方法

1.对map中的key进行正序排序 Map<Integer, String> map Maps.newHashMap();// 原始map LinkedHashMap<Integer, String> sortedMap map.entrySet().stream().sorted(Map.Entry.comparingByKey()) // .collect(Collectors.toMap(Map.Entry::getKey…

【Python】Pythonic Data Structures and Algorithms:深入浅出数据结构与算法的 Python 实现

Pythonic Data Structures and Algorithms 是一个开源项目&#xff0c;汇集了各种经典数据结构和算法的 Python 实现。该项目旨在为开发者提供丰富的学习资源&#xff0c;帮助他们通过 Python 代码理解和掌握数据结构与算法的核心原理和应用。项目中的算法涵盖了排序、搜索、图…

Linux基础知识 + 常用命令

Linux基础 与Windows不同 1.Linux严格区分大小写 2.Linux中所有内容都已文件形式保存&#xff0c;包括硬件 3.Linux不靠拓展名区分文件类型 4.Windows下的程序不能直接在Linux中安装和运行 Linux管理 常用命令 ls 【选项】【文件或目录】 -a 全部 -l 详细 -h 人性化…

Java_集合_单列集合Collection

第一章.Collection接口 Collection<E> 集合名 new 实现类对象<E>() 常用方法: boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功) boolean addAll(Collection<? extends E> c) :将另一个集合元素添…

Linux系统中的重定向

目录 一、回顾重定向命令 1.输出重定向 > 2.追加重定向 >> 3.输入重定向 < 二、重定向原理 三、dup2函数 一、回顾重定向命令 1.输出重定向 > echo xxx > filename&#xff1a;将数据写入到文件中 文件不存在则创建文件再写入&#xff1b;文件存在则…

Redis哈希类型详解:从基础命令到实际应用

引言 前边介绍了 Redis 中字符串类型&#xff0c;现在接上篇文章继续学习 Redis 哈希类型的命令和实际应用 哈希&#xff08;Hash&#xff09;类型是一种非常实用的数据结构&#xff0c;以字段-值对的形式存储多个键值对。这里将详细介绍 Redis 哈希类型的使用方法、内部编码…