W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
大家好,我是 V 哥。在日常寫代碼的過程中,通過 AI 工具輔助開發(fā)已是當下程序員慣用的方式,V 哥在使用了眾多的 AI 工具后,多數(shù)情況下,選擇通義靈碼來輔助開發(fā),尤其是解釋代碼和生成單元測試功能甚是好用,聽 V 哥來詳細聊聊。
打開你的 IDEA 開發(fā)工具,在菜單欄中選擇Settings,打開設置窗口,在左側欄中選擇 Plugins,在 Marketplace 的搜索欄中輸入“通義靈碼”,搜索結果的第一個就是通義靈碼 AI 插件了,點擊 Install 安裝插件后,重啟 IDE 即可安裝成功。
重啟IDEA后,在右側會出現(xiàn)通義靈碼選項,此時,就可以使用通義靈碼來輔助編程啦。
使用前,請先使用阿里賬號進行登錄,V 哥的賬號是威哥愛編程。
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("無可行路徑");
}
}
}
從代碼上看,我已經(jīng)加了少量代碼注釋,但對于小白或者初學者來說,想要完全理解代碼的含義還是有些困難,下面我們來看看通義靈碼的解釋代碼功能如何。
我們在代碼中可以看到有通義靈碼的圖標標識,下拉打開后,即可以非常方便的使用助手功能了。
我們選擇解釋代碼功能,通義靈碼就是會以此方法 dfs 為目標,解釋此方法的代碼含義,我們來試試。
我們可以看到,在右側通義靈碼的功能區(qū)里會把目標方法的代碼選中,下方是 dfs 方法的具體解釋,從解釋來看,基本達到了代碼的含義理解,如果你不滿意,還可以重新生成,通常 V 哥會使用更詳細的解釋功能,我們點擊更詳細來看看。
這樣生成的代碼解釋就很詳細了,看一下解釋的內(nèi)容對不對,V 哥仔細查看,不放過每一個字,結果堪稱完美,你可以試試。
通過通義靈碼的生成單元測試功能,也是這款AI 工具的亮點,在代碼的 dfs 方法的通義靈碼圖標,選擇生成單元測試功能。
我們就可以在右側通義靈碼的功能區(qū)看到生成的測試代碼了。
完整生成的測試代碼如下:
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;
@Before
public void setUp() {
solver = new DFSMazeSolver();
}
@Test
public 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));
}
@Test
public 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));
}
@Test
public 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));
}
@Test
public void testDfs_MazeTooSmall_ReturnsFalse() {
int[][] maze = {
{0}
};
boolean[][] visited = new boolean[maze.length][maze[0].length];
assertFalse(solver.dfs(maze, 0, 0, visited));
}
@Test
public 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));
}
@Test
public 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 哥一樣的驚嘆,我們還可以通過下方的解釋代碼來幫助你理解測試代碼的邏輯和含義。
把測試代碼拿過來,測試一下看是否可以正常測試代碼,結果是沒有問題的,在測試中,可以根據(jù)自己的需求修改修改就OK 了。
通過代碼解釋功能的使用可以看出,生成代碼注釋肯定也是 OK 的,功能上貌似有些重復了,這里建議兩個功能可以合并一下,比如把類注釋的內(nèi)容也加到解釋代碼中,把解釋好的代碼可以在右側欄中直接一鍵插入即可。個人建議,當然官方估計看不到我的建議。
完整的代碼注注釋如下:
/**
* 使用深度優(yōu)先搜索(DFS)在迷宮中尋找從起點到終點的路徑
*
* @param maze 表示迷宮的二維數(shù)組,其中0代表墻壁,1代表可以通行的路徑
* @param x 當前位置的x坐標
* @param y 當前位置的y坐標
* @param visited 一個二維布爾數(shù)組,用于標記迷宮中哪些位置已經(jīng)被訪問過
* @return 如果找到了從當前位置到迷宮終點的路徑,則返回true;否則返回false
*/
public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {
// 獲取迷宮的行數(shù)和列數(shù)
int rows = maze.length;
int cols = maze[0].length;
// 邊界條件與目標判斷
// 如果當前位置超出迷宮邊界、是墻壁或是已經(jīng)訪問過的位置,則返回false
if (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {
return false;
}
// 到達終點
// 如果當前位置是迷宮的終點,則返回true
if (x == rows - 1 && y == cols - 1) {
return true;
}
// 標記當前位置已訪問
visited[x][y] = true;
// 遞歸地探索四個方向
// 嘗試向四個可能的方向移動,并遞歸調(diào)用DFS如果找到一條路徑,則返回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;
}
下面這段與解釋代碼是一致的:
生成優(yōu)化建議功能讓 V 哥很好奇,通義靈碼會給出怎樣的建議呢,我們一起來看一下,通義靈碼給出了如下建議,并提供了優(yōu)化后的代碼:
建議修改后的代碼如下:
public class MazeSolver {
// 定義方向數(shù)組
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 的驗證,確保它們不為空且大小一致。
常量定義:將方向數(shù)組 DX 和 DY 定義為類的靜態(tài)常量,提高代碼的可讀性和可維護性。
注釋:增加了注釋,使代碼更易讀。
這些修改不僅提高了代碼的安全性和健壯性,還增強了代碼的可讀性和可維護性。
在通義靈碼給出的代碼中修改了三處地方,輸入驗證、常量定義和注釋,輸入驗證和常量定義讓 V 哥的代碼更加嚴謹了,在算法實現(xiàn)上沒有給出建議,V哥大膽猜測,要不就是V 哥的算法實現(xiàn)已經(jīng)比較完美了,或者靈碼也沒有更好的算法優(yōu)化建議了,哈哈。
在編碼區(qū)寫代碼時,通義靈碼還提供了語義級的自動代碼聯(lián)想功能,這個功能有點奇怪,比如我們在 main 方法中就會建議輸出 Hello world:
也許通義靈碼想做到想我所想,幫我寫代碼,由于通義靈碼基于通義大模型實現(xiàn),此功能應該會在學習你的編碼習慣和代碼意圖,如果完全學會了,難道要變成你的克隆嗎,還會根據(jù)項目中的代碼結構來聯(lián)想,這個功能一旦成熟,那可不得了,期待吧,暫時,V 哥覺得用的還很少。
總的來說,V 哥在使用通義靈碼的過程中,最常用的是解釋代碼和單元測試的生成,這兩部分讓我在代碼邏輯和測試上大大提高了效率。通義靈碼,你有在用嗎,歡迎一起交流心得體會。關注威哥愛編程,編碼路上我們結伴同行。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: