IDEA中通义灵码的使用技巧
大家好,我是 V 哥。在日常写代码的过程中,通过 AI 工具辅助开发已是当下程序员惯用的方式,V 哥在使用了众多的 AI 工具后,多数情况下,选择通义灵码来辅助开发,尤其是解释代码和生成单元测试功能甚是好用,听 V 哥来详细聊聊。
V 哥推荐:2024 最适合入门的 JAVA 课程
通义灵码安装
打开你的 IDEA 开发工具,在菜单栏中选择Settings,打开设置窗口,在左侧栏中选择 Plugins,在 Marketplace 的搜索栏中输入“通义灵码”,搜索结果的第一个就是通义灵码 AI 插件了,点击 Install 安装插件后,重启 IDE 即可安装成功。

重启IDEA后,在右侧会出现通义灵码选项,此时,就可以使用通义灵码来辅助编程啦。

使用前,请先使用阿里账号进行登录,V 哥的账号是威哥爱编程。
通过通义灵码 AI 工具解释代码
V 哥写了一个 DFS 算法,代码如下:
/*** description:* author: V哥* wx:finally-weige*/
public class DFSMazeSolver {private static final int[] DX = {-1, 1, 0, 0}; // 行移动方向:上,下private static final int[] DY = {0, 0, -1, 1}; // 列移动方向:左,右public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {int rows = maze.length;int cols = maze[0].length;// 边界条件与目标判断if (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {return false;}// 到达终点if (x == rows - 1 && y == cols - 1) {return true;}// 标记当前位置已访问visited[x][y] = true;// 递归地探索四个方向for (int i = 0; i < 4; i++) {int newX = x + DX[i];int newY = y + DY[i];if (dfs(maze, newX, newY, visited)) {return true;}}// 回溯visited[x][y] = false;return false;}public boolean canSolveMaze(int[][] maze) {int rows = maze.length;int cols = maze[0].length;boolean[][] visited = new boolean[rows][cols];return dfs(maze, 0, 0, visited);}public static void main(String[] args) {int[][] maze = {{1, 0, 0, 0},{1, 1, 0, 1},{0, 1, 0, 0},{1, 1, 1, 1}};DFSMazeSolver solver = new DFSMazeSolver();if (solver.canSolveMaze(maze)) {System.out.println("路径可达");} else {System.out.println("无可行路径");}}
}
从代码上看,我已经加了少量代码注释,但对于小白或者初学者来说,想要完全理解代码的含义还是有些困难,下面我们来看看通义灵码的解释代码功能如何。
我们在代码中可以看到有通义灵码的图标标识,下拉打开后,即可以非常方便的使用助手功能了。

我们选择解释代码功能,通义灵码就是会以此方法 dfs 为目标,解释此方法的代码含义,我们来试试。

我们可以看到,在右侧通义灵码的功能区里会把目标方法的代码选中,下方是 dfs 方法的具体解释,从解释来看,基本达到了代码的含义理解,如果你不满意,还可以重新生成,通常 V 哥会使用更详细的解释功能,我们点击更详细来看看。



这样生成的代码解释就很详细了,看一下解释的内容对不对,V 哥仔细查看,不放过每一个字,结果堪称完美,你可以试试。
通过通义灵码 AI 工具生成单元测试
通过通义灵码的生成单元测试功能,也是这款AI 工具的亮点,在代码的 dfs 方法的通义灵码图标,选择生成单元测试功能。

我们就可以在右侧通义灵码的功能区看到生成的测试代码了。

