iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
ChatGPT & Codex

從 Prompt Engineering 到 Copilot / Codex 實務 30 天系列 第 3 篇

Day 03:【基礎語法生成】用白話寫程式:讓 AI 生成基礎控制邏輯與實用函式

  • 分享至 

  • xImage
  •  

在前兩天我們建立了人機協同開發的觀念,並在 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 調教成資深後端架構師」,教大家如何設定客製化指令讓回答風格大幅躍升!


上一篇
Day 02:【免費利器】學生專屬福利:申請並在 VS Code 啟用 GitHub Copilot(與免費替代方案)
下一篇
Day 04:【對話技巧】善用 System Prompt 與角色扮演:將 ChatGPT 調教成資深工程師
系列文
從 Prompt Engineering 到 Copilot / Codex 實務 30 天 共 4 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言