IDEA 通义灵码 插件使用体验

news2024/11/18 3:33:25

目录

前言

主要功能

演示代码

解释代码

生成单元测试

生成代码注释

生成优化建议

代码片段补全

总结


前言

自从 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.coloradmin.cn/o/2136673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消息中间件有哪些常见类型

消息中间件根据其设计理念和用途&#xff0c;可以大致分为以下几种常见类型&#xff1a; 点对点消息队列&#xff08;Point-to-Point Messaging Queues&#xff09;&#xff1a; 在这种模型中&#xff0c;消息被发送到特定的队列中&#xff0c;消费者从队列中取出并处理消息。队…

【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 困难 三【题目编号】 LCR 078.合并 K 个升序链表 …

Linux入门——“Linux基本指令”上

在刚开始学习Linux时&#xff0c;首先需要掌握一些基本指令&#xff0c;以便我们能更好地使用Linux操作系统&#xff0c;以下指令在Ubuntu 22上执行。以下内容不过多介绍选项内容。 1.ls指令 ls指令用来查看当前目录下的文件&#xff0c;显示的信息是很有限的一般只显示文件名&…

二进制部署ETCD单机版

文章目录 一、签发etcd证书二、搭建etcd单机版三、测试ETCD服务 一、签发etcd证书 注意&#xff1a;在操作签发证书操作时一定要检查服务器时间、时区是否一致&#xff0c;会导致证书不可用&#xff01;&#xff01; 1、创建etcd目录 mkdir /etc/etcd/{ssl,data} -p2、安装签…

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…

基于SpringBoot的社区宠物管理与推荐系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1.课题的基本内容&#xff0c;可能遇到的困难&#xff0c;提出解决问题的方法和措施 2.1课题的基本内容 本课题主要研究基于SpringBoot的社区宠物管理与推荐系统的设计与实现。用户注册登录系统前端后可以可以实现对宠物信息的…

【读书笔记-《30天自制操作系统》-20】Day21

本篇的内容主要是操作系统的保护&#xff0c;涉及到x86 CPU的一些机制&#xff0c;以及操作系统的异常处理。 1. 字符显示API问题解决 首先来解决一下上一篇内容中字符串显示API没有生效的问题。 void hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ec…

为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白

H.266&#xff0c;也被称为Versatile Video Coding&#xff08;VVC&#xff09;&#xff0c;是近年来由MPEG&#xff08;Moving Picture Experts Group&#xff09;和ITU&#xff08;International Telecommunication Union&#xff09;联合开发并发布的新一代国际视频编码标准…

[每周一更]-(第114期):介绍GitLab不同角色对应的权限

文章目录 GitLab 角色及其权限项目级别角色组级别角色 使用场景示例 工作中一直使用Gitlab搭建了公司内网的代码管理工具&#xff0c;但是不同的用户会分配相应的权限&#xff0c;来管理不同用户及角色的权限信息&#xff0c;我们来介绍下角色的信息&#xff0c;方便我们管理公…

演示:基于WPF的自绘的中国地铁轨道控件

一、目的&#xff1a;演示一个基于WPF的自绘的中国地铁轨道控件 二、效果演示 北京地铁 成都地铁 上海地铁 深圳地铁 南京地铁 长春地铁 哈尔滨地铁 武汉地铁 厦门地铁 香港地铁 三、功能 支持平移、缩放等操作 鼠标悬停显示线路信息和站点信息 按表格显示&#xff0c;按纸张…

传知代码-融合经典与创新的图像分类新途径

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 在当前的深度学习领域&#xff0c;构建兼具高性能与灵活性的卷积神经网络&#xff08;CNN&#xff09;已成为计算机视觉研究的核心课题。本文介绍了一种全新的卷积神经网络架构&#xff0c;该网络巧妙地结合…

MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法

如图&#xff0c;MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式下&#xff0c;光标下方永远会出现一个CapsLock箭头Icon。此Icon挡住视野&#xff0c;还容易误触导致切换大小写状态&#xff0c;带来的收益远远小于带来的困扰。 解决办法 打开终端&#xff0c;输入以下…

Go协程及并发锁应用指南

概念 协程&#xff08;Goroutine&#xff09;是Go语言独有的并发体&#xff0c;是一种轻量级的线程&#xff0c;也被称为用户态线程。相对于传统的多线程编程&#xff0c;协程的优点在于更加轻量级&#xff0c;占用系统资源更少&#xff0c;切换上下文的速度更快&#xff0c;不…

Vue:使用v-model绑定的textarea在光标处插入指定文本

一、问题描述 使用v-model绑定的textarea如果需要改变其内容&#xff0c;一般只要改变v-model对应的变量即可&#xff0c;但如果需要在textarea的当前光标位置插入指定文本&#xff0c;那就需要操作DOM了。于是我们写了一段js&#xff1a; const insertTextAtCursor (text) …

聊天组件 Vue3-beautiful-chat

前言 最近很多公司都在搞大模型&#xff0c;类似于 chatgpt 的功能&#xff1b;而 chatgpt 的界面其实就是个对话框。今天就介绍一个不错的对话框组件 Vue3-beautiful-chat 项目框架 vite vue3 TS Vue3-beautiful-chat 使用流程 1、引用三方件 npm install Vue3-beaut…

【大模型专栏—进阶篇】语言模型创新大总结——“三派纷争”

大模型专栏介绍 &#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文为大模型专栏子篇&#xff0c;大模型专栏将持续更新&#xff0c;主要讲解大模型从入门到实战打怪升级。如有兴趣&#xff0c;欢迎您的阅读。 &#x1f4…

ChatGPT对话训练数据采集渠道有哪些

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它可以生成逼真的自然语言回复&#xff0c;被广泛应用于聊天机器人、智能助理等领域。ChatGPT本身需要依赖大量的训练对话数据和算法运行&#xff0c;其所依赖的对话数据&#xff0c;需要专业的数据采集标注处理流程才…

20 递归算法精髓解析:基准、性质、案例(阶乘、斐波拉契、猴子吃桃、汉诺塔等)、与循环的对比

目录 1 概述 2 递归的基本组成部分 2.1 基准情况 2.2 递归步骤 2.3 案例&#xff1a;循环实现阶乘的计算 2.4 案例&#xff1a;递归函数实现阶乘的计算 3 递归的性质 3.1 自我调用 3.2 栈的使用 3.3 问题分解 3.4 性能考虑 3.5 案例&#xff1a;递归的回溯 4 综合…

WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容

需求&#xff1a;在WPF DataGrid 控件中&#xff0c;有以下列&#xff0c;绑定了一个LogType&#xff0c;值分别是0,1,2&#xff0c;根据不同的值&#xff0c;显示不同的内容以及背景 <DataGrid ItemsSource"{Binding EventLog}"><DataGrid.Columns><…

力扣之1777.每家商店的产品价格

文章目录 1. 1777.每家商店的产品价格1.1 题干1.2 建表1.3 题解1.4 结果截图 1. 1777.每家商店的产品价格 1.1 题干 表&#xff1a;Products -------------------- | Column Name | Type | -------------------- | product_id | int | | store | enum | | price | int | ---…