检查 public 方法中参数的先决条件

Checking preconditions on parameters in public methods

我想问一下您对设计问题的看法。

问题基本上如下:对象的 public 方法应始终检查其输入参数中的先决条件,还是对调用者负责和 "trust the flow" 更好?

我不是在谈论明显的先决条件,例如检查 null 以避免空引用异常,而是指方法参数中的业务先决条件。这种典型情况发生在对输入参数执行某种验证的 DDD 服务中,return 一个对象包含有关该验证的反馈。

举个例子,考虑一个 class CheckPerson 有一个 public 方法 PerformCheck 和一个 Person 类型的参数。想象一下,有一条业务规则说此检查对金发女郎没有意义。

我认为这个检查很重要,方法名称应该反映这个规则(类似于 PerformCheckForNonBlondePerson)。

我应该添加这些检查,还是应该信任来电者?

是的,你应该!

您需要区分输入验证先决条件。正如您所描述的,业务规则可以应用于两者。

输入验证发生在系统边界。您预计在某些情况下输入验证会失败。发生这种情况时,您应该通过有用的错误描述向客户指出错误。

另一方面,

先决条件 是系统某处方法(或整个组件)契约的一部分。您总是 想要确保此合同得到遵守,否则您的实施可能会出现错误。在这里,我们使用 guards 来强制执行前提条件。守卫应该总是通过。如果不是,则始终是程序员错误(而不是用户错误)。

@theDmi 感谢分享您的观点。
我完全同意你的立场。

我目前工作的环境是一个三人团队,实现一个大型应用程序,其中需要考虑大量业务逻辑和域规则。
我不同意“信任流程并将责任委托给调用者”理念的主要原因是,这迫使每个将要调用域服务的开发人员明确阅读此类服务的代码,并充分了解该代码背后的业务需求。
在我看来,这是不现实的,而且这是一个容易出错的过程。

大型应用程序中的域层被我们将要编写的每个应用程序逻辑调用,并且将所有责任留给调用者在我看来太危险了。我们目前不使用任何类型的库来强制执行先决条件检查,但我知道有几种选择:)