diff --git a/GFramework.Core/Command/AbstractAsyncCommand.cs b/GFramework.Core/Command/AbstractAsyncCommand.cs index e0d2ca1a..a97411e4 100644 --- a/GFramework.Core/Command/AbstractAsyncCommand.cs +++ b/GFramework.Core/Command/AbstractAsyncCommand.cs @@ -1,5 +1,6 @@ using GFramework.Core.Abstractions.Command; using GFramework.Core.Rule; +using GFramework.Cqrs.Abstractions.Cqrs.Command; namespace GFramework.Core.Command; @@ -26,3 +27,54 @@ public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand /// 表示异步操作的任务 protected abstract Task OnExecuteAsync(); } + +/// +/// 抽象异步命令基类,为需要命令输入且无返回值的异步命令提供统一执行骨架。 +/// +/// 命令输入类型,必须实现 接口。 +/// 命令输入参数。 +public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand + where TInput : ICommandInput +{ + /// + /// 执行异步命令的实现方法。 + /// + /// 表示异步操作的任务。 + async Task IAsyncCommand.ExecuteAsync() + { + await OnExecuteAsync(input).ConfigureAwait(false); + } + + /// + /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑。 + /// + /// 命令输入参数。 + /// 表示异步操作的任务。 + protected abstract Task OnExecuteAsync(TInput input); +} + +/// +/// 抽象异步命令基类,为需要命令输入且返回结果的异步命令提供统一执行骨架。 +/// +/// 命令输入类型,必须实现 接口。 +/// 命令执行结果类型。 +/// 命令输入参数。 +public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand + where TInput : ICommandInput +{ + /// + /// 执行异步命令并返回结果的实现方法。 + /// + /// 表示异步操作且包含结果的任务。 + async Task IAsyncCommand.ExecuteAsync() + { + return await OnExecuteAsync(input).ConfigureAwait(false); + } + + /// + /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果。 + /// + /// 命令输入参数。 + /// 表示异步操作且包含结果的任务。 + protected abstract Task OnExecuteAsync(TInput input); +} diff --git a/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs b/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs deleted file mode 100644 index 00fcaaba..00000000 --- a/GFramework.Core/Command/AbstractAsyncCommandWithInput.cs +++ /dev/null @@ -1,29 +0,0 @@ -using GFramework.Core.Abstractions.Command; -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Command; - -namespace GFramework.Core.Command; - -/// -/// 抽象异步命令基类,用于处理无返回值的异步命令操作 -/// -/// 命令输入类型,必须实现ICommandInput接口 -public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand - where TInput : ICommandInput -{ - /// - /// 执行异步命令的实现方法 - /// - /// 表示异步操作的任务 - async Task IAsyncCommand.ExecuteAsync() - { - await OnExecuteAsync(input).ConfigureAwait(false); - } - - /// - /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑 - /// - /// 命令输入参数 - /// 表示异步操作的任务 - protected abstract Task OnExecuteAsync(TInput input); -} diff --git a/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs b/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs deleted file mode 100644 index 7d1f6a91..00000000 --- a/GFramework.Core/Command/AbstractAsyncCommandWithResult.cs +++ /dev/null @@ -1,30 +0,0 @@ -using GFramework.Core.Abstractions.Command; -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Command; - -namespace GFramework.Core.Command; - -/// -/// 抽象异步命令基类,用于处理有返回值的异步命令操作 -/// -/// 命令输入类型,必须实现ICommandInput接口 -/// 命令执行结果类型 -public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand - where TInput : ICommandInput -{ - /// - /// 执行异步命令并返回结果的实现方法 - /// - /// 表示异步操作且包含结果的任务 - async Task IAsyncCommand.ExecuteAsync() - { - return await OnExecuteAsync(input).ConfigureAwait(false); - } - - /// - /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果 - /// - /// 命令输入参数 - /// 表示异步操作且包含结果的任务 - protected abstract Task OnExecuteAsync(TInput input); -} diff --git a/GFramework.Core/Command/AbstractCommand.cs b/GFramework.Core/Command/AbstractCommand.cs index c83b1698..ce28d162 100644 --- a/GFramework.Core/Command/AbstractCommand.cs +++ b/GFramework.Core/Command/AbstractCommand.cs @@ -1,5 +1,7 @@ using GFramework.Core.Abstractions.Command; using GFramework.Core.Rule; +using GFramework.Cqrs.Abstractions.Cqrs.Command; +using ICommand = GFramework.Core.Abstractions.Command.ICommand; namespace GFramework.Core.Command; @@ -20,4 +22,55 @@ public abstract class AbstractCommand : ContextAwareBase, ICommand /// 命令执行的抽象方法,由派生类实现具体的命令逻辑 /// protected abstract void OnExecute(); -} \ No newline at end of file +} + +/// +/// 抽象命令类,实现 接口,为需要命令输入的具体命令提供基础架构支持。 +/// +/// 命令输入参数类型,必须实现 接口。 +/// 命令执行所需的输入参数。 +public abstract class AbstractCommand(TInput input) : ContextAwareBase, ICommand + where TInput : ICommandInput +{ + /// + /// 执行命令的入口方法,实现 接口的 Execute 方法。 + /// + void ICommand.Execute() + { + OnExecute(input); + } + + /// + /// 命令执行的抽象方法,由派生类实现具体的命令逻辑。 + /// + /// 命令执行所需的输入参数。 + protected abstract void OnExecute(TInput input); +} + +/// +/// 带返回值的抽象命令类,为需要输入和返回值的命令提供统一执行骨架。 +/// +/// 命令输入参数类型,必须实现 接口。 +/// 命令执行后返回的结果类型。 +/// 命令执行所需的输入参数。 +public abstract class AbstractCommand(TInput input) + : ContextAwareBase, GFramework.Core.Abstractions.Command.ICommand + where TInput : ICommandInput +{ + /// + /// 执行命令的入口方法,实现 接口的 + /// Execute 方法。 + /// + /// 命令执行后的结果。 + TResult GFramework.Core.Abstractions.Command.ICommand.Execute() + { + return OnExecute(input); + } + + /// + /// 命令执行的抽象方法,由派生类实现具体的命令逻辑。 + /// + /// 命令执行所需的输入参数。 + /// 命令执行后的结果。 + protected abstract TResult OnExecute(TInput input); +} diff --git a/GFramework.Core/Command/AbstractCommandWithInput.cs b/GFramework.Core/Command/AbstractCommandWithInput.cs deleted file mode 100644 index c3ebbb03..00000000 --- a/GFramework.Core/Command/AbstractCommandWithInput.cs +++ /dev/null @@ -1,28 +0,0 @@ -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Command; -using ICommand = GFramework.Core.Abstractions.Command.ICommand; - -namespace GFramework.Core.Command; - -/// -/// 抽象命令类,实现 ICommand 接口,为具体命令提供基础架构支持 -/// -/// 命令输入参数类型,必须实现 ICommandInput 接口 -/// 命令执行所需的输入参数 -public abstract class AbstractCommand(TInput input) : ContextAwareBase, ICommand - where TInput : ICommandInput -{ - /// - /// 执行命令的入口方法,实现 ICommand 接口的 Execute 方法 - /// - void ICommand.Execute() - { - OnExecute(input); - } - - /// - /// 命令执行的抽象方法,由派生类实现具体的命令逻辑 - /// - /// 命令执行所需的输入参数 - protected abstract void OnExecute(TInput input); -} diff --git a/GFramework.Core/Command/AbstractCommandWithResult.cs b/GFramework.Core/Command/AbstractCommandWithResult.cs deleted file mode 100644 index ca40957a..00000000 --- a/GFramework.Core/Command/AbstractCommandWithResult.cs +++ /dev/null @@ -1,31 +0,0 @@ -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Command; - -namespace GFramework.Core.Command; - -/// -/// 带返回值的抽象命令类,实现 ICommand{TResult} 接口,为需要返回结果的命令提供基础架构支持 -/// -/// 命令输入参数类型,必须实现 ICommandInput 接口 -/// 命令执行后返回的结果类型 -/// 命令执行所需的输入参数 -public abstract class AbstractCommand(TInput input) - : ContextAwareBase, Abstractions.Command.ICommand - where TInput : ICommandInput -{ - /// - /// 执行命令的入口方法,实现 ICommand{TResult} 接口的 Execute 方法 - /// - /// 命令执行后的结果 - TResult Abstractions.Command.ICommand.Execute() - { - return OnExecute(input); - } - - /// - /// 命令执行的抽象方法,由派生类实现具体的命令逻辑 - /// - /// 命令执行所需的输入参数 - /// 命令执行后的结果 - protected abstract TResult OnExecute(TInput input); -} diff --git a/GFramework.Core/Events/EasyEventGeneric.cs b/GFramework.Core/Events/Event.cs similarity index 65% rename from GFramework.Core/Events/EasyEventGeneric.cs rename to GFramework.Core/Events/Event.cs index e116603c..57205255 100644 --- a/GFramework.Core/Events/EasyEventGeneric.cs +++ b/GFramework.Core/Events/Event.cs @@ -3,8 +3,8 @@ namespace GFramework.Core.Events; /// -/// 泛型事件类,支持一个泛型参数 T 的事件注册、注销与触发。 -/// 实现了 IEvent 接口以提供统一的事件操作接口。 +/// 泛型事件类,支持一个泛型参数 的事件注册、注销与触发。 +/// 实现了 接口以提供统一的事件操作接口。 /// /// 事件回调函数的第一个参数类型。 public class Event : IEvent @@ -16,11 +16,11 @@ public class Event : IEvent private Action? _mOnEvent = _ => { }; /// - /// 显式实现 IEvent 接口中的 Register 方法。 - /// 允许使用无参 Action 来订阅当前带参事件。 + /// 显式实现 接口中的 Register 方法。 + /// 允许使用无参 来订阅当前带参事件。 /// /// 无参事件处理方法。 - /// IUnRegister 对象,用于稍后注销该事件监听器。 + /// 对象,用于稍后注销该事件监听器。 IUnRegister IEvent.Register(Action onEvent) { return Register(Action); @@ -35,7 +35,7 @@ public class Event : IEvent /// 注册一个事件监听器,并返回可用于取消注册的对象。 /// /// 要注册的事件处理方法。 - /// IUnRegister 对象,用于稍后注销该事件监听器。 + /// 对象,用于稍后注销该事件监听器。 public IUnRegister Register(Action onEvent) { _mOnEvent += onEvent; @@ -52,7 +52,7 @@ public class Event : IEvent } /// - /// 触发所有已注册的事件处理程序,并传递参数 t。 + /// 触发所有已注册的事件处理程序,并传递参数 。 /// /// 传递给事件处理程序的参数。 public void Trigger(T t) @@ -61,9 +61,9 @@ public class Event : IEvent } /// - /// 获取当前已注册的监听器数量 + /// 获取当前已注册的监听器数量。 /// - /// 监听器数量 + /// 监听器数量。 public int GetListenerCount() { return _mOnEvent?.GetInvocationList().Length ?? 0; @@ -71,30 +71,30 @@ public class Event : IEvent } /// -/// 支持两个泛型参数 T 和 TK 的事件类。 +/// 支持两个泛型参数 的事件类。 /// 提供事件注册、注销和触发功能。 /// /// 第一个参数类型。 -/// 第二个参数类型。 -public class Event : IEvent +/// 第二个参数类型。 +public class Event : IEvent { /// /// 存储已注册的双参数事件处理委托。 /// 默认为空操作(no-op)委托。 /// - private Action? _mOnEvent = (_, _) => { }; + private Action? _mOnEvent = (_, _) => { }; /// - /// 显式实现 IEvent 接口中的 Register 方法。 - /// 允许使用无参 Action 来订阅当前带参事件。 + /// 显式实现 接口中的 Register 方法。 + /// 允许使用无参 来订阅当前带参事件。 /// /// 无参事件处理方法。 - /// IUnRegister 对象,用于稍后注销该事件监听器。 + /// 对象,用于稍后注销该事件监听器。 IUnRegister IEvent.Register(Action onEvent) { return Register(Action); - void Action(T _, Tk __) + void Action(T _, TK __) { onEvent(); } @@ -104,8 +104,8 @@ public class Event : IEvent /// 注册一个接受两个参数的事件监听器,并返回可用于取消注册的对象。 /// /// 要注册的事件处理方法。 - /// IUnRegister 对象,用于稍后注销该事件监听器。 - public IUnRegister Register(Action onEvent) + /// 对象,用于稍后注销该事件监听器。 + public IUnRegister Register(Action onEvent) { _mOnEvent += onEvent; return new DefaultUnRegister(() => UnRegister(onEvent)); @@ -115,27 +115,27 @@ public class Event : IEvent /// 取消指定的双参数事件监听器。 /// /// 需要被注销的事件处理方法。 - public void UnRegister(Action onEvent) + public void UnRegister(Action onEvent) { _mOnEvent -= onEvent; } /// - /// 触发所有已注册的事件处理程序,并传递参数 t 和 k。 + /// 触发所有已注册的事件处理程序,并传递参数 。 /// /// 第一个参数。 /// 第二个参数。 - public void Trigger(T t, Tk k) + public void Trigger(T t, TK k) { _mOnEvent?.Invoke(t, k); } /// - /// 获取当前已注册的监听器数量 + /// 获取当前已注册的监听器数量。 /// - /// 监听器数量 + /// 监听器数量。 public int GetListenerCount() { return _mOnEvent?.GetInvocationList().Length ?? 0; } -} \ No newline at end of file +} diff --git a/GFramework.Core/Query/AbstractAsyncQuery.cs b/GFramework.Core/Query/AbstractAsyncQuery.cs index 5e50b5f3..27d517fc 100644 --- a/GFramework.Core/Query/AbstractAsyncQuery.cs +++ b/GFramework.Core/Query/AbstractAsyncQuery.cs @@ -1,5 +1,6 @@ using GFramework.Core.Abstractions.Query; using GFramework.Core.Rule; +using GFramework.Cqrs.Abstractions.Cqrs.Query; namespace GFramework.Core.Query; @@ -24,4 +25,31 @@ public abstract class AbstractAsyncQuery : ContextAwareBase, IAsyncQuer /// /// 返回查询结果的异步任务 protected abstract Task OnDoAsync(); -} \ No newline at end of file +} + +/// +/// 抽象异步查询基类,为需要输入参数的异步查询提供统一执行骨架。 +/// +/// 查询输入类型,必须实现 接口。 +/// 查询结果类型。 +/// 查询输入参数。 +public abstract class AbstractAsyncQuery(TInput input) + : ContextAwareBase, IAsyncQuery + where TInput : IQueryInput +{ + /// + /// 执行异步查询操作。 + /// + /// 返回查询结果的异步任务。 + public Task DoAsync() + { + return OnDoAsync(input); + } + + /// + /// 抽象方法,用于实现具体的异步查询逻辑。 + /// + /// 查询输入参数。 + /// 返回查询结果的异步任务。 + protected abstract Task OnDoAsync(TInput input); +} diff --git a/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs b/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs deleted file mode 100644 index 03713712..00000000 --- a/GFramework.Core/Query/AbstractAsyncQueryWithResult.cs +++ /dev/null @@ -1,33 +0,0 @@ -using GFramework.Core.Abstractions.Query; -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Query; - -namespace GFramework.Core.Query; - -/// -/// 抽象异步查询基类,用于处理输入类型为TInput、结果类型为TResult的异步查询操作 -/// -/// 查询输入类型,必须实现IQueryInput接口 -/// 查询结果类型 -/// 查询输入参数 -public abstract class AbstractAsyncQuery( - TInput input -) : ContextAwareBase, IAsyncQuery - where TInput : IQueryInput -{ - /// - /// 执行异步查询操作 - /// - /// 返回查询结果的异步任务 - public Task DoAsync() - { - return OnDoAsync(input); - } - - /// - /// 抽象方法,用于实现具体的异步查询逻辑 - /// - /// 查询输入参数 - /// 返回查询结果的异步任务 - protected abstract Task OnDoAsync(TInput input); -} diff --git a/GFramework.Core/Query/AbstractQuery.cs b/GFramework.Core/Query/AbstractQuery.cs index 35f2c9b2..c9849011 100644 --- a/GFramework.Core/Query/AbstractQuery.cs +++ b/GFramework.Core/Query/AbstractQuery.cs @@ -1,5 +1,6 @@ using GFramework.Core.Abstractions.Query; using GFramework.Core.Rule; +using GFramework.Cqrs.Abstractions.Cqrs.Query; namespace GFramework.Core.Query; @@ -7,7 +8,7 @@ namespace GFramework.Core.Query; /// 抽象查询类,提供查询操作的基础实现 /// /// 查询结果的类型 -public abstract class AbstractQuery : ContextAwareBase, IQuery +public abstract class AbstractQuery : ContextAwareBase, GFramework.Core.Abstractions.Query.IQuery { /// @@ -25,4 +26,31 @@ public abstract class AbstractQuery : ContextAwareBase, IQuery /// /// 查询结果,类型为TResult protected abstract TResult OnDo(); -} \ No newline at end of file +} + +/// +/// 抽象查询类,为需要输入参数的同步查询提供基础实现。 +/// +/// 查询输入参数的类型,必须实现 接口。 +/// 查询结果的类型。 +/// 查询输入参数。 +public abstract class AbstractQuery(TInput input) + : ContextAwareBase, GFramework.Core.Abstractions.Query.IQuery + where TInput : IQueryInput +{ + /// + /// 执行查询操作。 + /// + /// 查询结果,类型为 + public TResult Do() + { + return OnDo(input); + } + + /// + /// 抽象方法,用于实现具体的查询逻辑。 + /// + /// 查询输入参数。 + /// 查询结果。 + protected abstract TResult OnDo(TInput input); +} diff --git a/GFramework.Core/Query/AbstractQueryWithResult.cs b/GFramework.Core/Query/AbstractQueryWithResult.cs deleted file mode 100644 index ae099abe..00000000 --- a/GFramework.Core/Query/AbstractQueryWithResult.cs +++ /dev/null @@ -1,30 +0,0 @@ -using GFramework.Core.Rule; -using GFramework.Cqrs.Abstractions.Cqrs.Query; - -namespace GFramework.Core.Query; - -/// -/// 抽象查询类,提供查询操作的基础实现 -/// -/// 查询输入参数的类型,必须实现IQueryInput接口 -/// 查询结果的类型 -public abstract class AbstractQuery(TInput input) - : ContextAwareBase, Abstractions.Query.IQuery - where TInput : IQueryInput -{ - /// - /// 执行查询操作 - /// - /// 查询结果,类型为TResult - public TResult Do() - { - return OnDo(input); - } - - /// - /// 抽象方法,用于实现具体的查询逻辑 - /// - /// 查询输入参数 - /// 查询结果,类型为TResult - protected abstract TResult OnDo(TInput input); -} diff --git a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md index 68d9ab65..5ed33a95 100644 --- a/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md +++ b/ai-plan/public/analyzer-warning-reduction/todos/analyzer-warning-reduction-tracking.md @@ -7,12 +7,13 @@ ## 当前恢复点 -- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-008` -- 当前阶段:`Phase 8` +- 恢复点编号:`ANALYZER-WARNING-REDUCTION-RP-009` +- 当前阶段:`Phase 9` - 当前焦点: - - 当前 `MA0051` 主线已完成;后续改为按 warning 类型和数量批处理,而不是继续按单文件切片推进 - - 优先批量收敛当前数量最高且风险较低的类型;当某一轮主类型数量不足时,允许顺手合并其他低冲突 warning 类型, - `MA0015` 与 `MA0077` 只是当前最明显的低数量示例,不构成限定 + - 当前 `MA0048` 已在 `GFramework.Core` 的 `net8.0` warnings-only 基线中清零;下一轮切到 `MA0046` + - 后续继续按 warning 类型和数量批处理,而不是回退到按单文件切片推进 + - 当某一轮主类型数量不足时,允许顺手合并其他低冲突 warning 类型,`MA0015` 与 `MA0077` + 只是当前最明显的低数量示例,不构成限定 - 单次 `boot` 的工作树改动上限控制在约 `100` 个文件以内,避免 recovery context 与 review 面同时失控 - 若任务边界互不冲突,允许使用不同模型的 subagent 并行处理不同 warning 类型或不同目录,但必须遵守显式 ownership @@ -20,9 +21,9 @@ - 已完成 `GFramework.Core`、`GFramework.Cqrs`、`GFramework.Godot` 与部分 source generator 的低风险 warning 清理 - 已完成多轮 CodeRabbit follow-up 修复,并用定向测试与项目/解决方案构建验证了关键回归风险 -- 当前 `PauseStackManager`、`Store` 与 `CoroutineScheduler` 的长方法 warning 已从 active 入口移除;主题内剩余 warning - 主要集中在 `MA0048` 文件/类型命名冲突、`MA0046` delegate 形状、`MA0016` 集合抽象接口、`MA0002` comparer 重载, - 以及 `MA0015` / `MA0077` 两个低数量尾项 +- 当前 `PauseStackManager`、`Store`、`CoroutineScheduler` 与 `GFramework.Core` 的 `MA0048` + 文件/类型命名冲突已从 active 入口移除;主题内剩余 warning 主要集中在 `MA0046` delegate 形状、 + `MA0016` 集合抽象接口、`MA0002` comparer 重载,以及 `MA0015` / `MA0077` 两个低数量尾项 ## 当前活跃事实 @@ -38,12 +39,14 @@ 调度、取消与完成状态语义未回归 - `RP-008` 将后续策略从“单文件 warning 切片”切换为“按类型批处理 + 文件数上限控制”,并允许在非冲突前提下使用 不同模型的 subagent 并行处理 +- `RP-009` 在不改公共 API 的前提下,将同名泛型家族收拢到与类型名一致的单文件中,清空当前 `GFramework.Core` + `net8.0` 基线中的 `MA0048`,并通过定向 build/test 验证 `Command`、`Query`、`Event` 路径未回归 - 当前工作树分支 `fix/analyzer-warning-reduction-batch` 已在 `ai-plan/public/README.md` 建立 topic 映射 ## 当前风险 -- 结构性重构风险:剩余 `GFramework.Core` 侧 `MA0051` 与 `MA0048` 可能要求较大的文件拆分或类型重命名 - - 缓解措施:按 warning 类型分批推进,并把单次 `boot` 的文件改动规模控制在约 `100` 个文件以内 +- 公共契约兼容风险:剩余 `MA0046` / `MA0016` 若直接改公开委托或集合类型,可能波及用户代码 + - 缓解措施:优先选择不改公共 API 的低风险切法;若必须触达公共契约,先补齐 XML 契约说明与定向测试 - 测试宿主稳定性风险:部分 Godot 失败路径在当前 .NET 测试宿主下仍不稳定 - 缓解措施:继续优先使用稳定的 targeted test、项目构建和相邻 smoke test 组合验证 - 多目标框架 warning 解释风险:同一源位置会在多个 target framework 下重复计数 @@ -86,11 +89,16 @@ - `RP-008` 的策略基线: - 当前 `GFramework.Core` 剩余 warning 分布:`MA0048=8`、`MA0046=6`、`MA0016=5`、`MA0002=2`、`MA0015=1`、`MA0077=1` - 后续批处理规则:优先按类型推进;若当轮主类型数量不足,可顺手吸收其他低冲突类型,不限定于 `MA0015` 与 `MA0077` +- `RP-009` 的定向验证结果: + - `dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"` + - 结果:`15 Warning(s)`,`0 Error(s)`;当前 `GFramework.Core` `net8.0` warnings-only 输出中已不再出现 `MA0048` + - `dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~CommandExecutorTests|FullyQualifiedName~AbstractAsyncCommandTests|FullyQualifiedName~QueryExecutorTests|FullyQualifiedName~AbstractAsyncQueryTests|FullyQualifiedName~EventTests" -m:1 -p:RestoreFallbackFolders="" -nologo` + - 结果:`83 Passed`,`0 Failed` - active 跟踪文件只保留当前恢复点、活跃事实、风险与下一步,不再重复保存已完成阶段的长篇历史 ## 下一步 1. 若要继续该主题,先读 active tracking,再按需展开历史归档中的 warning 热点与验证记录 -2. 下一轮优先以 `MA0048` 为主批次启动;若改动规模和风险允许,可顺手并入其他低冲突类型,而不限定于单独的尾项 warning -3. 若 `MA0048` 的文件 ownership 可以清晰切分,允许使用不同模型的 subagent 并行处理互不冲突的目录或类型簇 +2. 下一轮优先以 `MA0046` 为主批次启动,先从 `Architecture*` 与 `CoroutineScheduler` 的低风险 delegate 形状修正中选一个切入点 +3. 若 `MA0046` 的文件 ownership 可以清晰切分,允许使用不同模型的 subagent 并行处理互不冲突的目录或类型簇 4. 若本主题确认暂缓,可保持当前归档状态,不需要再恢复 `local-plan/` diff --git a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md index 188e0c0c..54e82d98 100644 --- a/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md +++ b/ai-plan/public/analyzer-warning-reduction/traces/analyzer-warning-reduction-trace.md @@ -1,5 +1,30 @@ # Analyzer Warning Reduction 追踪 +## 2026-04-21 — RP-009 + +### 阶段:`MA0048` 批次收口(RP-009) + +- 依据 `RP-008` 的批处理策略,本轮继续从 `GFramework.Core` 的 `MA0048` 启动,但不采用重命名公共类型的高风险做法; + 改为把同名不同泛型 arity 的家族收拢到与类型名一致的单文件中 +- 具体调整: + - 将 `AbstractCommand` 与 `AbstractCommand` 合并进 `AbstractCommand.cs` + - 将 `AbstractAsyncCommand` 与 `AbstractAsyncCommand` 合并进 `AbstractAsyncCommand.cs` + - 将 `AbstractQuery` 合并进 `AbstractQuery.cs` + - 将 `AbstractAsyncQuery` 合并进 `AbstractAsyncQuery.cs` + - 将泛型 `Event` / `Event` 从 `EasyEventGeneric.cs` 迁移到 `Event.cs` +- 首次构建暴露出合并后的 `ICommand` / `IQuery` 命名空间歧义;随后改用 + `GFramework.Core.Abstractions.*` 的限定名完成最小修正,没有引入行为改动 +- 定向验证通过: + - `dotnet build GFramework.Core/GFramework.Core.csproj -c Release -t:Rebuild --no-restore -p:UseSharedCompilation=false -p:TargetFramework=net8.0 -p:RestoreFallbackFolders="" -nologo -clp:"Summary;WarningsOnly"` + - 结果:`15 Warning(s)`,`0 Error(s)`;`MA0048` 已从当前 `GFramework.Core` `net8.0` warnings-only 基线中清空 + - `dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~CommandExecutorTests|FullyQualifiedName~AbstractAsyncCommandTests|FullyQualifiedName~QueryExecutorTests|FullyQualifiedName~AbstractAsyncQueryTests|FullyQualifiedName~EventTests" -m:1 -p:RestoreFallbackFolders="" -nologo` + - 结果:`83 Passed`,`0 Failed` +- 当前建议的下一批次顺序更新为: + - 第一优先级:`MA0046` + - 第二优先级:`MA0016` + - 顺手吸收:`MA0015`、`MA0077` + - 单独评估:`MA0002` + ## 2026-04-21 — RP-008 ### 阶段:批处理策略切换(RP-008)