核心问题

抽象应该停在哪里?

工程困境

PurchaseEnrollmentCourseAssignment 都和课程有关,于是有人抽:

type CourseRelation = { type: string; metadata: Record<string, unknown> }

结果所有规则都藏进 typemetadata

思想模型

抽象应该覆盖稳定重复的变化轴,而不是覆盖表面相似。

好判断

问:

它们生命周期相同吗?
它们不变量相同吗?
它们会因为同一个原因变化吗?
抽象后调用方是否知道更少?

购买、订阅、企业分配可以共同产生访问权,所以抽象 CourseAccessGrant,不是抽象万能关系。

Atlas Action

找一个抽象类型,列出它的所有 ? 可选字段。可选字段越多,越可能混入了多个概念。

小结

抽象的目标不是更通用,而是刚好表达稳定边界。