︿
Top

2026年10月30日 星期五

Claude Code Desktop 初體驗

前言

前兩篇完成了 Claude Code CLI 及 Claude Code Desktop 的安裝, 這篇開始實際使用. 範例專案採用筆者之前的文章: 非決定性元素 (Non-Deterministic Elements) 的單元測試, 以亂數 (Random) 為例 (GitHub Repository), 在 Claude Code Desktop 中透過四段對話, 走一遍「讀取分析 → 診斷問題 → 修改檔案 → 驗證 → 版控提交」的流程. 整理如下, 供備忘之用.

一. 選擇模型及推理強度

開新 session 前, 可以先選擇模型及推理強度 (Effort):

  • 模型: 預設為 Opus 5.5.
  • 推理強度: Low ~ Max. 強度越高, 回應越完整, 但耗時與用量也越多. 本例選 High.

05 01 選擇模型及推理強度

二. 選擇本機資料夾

點選輸入框下方的 [Choose...]:

05 02 選擇本機資料夾

選擇範例專案的資料夾:

05 03 選擇本機資料夾

確認路徑後, 按 [Trust workspace]:

05 04 選擇本機資料夾

資料夾已帶入輸入框下方, 可以開始對話:

05 05 選擇本機資料夾

三. 對話 1: 分析目前專案

請幫我看一下這個專案,用中文說明它是做什麼的、主要的資料夾結構、以及用到哪些技術。

Claude 的分析結果整理如下.

這個專案在做什麼

這是一個 ASP.NET Core 6 MVC 的教學範例, 主題是: 程式裡用到「非決定性元素」(例如 Random) 時, 要怎麼寫單元測試.

它用一個簡單的「樂透開獎」功能來示範:

  • 進入 /Lotto 頁面時, 系統會從 0~9 抽一個亂數 (Next(0, 10), 包含 0, 不包含 10).
  • 數字個位數是 9 就顯示「恭喜中獎」, 其他數字顯示「再接再厲」.

問題在於 System.Random 沒有實作任何介面, 每次輸出又不一樣, 測試沒辦法穩定驗證結果. 專案的解法是:

  1. 自己定義 IRandomGenerator 介面, 再寫 RandomGenerator 把 Random 包起來 (Wrapper 模式).
  2. LottoService 透過建構式注入 (DI) 取得 IRandomGenerator, 不直接 new Random().
  3. 測試時用 Moq 做一個假的 IRandomGenerator, 固定回傳 9 或 1, 這樣就能穩定驗證「中獎」和「沒中」兩種結果.

另外, README.md 是這次練習的完整教學文章, README.html 則是轉成可以貼到 Google Blogger 的版本.

主要資料夾結構

20240118_ASPNetCore6Random/
├─ ASPNetCore6Random.sln            方案檔
├─ ASPNetCore6Random/               主要的 Web 專案 (MVC)
│  ├─ Program.cs                    啟動設定、DI 註冊、路由
│  ├─ Controllers/
│  │  ├─ HomeController.cs          範本預設的首頁
│  │  └─ LottoController.cs         樂透開獎,呼叫 LottoService
│  ├─ Services/
│  │  ├─ ILottoService.cs
│  │  └─ LottoService.cs            開獎邏輯(判斷是否中獎)
│  ├─ Wrapper/
│  │  ├─ IRandomGenerator.cs        包裝 Random 的介面
│  │  └─ RandomGenerator.cs         實作,裡面呼叫 System.Random
│  ├─ ViewModels/LottoViewModel.cs  YourNumber + Message
│  ├─ Models/ErrorViewModel.cs
│  ├─ Views/                        Razor 頁面(Lotto/Index、Shared/_Layout 等)
│  └─ wwwroot/                      靜態檔(css、js、Bootstrap/jQuery 函式庫)
├─ ASPNetCore6RandomTests/          單元測試專案
│  └─ Services/LottoServiceTests.cs 兩個測試:回傳 9 會中獎、回傳 1 不會中
├─ pictures/                        README 用的截圖(中獎、沒中、測試結果)
├─ README.md / README.html          教學文件

DI 註冊寫在 Program.cs: IRandomGenerator 註冊成 Singleton, ILottoService 註冊成 Scoped.

用到的技術

