IDEA 通义灵码 插件使用体验

server/2024/9/19 18:50:59/ 标签: 经验分享, ai, AI编程
aidu_pl">

ain-toc">目录

前言

主要功能

演示代码

解释代码

生成单元测试

生成代码注释

生成优化建议

代码片段补全

总结


前言

自从 AI 技术开始大规模应用,老板就想让下面的牛马借助 AI 工具来提高编码效率,由于团队都没有在实际编码中深度使用过 AI 工具,所以专门调研了市面上比较出名的 AI 辅助写代码工具,实际尝试使用的有两个,一个是微软的 copilot,另一个是阿里的通义灵码。

总所周知的原因,国内使用 copilot 比较麻烦,所以最后在实践中还是使用了阿里的通义灵码,idea中直接安装 TONYYI Lingma 插件,使用支付宝账号直接登录就能免费使用了。

以下是对通义灵码的使用体验

主要功能

IDEA 安装通义灵码后,在打开的文件中右键,即可看到通义灵码选项,提供了五个功能:

  1. 解释代码
  2. 生成单元测试
  3. 生成代码注释
  4. 生成优化建议
  5. 代码片段补全

使用时,只需先选中代码片段,然后点击对应的选项,或者直接用快捷键。便能够快速生成想要的结果,辅助开发,提高效率。

演示代码

以下功能全都使用以下代码来做演示,是一个常见的列表查询接口,如果有关键字,则根据关键字模糊分页查询,否则直接分页查询,最后返回分页查询接口