完整生成的测试代码如下:
package com.example.mazesolver;import java.util.*;
import java.math.*;import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;public class DFSMazeSolverTest {private DFSMazeSolver solver;@Beforepublic void setUp() {solver = new DFSMazeSolver();}@Testpublic void testDfs_SimplePath_ReturnsTrue() {int[][] maze = {{1, 0, 0},{1, 1, 0},{1, 1, 1}};boolean[][] visited = new boolean[maze.length][maze[0].length];assertTrue(solver.dfs(maze, 0, 0, visited));}@Testpublic void testDfs_NoPath_ReturnsFalse() {int[][] maze = {{0, 0, 0},{0, 0, 0},{0, 0, 0}};boolean[][] visited = new boolean[maze.length][maze[0].length];assertFalse(solver.dfs(maze, 0, 0, visited));}@Testpublic void testDfs_AlreadyVisitedCell_ReturnsFalse() {int[][] maze = {{1, 0, 0},{1, 1, 0},{1, 1, 1}};boolean[][] visited = new boolean[maze.length][maze[0].length];visited[0][0] = true;assertFalse(solver.dfs(maze, 0, 0, visited));}@Testpublic void testDfs_MazeTooSmall_ReturnsFalse() {int[][] maze = {{0}};boolean[][] visited = new boolean[maze.length][maze[0].length];assertFalse(solver.dfs(maze, 0, 0, visited));}@Testpublic void testDfs_MazeWithMultiplePaths_ReturnsTrue() {int[][] maze = {{1, 1, 0},{0, 1, 1},{0, 0, 1}};boolean[][] visited = new boolean[maze.length][maze[0].length];assertTrue(solver.dfs(maze, 0, 0, visited));}@Testpublic void testDfs_MazeWithDeadEnd_ReturnsFalse() {int[][] maze = {{1, 0, 0},{0, 0, 0},{0, 0, 1}};boolean[][] visited = new boolean[maze.length][maze[0].length];assertFalse(solver.dfs(maze, 0, 0, visited));}
}
哇塞,看到代码你是不是跟 V 哥一样的惊叹,我们还可以通过下方的解释代码来帮助你理解测试代码的逻辑和含义。





把测试代码拿过来,测试一下看是否可以正常测试代码,结果是没有问题的,在测试中,可以根据自己的需求修改修改就OK 了。

通义灵码生成代码注释功能
通过代码解释功能的使用可以看出,生成代码注释肯定也是 OK 的,功能上貌似有些重复了,这里建议两个功能可以合并一下,比如把类注释的内容也加到解释代码中,把解释好的代码可以在右侧栏中直接一键插入即可。个人建议,当然官方估计看不到我的建议。

完整的代码注注释如下:
/*** 使用深度优先搜索(DFS)在迷宫中寻找从起点到终点的路径* * @param maze 表示迷宫的二维数组,其中0代表墙壁,1代表可以通行的路径* @param x 当前位置的x坐标* @param y 当前位置的y坐标* @param visited 一个二维布尔数组,用于标记迷宫中哪些位置已经被访问过* @return 如果找到了从当前位置到迷宫终点的路径,则返回true;否则返回false*/
public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {// 获取迷宫的行数和列数int rows = maze.length;int cols = maze[0].length;// 边界条件与目标判断// 如果当前位置超出迷宫边界、是墙壁或是已经访问过的位置,则返回falseif (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {return false;}// 到达终点// 如果当前位置是迷宫的终点,则返回trueif (x == rows - 1 && y == cols - 1) {return true;}// 标记当前位置已访问visited[x][y] = true;// 递归地探索四个方向// 尝试向四个可能的方向移动,并递归调用DFS如果找到一条路径,则返回truefor (int i = 0; i < 4; i++) {int newX = x + DX[i];int newY = y + DY[i];if (dfs(maze, newX, newY, visited)) {return true;}}// 回溯// 如果四个方向都无法到达终点,回溯标记当前位置为未访问,撤销之前的访问标记visited[x][y] = false;return false;
}
下面这段与解释代码是一致的:

通义灵码的生成优化建议功能

生成优化建议功能让 V 哥很好奇,通义灵码会给出怎样的建议呢,我们一起来看一下,通义灵码给出了如下建议,并提供了优化后的代码:

