相关顺序验证的设计模式

1 validation refactoring design-patterns coding-style function

我有三个验证器,每个验证器依次依赖于前一个验证器。我可能会使用全部三个或仅使用前两个或仅使用第一个。例如

  1. 验证器1:检查用户是否存在
  2. 验证器2:检查请求的订单是否存在于用户的订单历史记录中
  3. 验证器 3:检查该订单是否有取消选项

如果不满足前面的条件,此列表中的每个验证器都会抛出错误。我目前正在使用这种模式:

function validator1() { ... }

function validator2() { validator1(); ... }

function validator3() { validator2(); ... }
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉像是一种反模式,因为所有先决条件验证都是隐式完成的,因此当我运行 validtor2() 时,不清楚 validator1() 也在运行。

我也考虑过这样做:

function validator1() { ... }

function validator2() { ... }

function validator3() { ... }

function someTask() { validator1(); validator2(); validator3(); ... }
Run Code Online (Sandbox Code Playgroud)

但这是不安全的,因为没有什么可以阻止我运行 validator3() 并在不满足条件 2 时抛出错误。

有没有一种既安全又明确的方法来做到这一点?

编辑

这是接受答案中提到的设计模式的一个很好的参考:https ://refactoring.guru/design-patterns/chain-of-responsibility

afh*_*afh 5

我建议研究专门用于验证的责任链构建器模式。看这里:

您还可以研究装饰器模式的用法:

有没有一种既安全又明确的方法来做到这一点?

但是,在考虑其中一种当然可能提供更大灵活性但也更复杂的模式之前,请考虑您的规则是否真的会得到很大扩展并会被重用以及许多情况。否则,立即采用建议的模式之一可能有点过度工程。

此外,您可以通过使用有意义的函数名称来明确地告诉代码的读者正在执行什么特定的用例。这样的函数更像是所需验证步骤的协调器。因此,您的方法(尽管名称不太好someTask())可能已经满足您的需求。

但这是不安全的,因为没有什么可以阻止我运行 validator3() 并在不满足条件 2 时抛出错误。

您可以让每个验证异常抛出一个异常,或者引入保护子句,如果其中一个验证失败,则返回主要任务。

另一种选择是传入或注册具有相同接口的验证列表并循环它们。如果您需要检查所有验证并收集每个验证步骤的结果(例如错误代码或消息),或者在第一次验证时抛出异常,则可以满足您的需要。