public class ProductService {public PageVO<Product> getProducts(ProductQueryFrom form) {int page = Objects.isNull(form) ? 1 : form.getPage();int rows = Objects.isNull(form) ? 25 : form.getRows();Sort sort = Sort.by(Sort.Direction.DESC, "id");Pageable pageable = PageRequest.of(page - 1, rows, sort);Page<Product> pageEntity;if (Objects.nonNull(form) && StringUtils.hasText(form.getKeyWord())) {Specification<Product> spec = (root, query, builder) -> {Predicate target = builder.disjunction();target.getExpressions().add(target.getExpressions().add(builder.like(root.get("partNo"), "%" + form.getKeyWord() + "%"));return target;};pageEntity = productDao.findAll(spec, pageable);} else {pageEntity = productDao.findAll(pageable);}PageVO<Product> vo = new PageVO();vo.setList(pageEntity.getContent());vo.setTotal(pageEntity.getTotalElements());vo.setPages(pageEntity.getTotalPages());return vo;}
}

解释代码

生成的结果如下:

先整体概括了该方法实现的功能,再将方法实现的逻辑依次罗列了出来。

在工作中,需要维护到一些没有任何注释,且随意开发,不遵守规范的代码,再加上对业务逻辑不熟悉,维护起来是相当困难的。

使用该功能来解释不熟悉的代码模块,能让人快速了解该代码模块实现的功能,而不用去了解代码实现的细节,能让维护人员少掉几根头发。

也可以用来为自己写的代码生成注释。

生成单元测试

生成结果如下:

直接为代码中的每个逻辑分支生成了相应的测试用例,可以直接将内容复制到单元测试类中使用。虽然生成的测试用例可能会有一些需要调整的地方,也极大地提高了写单元测试地效率。

实际工作中会发现很多程序员根本不写单元测试,也不知道单元测试要如何去写,使用通义灵码生成的单元测试就有很大的参考价值。

生成代码注释

生成结果如下:

public class ProductService {/*** 获取产品列表的分页信息。* .     * @param form 包含查询条件和分页信息的请求对象。可选参数,如果为空,则默认查询第一页,每页25条记录。* @return 返回产品列表的分页视图对象(PageVO),包含产品列表、总记录数和总页数。*/public PageVO<Product> getProducts(ProductQueryFrom form) {// 设置默认页码和每页记录数int page = Objects.isNull(form) ? 1 : form.getPage();int rows = Objects.isNull(form) ? 25 : form.getRows();// 定义排序规则,默认按id降序排序Sort sort = Sort.by(Sort.Direction.DESC, "id");// 根据页码、每页记录数和排序规则,创建Pageable对象Pageable pageable = PageRequest.of(page - 1, rows, sort);// 如果form非空且包含关键字,则构建带关键字的查询条件Page<Product> pageEntity;if (Objects.nonNull(form) && StringUtils.hasText(form.getKeyWord())) {// 构建Specification,用于动态生成查询条件Specification<Product> spec = (root, query, builder) -> {Predicate target = builder.disjunction();target.getExpressions().add(target.getExpressions().add(builder.like(root.get("partNo"), "%" + form.getKeyWord() + "%"));return target;};// 执行查询pageEntity = productDao.findAll(spec, pageable);} else {// 如果没有关键字,则直接按pageable条件查询pageEntity = productDao.findAll(pageable);}// 封装查询结果到PageVO对象中,返回PageVO<Product> vo = new PageVO();vo.setList(pageEntity.getContent());vo.setTotal(pageEntity.getTotalElements());vo.setPages(pageEntity.getTotalPages());return vo;}
}

可以看到为每一段相对独立的代码逻辑都生成了对应的注释。生成的注释语义也准确,当然这也是因为程序比较简单,所以生成注释的效果还凑合。

不过个人觉得如果开发对变量名字起名规范,其实就相当于自带注释了,过多的注释反而显得啰嗦。

如果要写注释,则是用精炼的语句来概括一段代码逻辑,这个功能其实用上面 解释代码 便能够很好的实现。

生成优化建议

生成结果如下:

提出代码潜在的风险,并给出了优化建议,还会生成优化后的代码。

虽然生成的内容看起来很有条理,不过细看的话,里面有可靠的建议,也有一些正经的胡说八道。并不能完全信赖它,还需要开发人员自己去甄别。此外,一些优化建议个人觉得优点过度设计了,还是得根据实际项目情况来定。故这个优化建议作为辅助功能最合适。

代码片段补全

代码片段补全是最常用的功能,每次输入完或者回车后,都会智能预测可能的代码,如果刚好合适,则直接用 Tab 键补全,不合适则自己写,写完停下后,则会根据当前输入的内容再进行智能预测。

这个功能是否好用完全取决于它预测的准确率,在写业务逻辑中,如果经常需要写一些重复的业务逻辑,那使用代码片段补全开发效率还是非常高的。只要有写过相似的业务逻辑,预测的准确率非常高,一段业务逻辑几下 Tab 键就完全搞定了,比起自己去复制粘贴快了不少。

总结

代码补全单元测试解释代码,这三种功能直接投入到日常开发中,用来提高工作效率。

另外两种功能,生成代码注释能直接用解释代码来平替,优化建议则是作为一个辅助工具使用,使用时需要开发人员自己甄别,根据实际情况决定是否优化。


http://www.ppmy.cn/server/117301.html

相关文章

线性规划------ + 案例 + Python源码求解(见文中)

目录 一、代数模型&#xff08;Algebraic Models&#xff09;详解1.1什么是代数模型&#xff1f;1.2代数模型的基本形式1.3 安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例 1&#xff1a;市场供需平衡模型Python求解代码Python求解结果如下图&#xff1a; 案例 …

[译] 当Go程序结束时会发生什么

本篇内容是根据2021年2月份When Go programs end音频录制内容的整理与翻译,两位主持人邀请Go团队的Michael Knyszek,讨论了当Go程序结束时会发生什么 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. Mat Ryer: 大家好&#xff0c;欢迎收听 Go Time。我是 Mat Ryer。今…

sql刷题常用函数

ROW_NUMBER() ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 是一个窗口函数&#xff0c;用于生成每个分组内的唯一行号。这个函数非常适合在分组数据中进行排序&#xff0c;并为每一行分配一个序号。下面是对你的具体示例的详细解释&#xff1a; ROW_NUMBER() OVER (…

重新认识一下JNIEnv

JNIEnv 1.JNIEnv是什么&#xff1f; JNIEnv 是 Java Native Interface (JNI) 中的一个重要结构&#xff0c;代表 JNI 环境的指针。它提供了一组函数&#xff0c;用于在本地代码&#xff08;C/C&#xff09;中与 Java 虚拟机&#xff08;JVM&#xff09;进行交互。以下是对 JNI…

CCS6 软件及仿真器驱动安装

1 CCS6 软件获取 TI 的官网上下载: http://www.ti.com/tools-software/ccs.html 注意 首先 win32 是 CCS 安装包支持 64 位系统,我们电脑也是 64 位系统也是安装的 win32 的安装包,另外 TI 只提供 win32 的安装包,无 win64 的安装包。 2 CCS6 软件安装 CCS如果获取提供的…

逆向学习系列(三)adb的使用

由于是记录学习&#xff0c;我就用结合自己的理解&#xff0c;用最通俗的语言进行讲解。 adb是android debug bridge的简写&#xff0c;其作用就是将电脑和手机相连接&#xff0c;用电脑控制手机。 一、adb哪里来 我使用的adb一般都是安装模拟器的时候&#xff0c;模拟器自带…

【物联网技术大作业】设计一个智能家居的应用场景

前言&#xff1a; 本人的物联网技术的期末大作业&#xff0c;希望对你有帮助。 目录 大作业设计题 &#xff08;1&#xff09;智能家居的概述。 &#xff08;2&#xff09;介绍智能家居应用。要求至少5个方面的应用&#xff0c;包括每个应用所采用的设备&#xff0c;性能&am…

PHP即刻送达同城派送小程序系统

即刻送达&#xff0c;同城派送小程序系统让生活更便捷 &#x1f680; 瞬间连接&#xff0c;即刻送达的奇迹 你是否曾经因为等待快递而焦急万分&#xff1f;是否渴望有一种方式能让物品像魔法一样瞬间出现在你面前&#xff1f;现在&#xff0c;有了“即刻送达同城派送小程序系…

vite+vue3快速构建项目+router、vuex、scss安装

安装 Vite npm install -g create-vite-app创建vue3项目 npm init vitelatestnpm i安装依赖 安装veux、router npm install vue-router vuex新建router/index.js&#xff08;自己创建home、login对应页面文件&#xff09; import { createRouter, createWebHistory } from…

python解析ip范围,拆分为所有ip数组

代码如下&#xff0c;还需结合一篇文章来看&#xff1a;ip范围格式转换 #! -*- coding:utf-8 -* """ desc: 解析ip范围为单ip列表 """import ipaddressdef ip_range_to_list(start_ip, end_ip):"""处理有明确起始ip的数据&#…

【PCB工艺】如何实现PCB板层间的互连

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…

LEAN 类型系统属性 之 算法式相等的非传递性(Algorithm equality is not transitive)注解

由于 subsingleton 使用函数&#xff08;eliminator&#xff09; 的存在&#xff0c;导致算法式相等&#xff08;Algorithm defintional equality&#xff09;的非传递性。 在《定义上相等的非确定性&#xff08;Undecidability of Definitional Equality&#xff09;》 中有&…

SpringBoot 处理 @KafkaListener 消息

消息监听容器 1、KafkaMessageListenerContainer 由spring提供用于监听以及拉取消息&#xff0c;并将这些消息按指定格式转换后交给由KafkaListener注解的方法处理&#xff0c;相当于一个消费者&#xff1b; 看看其整体代码结构&#xff1a; 可以发现其入口方法为doStart(),…

C# List定义和常用方法

栏目总目录 List的定义 列表&#xff08;List&#xff09;是一种常用的集合类型&#xff0c;它属于System.Collections.Generic命名空间。列表是一个有序集合&#xff0c;可以包含重复的元素&#xff0c;并且可以根据索引访问元素。 List< T > List<T> 是一个泛…

如何从github上clone项目

从GitHub上克隆项目是一个常见的操作&#xff0c;主要用于将GitHub仓库中的代码下载到本地计算机。以下是详细的步骤&#xff1a; 登录GitHub&#xff1a;首先&#xff0c;确保你已经在GitHub上注册了账号并登录。 找到项目仓库&#xff1a;在GitHub上找到你想要克隆的项目仓库…

linux 定时将固态硬盘数据备份至机械硬盘

需求背景 为了加强公司数据的安全性和可靠性&#xff0c;我们将实施一项数据备份策略。该策略涉及将服务器上的固态硬盘&#xff08;SSD&#xff09;中的关键数据定期备份到机械硬盘&#xff08;HDD&#xff09;上。这一过程旨在保护数据免受意外删除、硬件故障或其他潜在风险…

HOT 100(七)栈、堆、贪心算法

一、栈 1、每日温度 使用单调递减栈来解决。主要思路是遍历temperatures数组&#xff0c;利用栈来存储还没有找到比当前温度高的天数的索引。当遇到比栈顶索引所对应温度更高的温度时&#xff0c;就可以确定当前这一天的温度比之前那一天高。索引的差值就是等待的天数。 求一…

更换cuda版本

要更改链接&#xff0c;使其指向新的目标路径&#xff0c;可以按照以下步骤操作&#xff1a; 删除现有的软链接&#xff1a; 首先&#xff0c;删除现有的链接 /usr/local/cuda&#xff0c;可以使用 rm 命令来删除&#xff1a; sudo rm -rf /usr/local/cuda注意&#xff1a;使用…

Docker绑定端口后仍无法远程直接访问

在docker中拉取镜像后启动&#xff0c;启动脚本如下 启动docker docker run --name nacos-server \ -p 8848:8848 \ -p 7848:7848 \ -p 9848:9848 \ -p 9849:9849 \ --privilegedtrue \ --restartalways \ -e JVM_XMS256m \ -e JVM_XMX256m \ -e MODEstandalone \ -e PREFER_…

✨机器学习笔记(四)—— 逻辑回归、决策边界、过拟合、正则化

Course1-Week3: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week3机器学习笔记&#xff08;四&#xff09; 1️⃣逻辑回归&#xff08;logistic regression&#xff09;…