首页/开发/系统分析与架构设计速查/规约模式(Specification)
架构风格与模式58 条

规约模式(Specification)

把业务规则封装为可命名、可组合(与/或/非)的规约对象,既可用于校验,也可用于构造查询条件,让规则复用且保持业务语义。

组合示意

组合示意
spec = 已支付.and(金额超过(1000)).and(非(已退款))
if spec.is_satisfied_by(order):  ...
适用规则需要在多处复用、需要组合或需要翻译成查询
注意复杂规则组合要关注可读性与索引友好性

查询翻译注意点

查询翻译注意点
内存校验与数据库查询两条路径要共用同一规约定义:
spec = 已支付.and(金额超过(1000))

- ORM 侧:把规约翻译成 WHERE 条件(索引友好)
- 内存侧:同一规约用于单元测试与快速校验
两者输出必须一致,用对照测试锁定差异

易错点

  • 规约嵌套过深,规则无法阅读与调试
  • 内存校验与数据库查询两套实现不一致

数据来源与参考

  • Eric Evans《Domain-Driven Design》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