Skip to content

解耦修改器核心、存檔與兵種預設流程(含程式碼審查修正)#8

Closed
nojackno2-ctrl wants to merge 2 commits into
主要開發from
claude/decoupled-code-review-3ly42q
Closed

解耦修改器核心、存檔與兵種預設流程(含程式碼審查修正)#8
nojackno2-ctrl wants to merge 2 commits into
主要開發from
claude/decoupled-code-review-3ly42q

Conversation

@nojackno2-ctrl

Copy link
Copy Markdown
Owner

摘要

本 PR 包含兩個提交:

1. 4acd542 解耦修改器核心、存檔與兵種預設流程(來自 codex/decouple-core-and-file-workflows)

  • 偵測解耦:單體 FeatureDetector(711 行 → 44 行)拆為 7 個目標檔案偵測器(Exe/ClScript/Ress/Objdef/TeamDat/Bci/Install),協調器只保留 RomanEndless 的 EXE/team.dat 調和政策。
  • 備份解耦:BackupManager(772 行 → 約 184 行)拆為 BackupSourceLoaderBackupValidatorBackupAutoHealerGameDirectoryBackupLoaderOriginalFileValidatorUnitBaselineCatalogCleanEparaBaseline;BackupFiles 改為唯讀視圖,寫入一律經由會使快取失效的 SetBackupFile
  • 套用/還原解耦:PatchEngine(454 行 → 138 行)拆為 PatchFileComposer(8 個 IPatchFileContributor dry-run 組稿)、PatchRestoreServicePatchOperationRunner(UI 中立的交易執行器)。
  • 存檔與兵種預設:SaveBackupService/SaveBackupManifestCodec 接管存檔掃描、預覽、ZIP 備份、交易式還原與刪除;TroopPresetCodec 接管 4/6/9 欄相容解析與序列化;UnitStatsEditorService/UnitStatsProjectionService 移除 TroopPresetFormModifierForm 的直接依賴。
  • 型別化功能目錄:新增 FeatureKey<T>/FeatureKeys 作為功能 ID 與預設值的單一來源;FeatureRegistry.ValidateToggleIds 於啟動時驗證 UI 開關表完整性。
  • 附帶修正:IsObjdefOriginal 由 fail-open 改為 fail-closed(必須明確解析到 FigRomAnf00_Anfuehrer HP=400);核心讀取統一使用 PatchText.GameEncoding,消除 code-page provider 的測試順序相依。
  • 新增 13 個測試檔覆蓋各解耦切片。

2. d85b528 程式碼審查修正(逐行審查 4acd542 全部 diff 後的存活發現)

  • TroopPresetCodec.Write 改用不變文化最短往返格式,匯出 .artroop 不再把超過兩位小數的自訂值四捨五入;新增精度往返回歸測試。
  • TroopPresetForm 匯出迴圈改為逐格檢查 TryReadValidatedCell 回傳值,與套用路徑一致。
  • SaveBackupService.RestoreBackup 暫存清理警告不再內嵌中文前綴(避免與 UI 的 LogRestoreBackupCleanupFailed 前綴重複);回滾雙重失敗改回解耦前語意——經新增的 onRollbackFailure 回呼記錄,對外重拋原始還原例外而非 AggregateException
  • ModifierForm.Data.csBuildCurrentPatchProfile 提到預設屬性表迴圈外。

審查後刻意保留的行為變化:CleanEparaBaseline 移除註解行尾空白(epara 不參與偵測);TeamDatFeatureDetector 例外時保留部分證據並一律執行 RomanEndless EXE 調和(較舊單體更完善)。

驗證

  • 兩個提交在 CI(windows-latest、Release x64、三專案建置 + 完整 xUnit)均通過:4acd542d85b528(run #68)。
  • 解耦提交的交接紀錄:isolated Release build 0 warnings/errors、full xUnit 186/186、git diff --check 乾淨、AI_HANDOFF 保留 UTF-8 BOM。

🤖 Generated with Claude Code

https://claude.ai/code/session_01C36zfC9C9a4E5nVyXNKp3K


Generated by Claude Code

nojackno2-ctrl and others added 2 commits July 15, 2026 14:28
- TroopPresetCodec.Write 改用不變文化最短往返格式,匯出 .artroop 不再把超過兩位小數的自訂值四捨五入;TroopPresetCodecTests 新增精度往返回歸。
- TroopPresetForm 匯出迴圈改為逐格檢查 TryReadValidatedCell 回傳值,與套用路徑一致,杜絕無效格默默匯出 0 的可能。
- SaveBackupService.RestoreBackup 暫存清理警告不再內嵌中文前綴,避免與 UI 的 LogRestoreBackupCleanupFailed 前綴重複;回滾雙重失敗改回解耦前語意——透過新增的 onRollbackFailure 回呼回報(UI 沿用舊日誌字串),對外重拋原始還原例外而非 AggregateException。
- ModifierForm.Data.cs 將 BuildCurrentPatchProfile 提到預設屬性表迴圈外,每次重載只建構一次。

本環境無 .NET SDK,git diff --check 乾淨;建置與 xUnit 由 CI 驗證。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C36zfC9C9a4E5nVyXNKp3K
@nojackno2-ctrl
nojackno2-ctrl deleted the claude/decoupled-code-review-3ly42q branch July 15, 2026 08:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants