Clarify migration boundaries before further layer work

Constraint: L0 must stay free of GameFramework/Unity parsing concerns after the 2026-05-12 boundary correction
Rejected: Keep prior L0/L1 file classifications | would continue to misroute parser and IDataRow work
Confidence: high
Scope-risk: narrow
Directive: Treat historical IDataRow-based Domain entries as transition state until they are moved to L1
Tested: Recounted TODO summary figures and cross-checked the updated boundary notes against current repository state
Not-tested: No code changes or runtime validation involved
This commit is contained in:
Basil 2026-05-12 11:38:20 +08:00
parent 63f9ead583
commit 8c71b60ebf
1 changed files with 94 additions and 51 deletions

145
TODO.md
View File

@ -1,27 +1,58 @@
# GeometryTD 三层拆分迁移 TODO # GeometryTD 三层拆分迁移 TODO(边界纠偏版)
最后更新2026-05-09 最后更新2026-05-12
> **2026-04-30 第一波完成**Definition/Enum + Event > **2026-04-30 第一波完成**Definition/Enum + Event
> **2026-04-30 第二波完成**Vector3/Mathf 替换AttackPayload/HitContext 迁移 > **2026-04-30 第二波完成**Vector3/Mathf 替换AttackPayload/HitContext 迁移
> **2026-05-01 第三波完成**IDataRow 实现、TagRow/RarityTagBudgetRow、TagGenerationRuleRegistry 重构 > **2026-05-01 第三波完成**IDataRow 实现、TagRow/RarityTagBudgetRow、TagGenerationRuleRegistry 重构**现已判定为过渡态方案,非目标边界**
> **2026-05-09 状态校准**:同步仓库实况,补记已落地的 DataStruct / UI/Base / Entity / BinaryReaderExtension并修正 TagRuntimeUtility 路径与各小节计数 > **2026-05-09 状态校准**:同步仓库实况,补记已落地的 DataStruct / UI/Base / Entity / BinaryReaderExtension并修正 TagRuntimeUtility 路径与各小节计数
> **2026-05-10 第四波进行中1.1**:迁移 BackpackInventoryData / EventItem / EventOption / TowerStatsData、CombatParticipantTowerValidation*、ParticipantTowerAssignResult含依赖 TowerItemData
> **2026-05-12 边界纠偏**:明确 L0 不依赖 GameFramework/UnityDataTable 解析、二进制反序列化、IDataRow/DR* 统一归 L1此前已迁但越界项标记为“过渡态待下沉”
---
## 分层判定基线(本文件后续统计以此为准)
### L0Domain纯业务
- 允许:业务实体、值对象、规则服务、领域枚举、领域事件、纯数据模型
- 禁止:
- `UnityEngine.*`
- `UnityGameFramework.*`
- `GameFramework.*`
- `IDataRow` / `DataRowBase`
- `ParseDataRow(string/byte[])`、`BinaryReader/BinaryWriter` 解析细节
### L1Infrastructure技术适配
- 承接DataTable、序列化/反序列化、配置读取、框架适配、桥接/映射
- 允许依赖:`GameFramework.*`、`UnityGameFramework.*`
- 可不依赖 UnityEngine仍属 L1不属于 L0
### L2Presentation表现层
- 承接UI/View、Scene、`MonoBehaviour`、`UGuiForm`、Unity 运行时流程
### 过渡态定义
- 若文件“物理位置”在 `GeometryTD.Domain`,但语义属于 L1例如 `IDataRow`、二进制解析),统一标记为:**过渡态待下沉 L1**
## 概述 ## 概述
| 指标 | 数量 | 状态 | | 指标 | 数量 | 状态 |
|------|------|------| |------|------|------|
| 总文件数 | 457 | - | | 总文件数 | 457 | - |
| L0 (Domain) 可直接迁移 | ~180 | **当前已落地 100+ 项(以本文件勾选和波次记录为准)** | | 阶段一清单L0 候选) | 235 | **已勾选 111 / 未勾选 124按本文件当前勾选** |
| L1 (Infrastructure) 需重构 | ~80 | **项目已建,承接内容仍少** | | Domain 当前 .cs 文件数 | 119 | **其中含“过渡态待下沉 L1”文件如 DataTable Row/Parser** |
| L2 (Presentation) Unity 依赖 | ~197 | **项目骨架已建UI 五层迁移待展开** | | Infrastructure 当前 .cs 文件数 | 3 | **承接明显不足,需补 DR*/Parser/Bridge** |
| Presentation 当前 .cs 文件数 | 1 | **仅项目骨架UI 五层迁移待展开** |
## 项目骨架 ## 项目骨架
``` ```
src/ src/
├── GeometryTD.Domain/ # L0 - 纯净 C#(当前迁移主战场) ├── GeometryTD.Domain/ # L0 - 纯净 C#(当前迁移主战场)
│ ├── DataTable/ # IDataRow 实现 + 纯 C# BinaryReaderExtension │ ├── DataTable/ # 当前含过渡态(目标下沉至 L1
│ ├── Definition/ │ ├── Definition/
│ ├── Event/ │ ├── Event/
│ └── UI/Base/ # IUIFormController / IUIUseCase / UIContext │ └── UI/Base/ # IUIFormController / IUIUseCase / UIContext
@ -33,9 +64,9 @@ src/
--- ---
## 阶段一L0 直接迁移(无需修改 ## 阶段一L0 直接迁移(纯业务,不引入框架依赖
以下文件可直接复制到 `GeometryTD.Domain/`,无任何修改 以下文件原则上可迁移到 `GeometryTD.Domain/`;若引入框架解析职责,改归 L1
### Definition/Enum27 个文件) ### Definition/Enum27 个文件)
@ -69,25 +100,26 @@ src/
> ⚠️ 注:原 TODO 统计 25 个 Enum 文件,实际源文件 23 个。第一波新增 4 个枚举从其他层迁移CombatSelectActionType(UI层)、RunNodeType/RunNodeStatus/RunNodeCompletionStatus(Procedure层) > ⚠️ 注:原 TODO 统计 25 个 Enum 文件,实际源文件 23 个。第一波新增 4 个枚举从其他层迁移CombatSelectActionType(UI层)、RunNodeType/RunNodeStatus/RunNodeCompletionStatus(Procedure层)
### Definition/DataStruct10 个文件) ### Definition/DataStruct11 个文件)
- [x] `Definition/DataStruct/AttackPayload.cs` ⚠️ **已迁移** - Vector3 → System.Numerics.Vector3 - [x] `Definition/DataStruct/AttackPayload.cs` ⚠️ **已迁移** - Vector3 → System.Numerics.Vector3
- [x] `Definition/DataStruct/HitContext.cs` ⚠️ **已迁移** - Vector3 → System.Numerics.Vector3TargetStatusRuntime 已恢复 - [x] `Definition/DataStruct/HitContext.cs` ⚠️ **已迁移** - Vector3 → System.Numerics.Vector3TargetStatusRuntime 已恢复
- [ ] `Definition/DataStruct/BackpackInventoryData.cs` - [x] `Definition/DataStruct/BackpackInventoryData.cs`**已迁移** - 背包聚合数据
- [x] `Definition/DataStruct/BuildInfo.cs`**已迁移** - 纯数据对象 - [x] `Definition/DataStruct/BuildInfo.cs`**已迁移** - 纯数据对象
- [ ] `Definition/DataStruct/EventItem.cs` - [x] `Definition/DataStruct/EventItem.cs`**已迁移** - 事件条目模型
- [ ] `Definition/DataStruct/EventOption.cs` - [x] `Definition/DataStruct/EventOption.cs`**已迁移** - 事件选项模型
- [x] `Definition/DataStruct/ImpactData.cs`**已迁移** - 纯结构体 - [x] `Definition/DataStruct/ImpactData.cs`**已迁移** - 纯结构体
- [x] `Definition/DataStruct/TowerCompItemData.cs`**已迁移** - 背包组件实例模型 - [x] `Definition/DataStruct/TowerCompItemData.cs`**已迁移** - 背包组件实例模型
- [ ] `Definition/DataStruct/TowerStatsData.cs` - [x] `Definition/DataStruct/TowerStatsData.cs`**已迁移** - 塔属性快照
- [x] `Definition/DataStruct/TowerItemData.cs`**已迁移** - 作为 1.1 依赖补迁(移除 Sprite/JsonIgnore
- [x] `Definition/DataStruct/VersionInfo.cs`**已迁移** - 纯数据对象 - [x] `Definition/DataStruct/VersionInfo.cs`**已迁移** - 纯数据对象
### Definition/ 其他 ### Definition/ 其他
- [ ] `Definition/CombatParticipantTowerValidation.cs` - [x] `Definition/CombatParticipantTowerValidation.cs`**已迁移** - 参战塔校验服务
- [ ] `Definition/CombatParticipantTowerValidationText.cs` - [x] `Definition/CombatParticipantTowerValidationText.cs`**已迁移** - 校验结果文案
- [ ] `Definition/InventoryRarityRuleService.cs` - [ ] `Definition/InventoryRarityRuleService.cs`
- [ ] `Definition/ParticipantTowerAssignResult.cs` - [x] `Definition/ParticipantTowerAssignResult.cs`**已迁移** - 参战分配结果模型
### Event35 个文件) ### Event35 个文件)
@ -153,8 +185,8 @@ src/
- [ ] `Definition/Tag/Combat/TagEffectResolver.cs` - [ ] `Definition/Tag/Combat/TagEffectResolver.cs`
- [x] `Definition/Tag/Generation/TagGenerationRule.cs`**已迁移** - 纯 C# - [x] `Definition/Tag/Generation/TagGenerationRule.cs`**已迁移** - 纯 C#
- [x] `Definition/Tag/Generation/RarityTagBudgetRule.cs`**已迁移** - 纯 C# - [x] `Definition/Tag/Generation/RarityTagBudgetRule.cs`**已迁移** - 纯 C#
- [x] `Definition/Tag/Generation/TagGenerationRuleRegistry.cs`**已重构** - 使用 IEnumerable<TagRow> - [x] `Definition/Tag/Generation/TagGenerationRuleRegistry.cs`**已重构** - 当前使用 `IEnumerable<TagRow>`**过渡态待后续改为 L1 输入模型/Mapper**
- [x] `Definition/Tag/Generation/RarityTagBudgetRuleRegistry.cs`**已重构** - 使用 IEnumerable<RarityTagBudgetRow> - [x] `Definition/Tag/Generation/RarityTagBudgetRuleRegistry.cs`**已重构** - 当前使用 `IEnumerable<RarityTagBudgetRow>`**过渡态待后续改为 L1 输入模型/Mapper**
- [ ] `Definition/Tag/Generation/ComponentTagGenerationService.cs` - 依赖 InventoryTagRandomContext - [ ] `Definition/Tag/Generation/ComponentTagGenerationService.cs` - 依赖 InventoryTagRandomContext
- [ ] `Definition/Tag/Generation/InventoryTagRandomContext.cs` - [ ] `Definition/Tag/Generation/InventoryTagRandomContext.cs`
- [x] `Definition/Tag/Metadata/Config/AbsoluteZeroTagConfig.cs` ⚠️ **已迁移** - 无 Unity 依赖 - [x] `Definition/Tag/Metadata/Config/AbsoluteZeroTagConfig.cs` ⚠️ **已迁移** - 无 Unity 依赖
@ -178,11 +210,11 @@ src/
- [ ] `Definition/Event/EventEffect/AddGoldEffect.cs` - [ ] `Definition/Event/EventEffect/AddGoldEffect.cs`
- [ ] `Definition/Event/EventEffect/AddRandomCompsEffect.cs` - [ ] `Definition/Event/EventEffect/AddRandomCompsEffect.cs`
- [ ] `Definition/Event/EventEffect/DamageRandomTowerEnduranceEffect.cs` - [ ] `Definition/Event/EventEffect/DamageRandomTowerEnduranceEffect.cs`
- [ ] `Definition/Event/EventEffect/EventEffectBase.cs` - [x] `Definition/Event/EventEffect/EventEffectBase.cs`**已迁移** - 为 EventOption 提供基础类型
- [ ] `Definition/Event/EventEffect/RemoveRandomCompEffect.cs` - [ ] `Definition/Event/EventEffect/RemoveRandomCompEffect.cs`
- [ ] `Definition/Event/EventOptionExecutor.cs` - [ ] `Definition/Event/EventOptionExecutor.cs`
- [ ] `Definition/Event/EventRequirement/CompCountAtLeastRequirement.cs` - [ ] `Definition/Event/EventRequirement/CompCountAtLeastRequirement.cs`
- [ ] `Definition/Event/EventRequirement/EventRequirementBase.cs` - [x] `Definition/Event/EventRequirement/EventRequirementBase.cs`**已迁移** - 为 EventOption 提供基础类型
- [ ] `Definition/Event/EventRequirement/GoldAtLeastRequirement.cs` - [ ] `Definition/Event/EventRequirement/GoldAtLeastRequirement.cs`
- [ ] `Definition/Event/EventRequirement/HasRelicRequirement.cs` - [ ] `Definition/Event/EventRequirement/HasRelicRequirement.cs`
- [ ] `Definition/Event/EventRequirement/TowerCountAtLeastRequirement.cs` - [ ] `Definition/Event/EventRequirement/TowerCountAtLeastRequirement.cs`
@ -322,7 +354,9 @@ src/
--- ---
## 阶段二L1 重构迁移(需修改后迁移) ## 阶段二L1 重构迁移(技术适配层)
> 说明:以下能力全部归 L1不再计入 L0 完成率。
### 策略 1Vector3 替换 ### 策略 1Vector3 替换
@ -343,9 +377,10 @@ src/
| `Utility/AssetUtility.cs` | `GameEntry.*` → 注入服务 | | `Utility/AssetUtility.cs` | `GameEntry.*` → 注入服务 |
| `Utility/JsonNetUtility.cs` | `GameFramework.Utility.Json` → 注入 | | `Utility/JsonNetUtility.cs` | `GameFramework.Utility.Json` → 注入 |
### 策略 3DataTable 保持 L1 ### 策略 3DataTable / Row 解析统一归 L1
多数 DR* 类继承 `UnityGameFramework.Runtime.DataRowBase`,留在 L1`BinaryReaderExtension` 当前已在 Domain 提供纯 C# 版本: 多数 DR* 类继承 `UnityGameFramework.Runtime.DataRowBase`,留在 L1。
`BinaryReaderExtension/BinaryExtension`(含 `Read7BitEncodedInt32`)属于二进制解析能力,归 L1。
- [ ] `DataTable/DREnemy.cs` - [ ] `DataTable/DREnemy.cs`
- [ ] `DataTable/DRLevel.cs` - [ ] `DataTable/DRLevel.cs`
@ -367,7 +402,10 @@ src/
- [ ] `DataTable/DRUIForm.cs` - [ ] `DataTable/DRUIForm.cs`
- [ ] `DataTable/DRUISound.cs` - [ ] `DataTable/DRUISound.cs`
- [ ] `DataTable/DataTableExtension.cs`(含 Vector3/Color 解析) - [ ] `DataTable/DataTableExtension.cs`(含 Vector3/Color 解析)
- [x] `DataTable/BinaryReaderExtension.cs`**已迁移到 Domain** - 使用纯 C# `Color` / `Color32` / `Rect` struct 替代 Unity 类型 - [ ] `DataTable/BinaryReaderExtension.cs`L1
- [ ] `DataTable/BinaryExtension.cs`L17bit 编码/加密字符串)
- [ ] `DataTable/TagRow.cs`(过渡态待下沉 L1当前包含 `IDataRow + ParseDataRow`
- [ ] `DataTable/RarityTagBudgetRow.cs`(过渡态待下沉 L1当前包含 `IDataRow + ParseDataRow`
### 策略 4Tilemap 接口抽象 ### 策略 4Tilemap 接口抽象
@ -558,27 +596,28 @@ src/
## 关键依赖链 ## 关键依赖链
``` ```
L0 迁移阻塞链 L0/L1 边界阻塞链(纠偏后)
├── TagDefinitionRegistry (L1 重构) ──→ DR* (L1) ──→ DataTableExtension (L1) ├── 领域规则L0依赖输入模型但不依赖 IDataRow/二进制解析
├── AttackPayload (L1 重构) ──→ TagEffectResolver (L1 重构) ├── IDataRow/ParseDataRow/7bit 读取必须下沉至 L1DR*/Bridge/Mapper
└── MapTopologyService (L1 重构) ──→ EntityData (L2) └── L2 通过 L1 获取领域可用模型,不直接触达底层表解析
三层拆分新架构2026-05-01 三层拆分目标架构2026-05-12 校准后
├── L0: IDataRow 实现TagRow, RarityTagBudgetRow ├── L0: 纯领域模型/规则(不实现 IDataRow不包含 ParseDataRow
│ └── Registry 使用 IEnumerable<TagRow> 而非 DRTag ├── L1: DR* / Parser / Bridge / Mapper
└── L1: DR* : DataRowBase + L0 实例成员 │ └── Bridge: UGF DataTableComponent → L0 领域模型
└── Bridge: UGF DataTableComponent → L0 IDataRow └── L2: Unity 运行时/表现层编排
``` ```
### 重构优先级 ### 重构优先级
1. **第一波**Definition/Enum + Event ✅ 已完成 1. **第一波**Definition/Enum + Event ✅ 已完成
2. **第二波**Vector3 → System.Numerics.Vector3Mathf → System.Math ✅ **已完成** 2. **第二波**Vector3 → System.Numerics.Vector3Mathf → System.Math ✅ **已完成**
3. **第三波**IDataRow 实现、TagRow/RarityTagBudgetRow、TagGenerationRuleRegistry ✅ **已完成** 3. **第三波**IDataRow 实现、TagRow/RarityTagBudgetRow、TagGenerationRuleRegistry ✅ **已完成(历史完成项,现已纠偏为过渡态)**
4. **第四波**L1 DR* 包装类 + Bridge 实现UGF DataTable → L0 IDataRow 4. **第四波**:边界纠偏(已开始)——识别并标记 L0 中越界项为“过渡态待下沉”
5. **第五波**GameEntry 静态调用 → 接口注入 5. **第五波**L1 DR* + Parser + BridgeUGF DataTable → L0 领域模型)
6. **第六波**Tilemap 接口抽象 6. **第六波**GameEntry 静态调用 → 接口注入L1/L2
7. **第七波**:剩余 L1 文件迁移 7. **第七波**Tilemap/Color 等 Unity 细节抽象L1/L2
8. **第八波**:清理过渡态,实现 L0 零框架依赖
--- ---
@ -590,9 +629,9 @@ L0 迁移阻塞链:
|------|----------|--------|--------| |------|----------|--------|--------|
| Definition/Enum | 23 | 27* | 100%+ | | Definition/Enum | 23 | 27* | 100%+ |
| Event | 35 | 35 | 100% | | Event | 35 | 35 | 100% |
| **小计** | **58** | **62** | **~34% of L0** | | **小计** | **58** | **62** | **~34% of L0(按当时旧口径统计)** |
> *注Enum 源文件23个第一波新增4个枚举从其他层迁移故总计27个。L0总约180个文件。 > *注Enum 源文件23个第一波新增4个枚举从其他层迁移故总计27个。`L0 总约180个文件` 为当时旧口径估算,**已不作为 2026-05-12 后的边界统计依据**
### 新增文件 ### 新增文件
@ -656,25 +695,29 @@ L0 迁移阻塞链:
### 概述 ### 概述
采用新架构L0 实现 `IDataRow` 接口L1 提供 `DataRowBase` 包装类。 当时采用方案L0 实现 `IDataRow` 接口L1 提供 `DataRowBase` 包装类。
**该方案已在 2026-05-12 边界纠偏后降级为“过渡态”**(原因:`IDataRow/ParseDataRow` 属于 L1 技术适配职责)。
``` ```
L0: TagRow : IDataRow ← 纯 C# 解析逻辑 [过渡态]
L1: DRTag : DataRowBase ← UGF 兼容层,内部持有 TagRow 实例 L0(当前物理位置): TagRow : IDataRow
└── DRTag.ParseDataRow() 委托给 TagRow.ParseDataRow() L1(目标归位): DRTag/DataTableBridge/Parser
Bridge: DataTableComponent ← 将 UGF 数据转换为 L0 Row 集合
[目标态]
L0: 纯领域模型(不实现 IDataRow不含 ParseDataRow
L1: DataTable 解析 + 映射到 L0 模型
``` ```
### 新增文件 ### 新增文件
| 文件 | 说明 | | 文件 | 说明 |
|------|------| |------|------|
| `DataTable/TagRow.cs` | 实现 `IDataRow`,含 TagId, TagType, MinRarity, Weight, IsImplemented | | `DataTable/TagRow.cs` | 现状:实现 `IDataRow`**过渡态待下沉 L1** |
| `DataTable/RarityTagBudgetRow.cs` | 实现 `IDataRow`,含 Id, Rarity, MinCount, MaxCount | | `DataTable/RarityTagBudgetRow.cs` | 现状:实现 `IDataRow`**过渡态待下沉 L1** |
| `Definition/Tag/Generation/TagGenerationRule.cs` | 从 src-ref 迁移 | | `Definition/Tag/Generation/TagGenerationRule.cs` | 从 src-ref 迁移 |
| `Definition/Tag/Generation/RarityTagBudgetRule.cs` | 从 src-ref 迁移 | | `Definition/Tag/Generation/RarityTagBudgetRule.cs` | 从 src-ref 迁移 |
| `Definition/Tag/Generation/TagGenerationRuleRegistry.cs` | 重构为使用 `IEnumerable<TagRow>` | | `Definition/Tag/Generation/TagGenerationRuleRegistry.cs` | 重构为使用 `IEnumerable<TagRow>`**现视为过渡态依赖** |
| `Definition/Tag/Generation/RarityTagBudgetRuleRegistry.cs` | 重构为使用 `IEnumerable<RarityTagBudgetRow>` | | `Definition/Tag/Generation/RarityTagBudgetRuleRegistry.cs` | 重构为使用 `IEnumerable<RarityTagBudgetRow>`**现视为过渡态依赖** |
### L0 构建状态 ### L0 构建状态
@ -684,7 +727,7 @@ Bridge: DataTableComponent ← 将 UGF 数据转换为 L0 Row 集合
- [ ] `DataTable/DRTag : DataRowBase` — 包装 TagRow - [ ] `DataTable/DRTag : DataRowBase` — 包装 TagRow
- [ ] `DataTable/DRRarityTagBudget : DataRowBase` — 包装 RarityTagBudgetRow - [ ] `DataTable/DRRarityTagBudget : DataRowBase` — 包装 RarityTagBudgetRow
- [ ] `Bridge/DataTableBridge` — UGF DataTableComponent → L0 Row 集合 - [ ] `Bridge/DataTableBridge` — UGF DataTableComponent → L0 领域模型集合
--- ---