用途:针对 Dart 中「臃肿闭包」与「深层嵌套作用域」代码坏味道,应用 Martin Fowler「Replace Method with Method Object」的 Dart 变体。适用于函数内含多个局部函数、且这些局部函数大量捕获外层作用域变量、顶层函数局部变量多、难以单独测试或圈复杂度过高的情况;当状态能通过参数清晰传递、或只是无状态的线性流水线时不应使用,以免过度工程。
主要能力:分两个阶段。阶段一将原函数逻辑迁移进专用类:原函数参数变为构造函数参数,局部变量提升为实例字段,内部函数变为实例方法。阶段二做门面委派:runner 类以单下划线前缀设为库私有,原公有函数保留为门面,实例化私有类并调用其编排方法(通常为 run())。对类实例方法,可通过构造函数传入外层 this 引用以访问外层依赖;同步、异步与泛型方法均有对应写法。
使用方式:先识别候选并确认测试覆盖;分析外层参数与局部变量;创建 _OriginalFunctionNameRunner 私有类并声明字段与构造器;实现 run();把各内部函数迁移为私有实例方法并将闭包捕获改为访问实例字段;将原函数体替换为对 runner 的调用,单行时优先使用 =>;最后运行 dart format、dart analyze 与 dart test 验证。
限制:必须严格保留原公有函数的参数、返回类型、注解与泛型,不得引入破坏性变更;runner 类必须以 _ 前缀保持库私有;runner 表示单次调用状态,不应长期保存实例或对同一实例重复调用 run();构造函数应只做轻量、不抛异常的字段初始化,复杂逻辑与异步操作放在 run() 中。若原函数没有密集的内部闭包捕获,则不应引入 runner 类。