codebase-design

Installation
SKILL.md

代码库设计

设计深模块(deep module):用简单的接口提供丰富的行为,把接口放在合适的接缝处,并能通过这个接口进行测试。设计或重构代码时,都使用这套术语和原则。目标是让调用方获得杠杆,让维护者获得局部性,让代码便于测试。

术语

讨论模块设计时,一致地使用下面这些术语。组件、服务、API、边界等工程词按各自原义使用,不作为这些术语的同义替换;需要表达本节概念时,使用本节的词。

模块(module):任何具有接口和实现的代码单元。尺度刻意不设限:函数、类、包,或跨越多层的一段能力。组件、服务、单元是更具体的工程概念,只在符合其原义时使用。

接口(interface):调用方正确使用模块所需知道的一切。除了类型签名,还包括不变量、顺序约束、错误模式、必需配置和性能特征。API 和函数签名只覆盖类型层面的表面,讨论完整的使用约定时说“接口”。

实现(implementation):模块内部的代码主体。它与适配器不同:一个模块可以是很薄的适配器配上复杂的实现(例如 Postgres 仓储),也可以是复杂的适配器配上简单的实现(例如内存假实现)。讨论接缝时说“适配器”,其他时候说“实现”。

深度(depth):接口带来的杠杆,即调用方(或测试)每理解一单位接口能使用多少行为。用简单的接口提供大量行为,模块就;接口几乎和实现一样复杂,模块就

接缝(seam,来自 Michael Feathers):无需修改该处代码就能替换行为的位置,也就是模块接口所在的位置。接缝放在哪里是一个独立的设计决策,与接缝后面放什么不同。“边界”在 DDD 中容易让人联想到限界上下文,所以指代这个位置时说“接缝”。

适配器(adapter):在接缝处实现接口的具体代码。它描述的是角色(填补哪个位置),不描述内容(内部有什么)。

Installs
3
First Seen
8 days ago
codebase-design — hydrz/dev-skills