codebase-design
用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
使用并行 sub-agents 为一个 module 生成多套差异显著的 interface 设计。适用于用户希望设计 API、探索 interface 选项、比较 module 形态,或提到“design it twice”的场景。
运行交互式 QA session:用户通过对话报告 bugs 或 issues,agent 随后创建 GitHub issues;同时在后台探索 codebase,获取上下文和 domain language。适用于用户希望报告 bugs、开展 QA、通过对话创建 issues,或提到“QA session”的场景。
通过用户访谈创建一份由微小 commits 组成的详细 refactor plan,并将其提交为 GitHub issue。适用于用户希望规划 refactor、创建 refactoring RFC,或将 refactor 拆分为安全的增量步骤。
从当前对话中提取一份 DDD 风格的 ubiquitous language glossary,标出歧义并提出规范术语,保存到 UBIQUITOUS_LANGUAGE.md。适用于用户希望定义 domain terms、建立 glossary、收紧术语、创建 ubiquitous language,或提到“domain model”或“DDD”的场景。
询问当前情境适合使用哪个 Skill 或工作流。本 Skill 是仓库内其他 Skills 的路由入口。
从用户指定的固定点(commit、branch、tag 或 merge-base)开始,从两个维度审查代码变更:Standards 检查代码是否遵守仓库记录的编码规范,Spec 检查实现是否符合原始 Issue、PRD 或规格。两个审查由并行子 Agent 分别完成,再并列汇报。适用于用户希望审查分支、PR、开发中的改动,或要求“审查自 X 以来的变更”时。
| name | codebase-design |
| description | 用于设计深模块的共享词汇体系。适用于用户希望设计或改进模块接口、寻找深化机会、决定 seam 的位置、提高代码的可测试性或 Agent 可导航性,或其他 Skill 需要使用深模块词汇时。 |
设计深模块:用很小的接口封装大量行为,把接口放在清晰的 seam 上,并通过该接口完成测试。凡是设计或重组代码,都应使用下列语言和原则。目标是让调用方获得杠杆,让维护者获得局部性,并让所有参与者都能自然地测试代码。
严格使用以下术语,不要替换成 “component”“service”“API” 或 “boundary”。保持语言一致,正是建立这套词汇的目的。
Module(模块)——任何同时拥有接口和实现的事物。该概念刻意不限定规模,可以是一段函数、一个类、一个 package,也可以是跨越多个层级的完整切片。应避免使用:unit、component、service。
Interface(接口)——调用方为了正确使用模块而必须了解的全部内容:既包括类型签名,也包括不变量、顺序限制、错误模式、必要配置和性能特征。应避免使用:API、signature。这两个词范围过窄,只能表达类型层面的表面结构。
Implementation(实现)——模块内部的代码主体。它与 Adapter 含义不同:一个事物可以是很小的 adapter,却拥有很大的实现,例如 Postgres repository;也可以是很大的 adapter,却只有很小的实现,例如内存 fake。讨论 seam 时使用 “adapter”,其他情况下使用 “implementation”。
Depth(深度)——接口提供的杠杆:调用方或测试每学习一单位接口,可以调动多少行为。大量行为隐藏在小接口后面时,模块是深的;接口复杂度几乎与实现相当时,模块是浅的。
Seam(Michael Feathers)——无需在该位置编辑代码,就能改变行为的地方;也就是模块接口所在的位置。把 seam 放在哪里是一项独立设计决策,与 seam 后面封装什么内容不同。应避免使用 boundary,因为它在 DDD 中常用于 bounded context,含义已经过载。
Adapter(适配器)——位于 seam 上、满足某个接口的具体事物。它描述的是角色,也就是填入哪个位置;不描述内部由什么构成。
Leverage(杠杆)——调用方从深度中获得的收益:每学习一单位接口,就能得到更多能力。一份实现可以同时服务 N 个调用点和 M 个测试。
Locality(局部性)——维护者从深度中获得的收益:变更、缺陷、知识和验证集中在一处,而不会散落到各调用方。修复一次,所有位置同时修复。
深模块 = 小接口 + 大量实现:
┌─────────────────────┐
│ 小接口 │ ← 方法少,参数简单
├─────────────────────┤
│ │
│ 深实现 │ ← 复杂逻辑隐藏在内部
│ │
└─────────────────────┘
浅模块 = 大接口 + 少量实现,应避免:
┌─────────────────────────────────┐
│ 大接口 │ ← 方法多,参数复杂
├─────────────────────────────────┤
│ 薄实现 │ ← 只负责透传
└─────────────────────────────────┘
设计接口时询问:
良好接口会让测试自然发生:
接收依赖,不要自行创建依赖。
// 易于测试
function processOrder(order, paymentGateway) {}
// 难以测试
function processOrder(order) {
const gateway = new StripeGateway();
}
返回结果,不要直接制造副作用。
// 易于测试
function calculateDiscount(cart): Discount {}
// 难以测试
function applyDiscount(cart): void {
cart.total -= discount;
}
保持很小的表面积。 方法越少,需要的测试越少;参数越少,测试准备越简单。
interface 关键字或类的 public methods:范围过窄。这里的接口包含调用方必须了解的每一项事实。