Codebase Design
让必须共同变化的业务规则集中在明确的函数、类或模块中,由这个所有者承担复杂度,消费者只接触必要接口。复杂度能够消失时删除;现有所有者能够承担时直接收回;只有没有合适所有者时才创建最小的新所有者。
按项目知识协议使用相关 CONTEXT 与适用 RULE;已有知识足够时复用,知识不可用时说明缺口并继续。
实现选择先读取 MIN-IMPL.md,停在第一项成立的位置。不要为了套用本 Skill 创建接口、模块或接缝。
所有权判断
对准备抽取或保留的每段结构执行删除检验:
- 删除后复杂度随之消失:删除或内联;
- 删除后同一业务规则散落到多个调用者:集中到已有所有者;
- 规则确实需要共同变化但没有所有者:创建一个最小所有者;
- 只是转发调用、改名、调换参数或补固定默认值:调用方直接表达更清楚时内联。
调用方数量不是单独依据。两个调用方共享多项必须共同变化的业务不变量,可以集中;十个调用方调用一行 getter,也可能不值得封装。
新结构必须同时指出:
- 不可删除的业务规则或边界行为;
- 负责这些规则的所有者;
- 使用该所有者的真实消费者;
- 删除或替换的旧结构。
一个实现不创建可替换接口、工厂或策略;一个固定值不创建配置。以最少概念和文件完成调整,替换旧结构而不是叠加新层。保留显式需求、信任边界校验、安全、无障碍和防止数据丢失的必要行为。
必要词汇
真实复杂度:需求本身要求且删除后仍会由调用者承担的业务规则、状态变化、边界处理或外部交互。
所有者:唯一负责一组必须共同变化规则的现有函数、类或模块。
接口:消费者正确使用所有者必须知道的最小信息,包括签名、不变量、顺序约束和错误模式。
接缝:无需修改消费者即可替换真实外部行为的位置。一个实现通常不形成可替换接缝。
适配器:在必要接缝处连接具体外部行为的代码。不要只为测试创建生产适配器。
局部性:同一规则的变化、缺陷和验证集中在所有者内部,而不是散落到消费者。
引用真实代码时保留已有标识和项目术语,不为统一词汇强行重命名。
最小接口与依赖
- 接口只暴露当前消费者必须使用的操作,不为未来增加方法、参数或配置。
- 依赖只有在真实外部边界或两个真实实现需要替换时才注入;不要把每个 helper 都参数化。
- 优先使用依赖已有的客户端、类型和调用方式,不复制第三方接口。
- 根因修复放在所有调用者汇合的所有者处,不在每个调用者重复加分支。
- 返回值只有在能减少副作用或简化调用契约时才优于原地修改。
- 朴素实现优于聪明实现;两个同样小的方案选择边界行为更正确的一项。
验证面
沿用项目已有验证方式。只有用户要求或现有信号无法建立改动正确性时才补最小检查;不为每个内部函数创建测试层。测试通过所有者的必要接口观察行为,不绑定内部实现。
比较方案
只有用户要求比较方案,或确认必须创建新所有者但仍存在影响显著的接口分歧时,才读取 DESIGN-IT-TWICE.md。普通实现采用第一个可行最小方案。