Skip to content

Latest commit

 

History

History
24 lines (16 loc) · 2.33 KB

File metadata and controls

24 lines (16 loc) · 2.33 KB

'Make invalid states unrepresentable' considered harmful

TL;DR

本文批判了“使无效状态无法表示”的过度应用,指出过度约束会限制系统灵活性。主张状态机、外键和协议缓冲区设计应保留一定弹性,允许处理异常与变更,以平衡严谨性与业务适应能力。

Summary

本文探讨了“使无效状态无法表示”这一流行软件设计原则的局限性,并主张代码应比领域模型更灵活。作者认为,过度强制约束虽然有助于逻辑清晰,但会降低系统应对现实需求变化的适应能力,因此软件应允许表示某些无效状态,以保持必要的灵活性。

核心论点包括:

  1. 状态机设计应允许任意状态转换:严格定义状态转换规则虽能简化系统逻辑,但无法覆盖所有边缘情况(如特殊审批流程)。通过允许部分任意转换,可在保持核心设计简洁的同时处理异常需求,避免因频繁重构导致系统复杂化。

  2. 外键约束可能限制灵活性:外键约束虽能确保数据一致性,但会带来操作瓶颈(如级联删除的性能问题)和架构变更困难(如分库分表时的数据迁移挑战)。许多大型企业选择在应用层处理数据一致性,以换取更高的系统可扩展性和修改自由度。

  3. 协议缓冲区中必填字段的弊端:必填字段虽能强化数据验证,但在多消费者系统中,变更模式需严格按顺序升级服务(先生产者后消费者),否则易引发生产故障。将字段设为可选可支持无序升级,尽管需在应用层处理数据缺失,但降低了协同复杂性和故障风险。

作者最后强调:

  • 约束的“硬度”(不可逆性)越高,风险越大。软约束(如代码验证)比硬约束(如数据库Schema)更易调整。
  • 领域模型仅是现实过程的抽象,而非真实本身。面向用户的软件常需突破模型约束以满足实际业务需求。
  • 约束并非完全无用,但需平衡严谨性与灵活性。系统应允许部分无效状态存在,以支持业务演进。

文中还引用数据库设计、协议缓冲区案例及Fred Brooks的观点,说明数据层和序列化格式同样是领域模型表达的关键部分。