建议修改后的代码如下:
public class MazeSolver {// 定义方向数组private static final int[] DX = {1, -1, 0, 0};private static final int[] DY = {0, 0, 1, -1};public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {// 输入验证if (maze == null || visited == null || maze.length == 0 || maze[0].length == 0) {throw new IllegalArgumentException("Invalid input: maze or visited array is null or empty");}if (visited.length != maze.length || visited[0].length != maze[0].length) {throw new IllegalArgumentException("Invalid input: visited array size does not match maze array size");}int rows = maze.length;int cols = maze[0].length;// 边界条件与目标判断if (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {return false;}// 到达终点if (x == rows - 1 && y == cols - 1) {return true;}// 标记当前位置已访问visited[x][y] = true;// 递归地探索四个方向for (int i = 0; i < 4; i++) {int newX = x + DX[i];int newY = y + DY[i];if (dfs(maze, newX, newY, visited)) {return true;}}// 回溯visited[x][y] = false;return false;}
}
给出的解释是:
输入验证:在方法开始时添加了对 maze 和 visited 的验证,确保它们不为空且大小一致。
常量定义:将方向数组 DX 和 DY 定义为类的静态常量,提高代码的可读性和可维护性。
注释:增加了注释,使代码更易读。
这些修改不仅提高了代码的安全性和健壮性,还增强了代码的可读性和可维护性。
在通义灵码给出的代码中修改了三处地方,输入验证、常量定义和注释,输入验证和常量定义让 V 哥的代码更加严谨了,在算法实现上没有给出建议,V哥大胆猜测,要不就是V 哥的算法实现已经比较完美了,或者灵码也没有更好的算法优化建议了,哈哈。
通义灵码自动联想代码功能
在编码区写代码时,通义灵码还提供了语义级的自动代码联想功能,这个功能有点奇怪,比如我们在 main 方法中就会建议输出 Hello world:

