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上上传资源并设置付费,其他用户支付费用下载这些资源,上传者则获得一部分收益。这种方式适合上传大量资源,通过量变达到质变…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
