SuperAPI AI 工具集

codebase-design

设计与创作

查看项目

更新于 10-15 23:42

技能介绍

用途:为模块化设计与重构提供统一语言和原则,目标是让调用方获得杠杆、维护者获得局部性、所有人获得可测试性。适用于正在设计或重构代码的任意场景。

核心概念:模块指任何具有接口与实现的东西,刻意不限定规模,可指函数、类、包或跨层切片;避免用单元、组件、服务称呼。接口指调用方正确使用模块所需知道的一切,包括类型签名、不变量、顺序约束、错误模式、必需配置和性能特征,不只是类型层面的API。实现指模块内部的代码主体。适配器指在接缝处满足接口的具体事物,描述角色而非内容。接缝指可以在不编辑该处的情况下改变行为的位置,即接口所在之处;避免用“边界”称呼。深度指接口层面的杠杆:调用方或测试每学习一单位接口所能触发的行为量。深模块是小接口加大量实现;浅模块是接口几乎和实现一样复杂,应避免。杠杆是调用方从深度获得的东西;局部性是维护者从深度获得的东西,让修改、缺陷、知识与验证集中一处。

设计接口时的自问:能否减少方法数量?能否简化参数?能否把更多复杂性藏在内部?

原则:深度是接口的属性而非实现的属性,深模块内部可以由小的、可替换、可mock的部分组成,只要它们不进入接口。删除测试:假想删掉该模块,若复杂性消失说明它只是直通,若复杂性在N个调用方重新出现说明它值得存在。接口即测试面:调用方与测试穿过同一接缝,若需要绕过接口测试,说明模块形状不对。一个适配器只意味着假设的接缝,两个适配器才意味着真实的接缝;除非确有变化跨过接缝,否则不要引入接缝。

可测试性:接受依赖而非创建依赖,例如 function processOrder(order, paymentGateway) {} 而非在内部 new StripeGateway()。返回结果而非产生副作用,例如 function calculateDiscount(cart): Discount {} 而非直接修改 cart.total。保持小表面积:方法更少需要更少测试,参数更少测试准备更简单。

关系:一个模块恰好有一个接口;深度是模块相对其接口的属性;接缝是模块接口所在之处;适配器位于接缝并满足接口;深度为调用方产生杠杆,为维护者产生局部性。

已拒绝的框架:不采用以实现行数与接口行数之比定义深度,因为会奖励填充实现;不把接口等同于TypeScript的interface关键字或类的公开方法,因为过窄;不用“边界”一词,因其与领域驱动设计的有界上下文混淆,应说接缝或接口。

进一步阅读:给定依赖时深化一簇模块见DEEPENING.md,含依赖类别、接缝纪律和替换而非分层测试;探索替代接口见DESIGN-IT-TWICE.md,可启动并行子智能体以几种截然不同的方式设计接口,再按深度、局部性和接缝位置比较。具体安装命令、平台与收费信息暂未提供。