当前位置:首页 > 技术文章 > 用通义灵码维护遗留代码的正确姿势

用通义灵码维护遗留代码的正确姿势

go1232个月前 (10-22)技术文章135

通义灵码,阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云的云服务使用场景调优,助力开发者高效、流畅的编码。点击此处下载插件,免费使用!本文首先介绍了遗留代码的概念,并对遗留代码进行了分类。针对不同类型的遗留代码,提供了相应的处理策略。此外,本文重点介绍了通义灵码在维护遗留代码过程中能提供哪些支持。什么是遗留代码与过时技术相关的代码:与不再受支持的操作系统或软件

通义灵码,阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云的云服务使用场景调优,助力开发者高效、流畅的编码。

点击此处下载插件,免费使用!

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

什么是遗留代码

与过时技术相关的代码:

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

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

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

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

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

缺乏文档和维护的代码:

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

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

解决遗留代码的方法

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

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

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

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

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

单元测试常见的误区

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

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

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

选择性的进行单元测试

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

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

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

分类标准

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

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

四个象限

圈复杂度与依赖的概念理解

  • 圈复杂度(Cyclomatic Complexity):衡量代码中逻辑分支的数量。

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

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

不同类型代码的处理策略

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

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

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

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

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

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

1. 了解项目工程

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

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

针对算法类(Algorithms)代码生成单元测试

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

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

针对协调类代码(Coordinators)进行接口测试

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

针对用例的编写,可以选择相应的被测函数,并在问答区中直接提问:基于Robot Framework生成以下代码的测试用例。沿着这一思路,同样可以实现相应的Keywords等内容。

超复杂的代码(Overcomplicated Code)找机会进行重构

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

针对复杂遗留代码的优化,并不建议开发者们盲目进行全面的优化和重构。遗留代码的变更可能会带来巨大的风险。因此,开发者应根据具体情况,在合适的机会,遵守童子军法则,进行重构和优化。在这一过程中,通义灵码也将为您提供有力支持。

结语

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

点击此处立即下载插件,免费使用!


声明:本站所有内容均为自动采集而来,如有侵权,请联系删除
标签: 测试单元

相关文章

Redis连环五十二问!看谁顶得住?

Redis连环五十二问!看谁顶得住?

基本 1.说说什么是Redis? Redis是一种基于键...

用 PHP 处理 10 亿行数据!

用 PHP 处理 10 亿行数据!

今天,我将带大家一起走进“挑衅十亿行“数据的世界。当然,这个事情是依据GitHub上的一个“十亿行挑衅”(1brc)运动而来,现在正在进行,如果你没有听说过,可查看Gunnar Morlings 的 1brc 存储库。https://github.com/gunnarmorling/1brc我之所以...

2024 年的最佳 PHP 框架

2024 年的最佳 PHP 框架

在本文中,我们将预测在 2024 年持续风行的最佳 PHP 框架。我们首先将看看PHP框架是什么,什么时候该斟酌应用PHP框架,以及应用PHP框架的重要长处都是什么。我还会介绍最合适初学者的 PHP 框架以及用于 Web 开发的最佳框架。什么是PHP框架?     &...

一文读懂多家厂商的大模型训练、推理、部署策略

一文读懂多家厂商的大模型训练、推理、部署策略

4 月 20 日,第 102 期源创会在武汉胜利举行。本期邀请来自武汉人工智能研讨院、华为、MindSpore、京东云、Gitee AI 的人工智能专家,环绕【大模型竞技与性能优化】主题发表演讲。接下来就一起看看本期运动的出色瞬间吧!大合影 get ✅披萨和礼物不能少!接下来进入主题演讲回想环节。可...

请立刻停止编写 Dockerfiles 并使用 docker init

请立刻停止编写 Dockerfiles 并使用 docker init

您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗?我承认,我就是其中之一。我总是想知道我是否遵守了 Dockerfile、 docker-compose 文件的最佳编写实践,我畏惧在不知不觉中引入了安全破绽。但是现在,我不必再担忧这个问题了,感激...

服务器为什么大多用 Linux 而不是 Windows ?

服务器为什么大多用 Linux 而不是 Windows ?

前几天在知乎看到一个话题很有意思,且很有讨论意义。“服务器为什么大多用 Linux”,除了开源、好用等原因,回答也代表了各种不同人需求和看法,摘取一些分享给大家,也欢迎留言讨论。来自知乎好友“熊大你又骗俺”的回答首先在20年前,windows server+iis+asp+access 的方案,还是...