高复用高阶逻辑模块的核心是提炼业务共性、封装变化点、暴露稳定契约,通过函数工厂(如createRiskPipeline)实现可组合、无状态、类型明确、错误可控的逻辑模板,并配套测试与灰度能力。

编写高复用的高阶逻辑模块,核心不是堆功能,而是提炼业务共性、封装变化点、暴露稳定契约。它要能被订单、支付、营销等不同业务线按需组合,而不是为某一条线定制。
聚焦可变与不变的分离
高阶逻辑的本质是“逻辑模板”——把各业务线中重复出现的流程骨架抽出来,把差异部分留给调用方决定。
- 比如“风控校验流程”:前置检查 → 规则引擎执行 → 结果拦截/放行 → 日志归档。其中规则引擎和拦截策略因业务而异,但流程顺序和错误传播方式是固定的
- 不要写
orderRiskCheck()或payRiskCheck(),而是导出createRiskPipeline({ validator, onBlock, onPass }),返回一个可复用的校验函数 - 用函数工厂或类构造器接收配置项,而非硬编码分支判断;配置项应是纯对象或函数,避免传入具体业务实例(如
OrderService)
用组合代替继承,用函数参数代替状态共享
高复用模块最怕隐式依赖和内部状态污染。所有行为必须显式驱动,不依赖外部变量或单例。
- 拒绝
class RiskManager { constructor() { this.cache = new Map() } }这种带内部状态的设计;改为function withCache(fn, cacheKeyFn) { ... },让调用方决定是否缓存、如何缓存 - 把副作用(如日志、上报、重试)抽成中间件式函数,通过组合注入:
pipeline(pipe1, pipe2, logMiddleware, reportMiddleware) - 多条业务线可能需要不同重试策略:提供
retryWithExponentialBackoff、retryWithFixedDelay等独立函数,而非在模块里内置一种
接口精简,类型明确,错误可控
复用的前提是调用简单、出错好查。一个高阶模块对外暴露的 API 应该像工具箱里的扳手——形状统一、用途清晰、不咬手。
立即学习“Java免费学习笔记(深入)”;
- 只导出命名导出(named exports),避免默认导出;每个函数名直指意图,如
createAsyncResourceLoader、buildIdempotentExecutor - 输入输出类型尽量用 TypeScript interface 或 JSDoc 标注;禁止返回
any或Map这类弱结构,改用具名结果类型:{ success: true; data: T } | { success: false; error: string } - 错误不抛原始异常,而是统一包装为
BusinessError子类(如ValidationError、TimeoutError),并附带code字段供业务线做差异化处理
配套可测试、可演进的基础设施
高复用模块不是写完就扔,它需要支撑持续迭代和灰度验证。
- 每个模块自带单元测试用例,覆盖典型路径 + 边界场景(空输入、超时、规则不匹配等)
- 预留调试钩子:如
onDebug: (step, context) => void配置项,方便业务线开启详细日志而不侵入主逻辑 - 支持运行时开关:通过
featureFlag控制某段逻辑是否启用,便于新老逻辑并行、AB 测试或快速回滚


