類別 技術
平台 .NET 6 (net6.0), C# (有開 Nullable, ImplicitUsings)
Web 框架 ASP.NET Core 6 MVC, Razor Views
前端 Bootstrap, jQuery, jQuery Validation (範本內建)
設計模式 依賴注入 (DI), 介面抽象, Wrapper 包裝非決定性元素
測試框架 MSTest 3.0.4
模擬工具 Moq 4.18.4 (產生假的 IRandomGenerator)
物件比對 ExpectedObjects 3.5.4 (直接比對整個 ViewModel)
覆蓋率 coverlet.collector 6.0.0
開發工具 Visual Studio 2022

小提醒

Claude 額外發現: Program.cs 裡 #region 那行的中文註解顯示成亂碼, 檔案很可能是用 Big5 存的, 不是 UTF-8. 程式照樣能跑, 但改存成 UTF-8, 才能讓 GitHub 和其他編輯器正常顯示. 這個問題留到 五. 處理.

四. 對話 2: 移除 GitHub 遠端

接下來會修改程式, 但這次只想在本地端練習, 所以先請 Claude 把 GitHub 的遠端移除, 以免不小心 push 回去.

請先幫我將 github 的遠端連結先移除, 以免不小心 push 回 github. 也就是這次只在本地端作處理.

處理結果:

  • 移除的是 origin, 網址為 https://github.com/jasper-lai/20240118_ASPNetCore6Random.git.
  • git remote -v 現在是空的, master 也不再追蹤 origin/master.
  • 本地的 commit 歷史和檔案都沒有變動, 最新一筆仍是 aef083b.

現在就算執行 git push, Git 也只會報錯說沒有設定推送目的地, 不會推到 GitHub.

日後如果要重新連回 GitHub, 執行以下兩行即可恢復:

git remote add origin https://github.com/jasper-lai/20240118_ASPNetCore6Random.git
git branch --set-upstream-to=origin/master master

注意: 第二行要先執行 git fetch origin, 抓回遠端分支之後才能執行.

五. 對話 3: 處理 Program.cs 的中文編碼問題

請進行 Program.cs 中文編碼問題的處理

原因: Program.cs 是用 Big5 存的, 而專案裡其他 .cs 檔大多是 UTF-8 (含 BOM), 所以第 9 行的中文註解在多數編輯器裡會變成亂碼. (註: 實際檢查, Models/ErrorViewModel.cs 是不含 BOM 的純 ASCII 檔案, 內容不受影響.)

處理: 把 Big5 內容轉成 UTF-8 (含 BOM), 換行一樣是 CRLF. 現在第 9 行可以正常顯示:

#region 註冊相關的服務

git diff 只有兩處變動: 第 1 行多了 BOM, 第 9 行的中文改成正確的編碼, 程式碼本身沒變. Claude 也檢查過專案裡所有的程式及設定檔, 只有 Program.cs 不是 UTF-8.

驗證:

  • dotnet build 成功. 只有一個 NETSDK1138 警告, 意思是 net6.0 已停止支援, 跟這次修改無關.
  • dotnet test 兩個測試都通過. 不過這台電腦只裝了 .NET 10, 沒有 .NET 6 執行環境, 直接執行測試會中止, 所以 Claude 加了 DOTNET_ROLL_FORWARD=Major, 讓測試改用 .NET 10 執行. 專案設定沒有改.

六. 對話 4: commit 編碼修正 (只在本地)

請幫我 commit 這個編碼修正(只在本地)

編碼修正已 commit 在本地的 master 分支, 沒有 push 到任何地方:

  • Commit: afdfef7 修正 Program.cs 中文編碼: 由 Big5 轉為 UTF-8 (BOM), 與其他檔案一致
  • 內容: 只有 ASPNetCore6Random/Program.cs 一個檔案.
  • 狀態: 工作區沒有其他未 commit 的修改. repo 沒有設定遠端, 所以這個 commit 不會被誤推到 GitHub.

在 Visual Studio 2026 觀察 Git 記錄, 最上方就是剛才的 commit:

05 06 VisualStudio2026_版更記錄

結論

透過四段對話, 等於把 Claude Code 的核心循環全走過一遍: 讀取分析 → 診斷問題 → 修改檔案 → 驗證 → 版控提交.

過程中有幾點值得一提: 動手修改前, 先移除遠端, 確保所有修改只留在本地; 修改後執行 build 與 test, 並說明測試環境的差異 (本機沒有 .NET 6, 以 .NET 10 執行); 最後以中文 commit 訊息記錄, 可在 Visual Studio 2026 直接檢視.

參考文件

沒有留言:

張貼留言