也许通义灵码想做到想我所想,帮我写代码,由于通义灵码基于通义大模型实现,此功能应该会在学习你的编码习惯和代码意图,如果完全学会了,难道要变成你的克隆吗,还会根据项目中的代码结构来联想,这个功能一旦成熟,那可不得了,期待吧,暂时,V 哥觉得用的还很少。
最后小结一下
总的来说,V 哥在使用通义灵码的过程中,最常用的是解释代码和单元测试的生成,这两部分让我在代码逻辑和测试上大大提高了效率。通义灵码,你有在用吗,欢迎一起交流心得体会。关注威哥爱编程,编码路上我们结伴同行。
相关文章:
IDEA中通义灵码的使用技巧
大家好,我是 V 哥。在日常写代码的过程中,通过 AI 工具辅助开发已是当下程序员惯用的方式,V 哥在使用了众多的 AI 工具后,多数情况下,选择通义灵码来辅助开发,尤其是解释代码和生成单元测试功能甚是好用&am…...
JS中let var 和const区别
在JavaScript中,let、var 和 const 都是用来声明变量的关键字,但它们之间有几个关键的区别: 作用域(Scope): var 声明的变量拥有函数作用域(function scope),这意味着如果 var 变量在…...
ansible详细介绍和具体步骤
Ansible简介 1.1 Ansible的基本概念 Ansible是一款开源的自动化工具,旨在简化IT操作的复杂性。它由Michael DeHaan创建,并于2012年发布,随后在2015年被Red Hat收购。Ansible的核心理念是“简单即美”,它通过使用YAML(…...
利用LangChain与LLM打造个性化私有文档搜索系统
我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现“幻觉”。针对“幻觉”问题,一般的解决方案是采用RAG做检索增强。 但是我们不可能把…...
linux中的软、硬链接
目录 引言 简单介绍 如何理解软硬链接 链接的应用 环路问题 引言 在Linux操作系统的广阔天地中,文件管理是其核心功能之一。而软链接和硬链接作为Linux文件系统中的两种特殊链接方式,它们为用户提供了灵活的文件访问途径和高效的磁盘空间利用手段。…...
Ubuntu 系统、Docker配置、Docker的常用软件配置(下)
前言 书接上文,现在操作系统已经有了,作为程序的载体Docker也安装配置好了,接下来我们需要让Docker发挥它的法力了。 Docker常用软件的安装 1.Redis 缓存安装 1.1 下载 docker pull redis:7.4.1 #可改为自己需要的版本 1.2 创建本地目录存储…...
jdk,openjdk,oraclejdk
Java是开发语言,不是软件。JDK是软件,使用OpenJDK是免费的,一直免费。而且OpenJDK正儿巴经的Java社区推出来的JDK。 Oracle JDK主要是面向付费能力强的企业用户,收费已经好多年了,不是一两年的事,JDK8是JDK…...
Docker Hub 镜像加速器
零、参考资料 https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6Daemon proxy configuration | Docker Docs 一、解决方案 1、问题现象 Error response from daemon: Get "https://index.docker.io/v1/search?qcarlasim%2Fcarla&n25": dia…...
DevOps赋能:优化业务价值流的实战策略与路径(上)
上篇:价值流引领与可视化体系构建 一、前言 在快速迭代的软件项目和产品开发生态中,我们始终围绕两个核心目标:一是确保每一项工作都能为客户创造实际价值,这是产品团队的核心使命;二是确保这些有价值的工作能够高效…...
int的取值范围
原码(True form):原码是一种计算机中对数字的二进制表示方法,数码序列中最高位为符号位,符号位为0表示正数,符号位为1表示负数;其余有效值部分用二进制的绝对值表示。 反码…...
图文检索(16):IDC: Boost Text-to-Image Retrieval via Indirect and Direct Connections
IDC: Boost Text-to-Image Retrieval via Indirect and Direct Connections 摘要3 方法3.1 直接连接3.2 间接连接3.3 DLB 正则化 结论 发布时间(2024 LREC-COLING) 标题:IDC:通过间接和直接连接增强文本到图像的检索 摘要 本文&…...
企业数字化转型:重识、深思、重启新征程-亿发
在当下这个日新月异的时代,企业数字化转型已然成为众多企业竞相追逐的发展方向,可真正能将其领悟透彻并有效落地实施的企业,却并非比比皆是。此刻,亿发软件针对企业数字化转型展开一次更为深入的重识、全面的深思,进而…...
仓颉刷题录-字符串数字转换(一)
文章目录 背景题目:交换后字典序最小的字符串个人感受 这是双子专栏: Cangjie仓颉程序设计-个人总结 本专栏还在持续更新: 仓颉编程cangjie刷题录 背景 报名了一个仓颉的比赛,感觉条件要求挺低的,就想上。哈哈哈。但…...
SpringBoot【实用篇】- 配置高级
文章目录 目标:1.ConfigurationProperties2.宽松绑定/松散绑定3. 常用计量单位绑定4.数据校验 目标: ConfigurationProperties宽松绑定/松散绑定常用计量单位绑定数据校验 1.ConfigurationProperties ConfigurationProperties 在学习yml的时候我们了解…...
liunx CentOs7安装MQTT服务器(mosquitto)
查找 mosquitto 软件包 yum list all | grep mosquitto出现以上两个即可进行安装,如果没有出现则需要安装EPEL软件库。 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm查看 mosquitto 信息 yum info mosquitto安装 mosquitt…...
【银河麒麟高级服务器操作系统】虚拟机lvm分区丢失现象分析及解决建议
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 环境描述 系统环境 物理机/虚拟机/云/容器 虚拟…...
Android 原子性类型都有哪些
1. 基本类型原子类 AtomicInteger:用于对整数进行原子操作,如incrementAndGet()方法可以原子地将当前值加1并返回新值,getAndSet()方法可以原子地设置新值并返回旧值。AtomicLong:和AtomicInteger类似,用于长整型的原…...
MySQL(上)
一、SQL优化 1、如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说&a…...
ffplay 实现视频流中音频的延迟
ffplay -rtsp_transport tcp -i rtsp://admin:1234qwer192.168.1.64:554/Streaming/Channels/101 -vn -af "adelay5000|5000"在这个命令中: -vn 参数表示只播放音频。 -af "adelay5000|5000" 参数表示将音频延迟5000毫秒(即5秒&…...
CSDN资源变现
根据搜索结果,CSDN资源变现主要有以下几种方式: 1、上传付费资源: 用户可以在CSDN上上传资源并设置付费,其他用户支付费用下载这些资源,上传者则获得一部分收益。这种方式适合上传大量资源,通过量变达到质变…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
