需求分析与建模61 条

业务规则与决策表

业务规则是“在什么条件做什么决定”的约束,散落在代码里会难以变更;用决策表或决策树把条件与动作显式列出来,便于与业务逐格确认。

业务规则与决策表是什么

业务规则是「在什么条件下做什么决定」的约束,例如折扣计算、审批门槛、风控拦截阈值。规则散落在多个服务的条件分支里时,同一策略的修改要改多处,且边界情况由各实现者自行解读。决策表把条件组合与对应动作逐格列出来,条件之间用任意值、区间与优先级表达,业务与研发可以按行逐条核对,也能直接转成测试用例。

基本信息

表达形式决策表(条件列 + 动作列)、决策树、规则脚本
关键约定条件优先级、冲突处理、空值与缺失字段的判定
评审方式业务与研发逐行确认,每行都能生成一条测试用例
落地位置集中于规则模块或规则引擎,避免散落在各服务的条件分支
变更要求规则版本化并留变更记录,生效时间点可追溯

典型使用场景

  • 定价与折扣:按客户等级、订单金额、活动窗口组合定价
  • 审批流:按金额与风险等级决定审批层级与是否需要复核
  • 风控拦截:命中规则组合时拦截、放行或转人工核查
  • 补贴与积分:多条件叠加发放,需明确条件叠加与互斥关系
  • 合规校验:不同地区的资质要求差异写成可核对的条件表
  • 规则迁移:把历史系统里的条件分支整理成表,作为重构依据

决策表示例(折扣规则)

客户等级订单金额是否大促动作
VIP任意任意折扣 9 折
普通满 1000是折扣 95 折
普通满 1000否无折扣
普通不足 1000任意无折扣
任一(异常)金额缺失任意拒绝并提示补齐信息

规则落地示意

规则落地示意
# 决策表逐行转成可测试的判断,顺序即优先级
# 行 1
if level == 'VIP': return rate(0.90)
# 行 2
if level == 'NORMAL' and amount >= 1000 and promo: return rate(0.95)
# 行 5  前置:金额缺失视为数据异常,必须显式处理而非落默认分支
if amount is None: raise InvalidOrder('missing amount')
# 默认分支:不匹配任何规则时的行为要写明并记录日志
return rate(1.00)
决策表必须显式规定条件组合的优先级与冲突处理,否则实现者各自解读边界情况,同一订单在不同入口可能得到不同折扣。
规则引擎适合条件组合多、变更频繁且需要业务可读的场景;规则数量少且稳定时,直接的判断逻辑更易调试与测试,不要为规则引擎而规则引擎。

易错点

  • 规则散落在多个服务的条件分支中:同一策略修改要改多处,漏改造成口径不一致
  • 条件组合没有优先级约定:重叠规则同时命中时结果依赖代码顺序,行为不可预测
  • 空值与字段缺失走默认分支:本该拒绝的请求被当作正常单处理
  • 规则变更不留版本与生效时间:事后对账无法解释某个时间点的计算依据
  • 用规则引擎承载全部业务逻辑:调试与测试成本上升,简单判断被过度工程化

数据来源与参考

  • OMG DMN 决策模型与符号规范
  • 《软件架构:架构模式、特征及实践指南》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