核心问题
抽象应该停在哪里?
工程困境
Purchase、Enrollment、CourseAssignment 都和课程有关,于是有人抽:
type CourseRelation = { type: string; metadata: Record<string, unknown> }
结果所有规则都藏进 type 和 metadata。
思想模型
抽象应该覆盖稳定重复的变化轴,而不是覆盖表面相似。
好判断
问:
它们生命周期相同吗?
它们不变量相同吗?
它们会因为同一个原因变化吗?
抽象后调用方是否知道更少?
购买、订阅、企业分配可以共同产生访问权,所以抽象 CourseAccessGrant,不是抽象万能关系。
Atlas Action
找一个抽象类型,列出它的所有 ? 可选字段。可选字段越多,越可能混入了多个概念。
小结
抽象的目标不是更通用,而是刚好表达稳定边界。