知识卡片
本质属性与偶然属性的分离,及分离必须遵守的两个前提
内容
实体或对象的属性可以分成两类:本质属性——一旦创建就无法更改或删除、是不可或缺的(比如人类这个实体的意识、体验、智慧);偶然属性——会随时间变化、但不影响实体本质的特征(比如人的年龄和身高)。把本质属性和偶然属性分离出来,能帮助更好地建立数据模型、降低复杂度——因为混在一起时,一处关于”偶然属性会变化”的假设很容易被错误地套用到本质属性上,反之亦然。所有前面提到的各类分离(业务技术分离、核心非核心分离、变化不变化分离、操作类型/角色/切面分离等)都有一个共同的隐含前提:分离的双方必须处于同一个层级或同一个维度上——如果两者本就处于不同的层次或维度,分离这个动作本身就没有意义(比如进程只能和进程分离,进程和线程分离没有意义,因为二者根本不是同一维度的概念)。落地到具体代码实现时,分离性有两种实践方式:逻辑上的分离——分离的双方仍处于同一个运行实体内,这种分离通常是必需且重要的,能解耦模块、降低复杂度、提高可读性可扩展性可维护性;物理上的分离——两者在运行时完全分开(比如拆成独立的服务或进程),是否要做到这一步需要根据实际情况权衡决策,不是分离性天然就要求的终点。可迁移启发:判断一次”分离”提案是不是言之有物,先检查它划分的两边是不是真的处在同一维度——如果连”分离的是什么和什么”这个问题都答不清楚二者是否同层级,这次分离提案本身可能就没有找对讨论的对象;再判断是否值得做到物理分离这一步,物理分离的额外成本(网络、部署复杂度)必须用需求、周期、非功能性需求这些真实约束来验证,而不是”更彻底就更好”。
参考来源
- 位置:《架构师启示录:知识模型、落地方法与思维模式》第8章《系统实现》之"8.1.2 代码中的分离性"第8、9条与"8.1.3 分离性的落地实践"(源文件:_epub-src/EPUB/xhtml/chapter12.xhtml)
- 结论依据:原文说明"将本质属性和偶然属性分离,我们能够更好地建立数据模型,降低复杂度……在上述分离场景中,分离的双方一定处于同一个层级或者维度上。如果两者处于不同的层次或维度,分离就没有意义……逻辑上的分离通常是必需且重要的……至于是否进行物理上的分离,则需要根据具体情况进行权衡与决策", 直接支撑本卡关于本质偶然属性分离及分离前提/落地实践的结论。
- 原始内容:进程只能和进程分离,进程和线程分离就没有意义。