在前兩天我們建立了人機協同開發的觀念,並在 VS Code 中裝好了代碼輔助工具。很多初學者在使用 AI 生成程式碼時,常會遇到一個問題:「為什麼 AI 寫出來的代碼常常漏掉 edge case,或者結構很鬆散?」
關鍵在於我們給予的自然語言提示(Prompt)是否具備足夠的工程規格。今天我們將以常見的 Java 實務函式為例,示範如何用清晰的白話結構,讓 ChatGPT / Copilot 一次產出高品質、具備異常處理的基礎控制邏輯。
一、寫好代碼提示詞的三要素公式
想讓 AI 精準產出符合預期的函式,建議在 Prompt 中帶入以下三個核心條件:
功能目標(Goal):清楚描述函式要做什麼、輸入是什麼、回傳什麼。
約束條件(Constraints):指定語言版本、命名規範、是否允許使用特定函式庫。
邊界防禦(Edge Cases):明確要求處理 null、空集合、非法格式等例外。
二、實戰案例一:智慧驗證身分證字號格式
提示詞(Prompt)輸入:
請使用 Java 17 撰寫一個工具方法 isValidTaiwanId(String id),用來驗證台灣身分證字號格式。要求:
輸入為 null 或長度不為 10 碼時直接回傳 false。
第一碼必須為大寫英文字母,第二碼為 1 或 2,後續為 8 碼數字。
需符合權重檢查碼(Checksum)驗證邏輯。
請附帶清晰的 JavaDoc 註解與防呆處理。
AI 生成的 Java 程式碼:
import java.util.Map;
public class IdentityValidator {
private static final Map<Character, Integer> CITY_CODE_MAP = Map.ofEntries(
Map.entry('A', 10), Map.entry('B', 11), Map.entry('C', 12), Map.entry('D', 13),
Map.entry('E', 14), Map.entry('F', 15), Map.entry('G', 16), Map.entry('H', 17),
Map.entry('I', 34), Map.entry('J', 18), Map.entry('K', 19), Map.entry('L', 20),
Map.entry('M', 21), Map.entry('N', 22), Map.entry('O', 35), Map.entry('P', 23),
Map.entry('Q', 24), Map.entry('R', 25), Map.entry('S', 26), Map.entry('T', 27),
Map.entry('U', 28), Map.entry('V', 29), Map.entry('W', 32), Map.entry('X', 30),
Map.entry('Y', 31), Map.entry('Z', 33)
);
/**
* 驗證台灣身分證字號合法性
*
* @param id 身分證字號字串
* @return 若格式與檢查碼正確回傳 true,否則回傳 false
*/
public static boolean isValidTaiwanId(String id) {
if (id == null || !id.matches("^[A-Z][12]\\d{8}$")) {
return false;
}
int cityCode = CITY_CODE_MAP.get(id.charAt(0));
int sum = (cityCode / 10) + (cityCode % 10) * 9;
int[] weights = {8, 7, 6, 5, 4, 3, 2, 1};
for (int i = 0; i < 8; i++) {
sum += Character.getNumericValue(id.charAt(i + 1)) * weights[i];
}
int checkDigit = (10 - (sum % 10)) % 10;
return checkDigit == Character.getNumericValue(id.charAt(9));
}
}
三、實戰案例二:集合分頁與防呆切片(Pagination Slice)
在日常 Web 開發中,常需要對記憶體中的 List 進行手動分頁切割,這是一個很容易發生 IndexOutOfBoundsException 的場景。
提示詞(Prompt)輸入:
請寫一個 Java 通用方法 paginate(List list, int pageNumber, int pageSize)。
要求:
pageNumber 從 1 起算。
若傳入 null 或超出範圍,請優雅處理(回傳空清單),避免產生 IndexOutOfBoundsException。
AI 生成的 Java 程式碼:
import java.util.Collections;
import java.util.List;
public class PaginationUtils {
/**
* 對清單進行安全分頁切片
*/
public static <T> List<T> paginate(List<T> list, int pageNumber, int pageSize) {
if (list == null || list.isEmpty() || pageNumber < 1 || pageSize <= 0) {
return Collections.emptyList();
}
int fromIndex = (pageNumber - 1) * pageSize;
if (fromIndex >= list.size()) {
return Collections.emptyList();
}
int toIndex = Math.min(fromIndex + pageSize, list.size());
return list.subList(fromIndex, toIndex);
}
}
四、工程師的把關重點
生成完畢後,不能直接盲目信任,要養成花 30 秒快速審視三個細節:
靜態常數抽出:例如縣市代碼對照表是否被設為 static final,避免每次呼叫重複宣告消耗記憶體。
下標邊界判斷:例如在分頁函式中,AI 是否正確使用了 Math.min(fromIndex + pageSize, list.size()) 來防止陣列越界。
不可變集合保護:當參數無效時,回傳 Collections.emptyList() 比直接回傳 null 更安全,能有效避免呼叫端噴出 NullPointerException。
今日小結與預告
今天我們透過身分證檢查與分頁切片兩個常見範例,體驗了如何透過「目標 + 約束 + 邊界」的三要素公式,讓 AI 一次到位產出具備健壯性的實用代碼。
明天的 Day 04,我們將更進一步探討提示詞的高級技巧:「對話技巧:善用 System Prompt 與角色扮演,將 ChatGPT 調教成資深後端架構師」,教大家如何設定客製化指令讓回答風格大幅躍升!