0

我最近一直在阅读规范,我非常热衷于使用它们。但是,我害怕做得过火。

例如,如果我有一个带有电话号码属性的 User 实体,我是否需要将电话号码规范测试放在 setter 中,或者 setter 中的验证逻辑是否足够?

谢谢,菲尔

更新: 更多上下文:我想我希望验证在域中,而不是在演示文稿中。我将在演示文稿中实现验证,但这更像是一个 UI 功能。这个想法(我相信)是域不能处于无效状态,也不能依赖于演示文稿。我实际上有一个电话号码实体,并且许多实体都有电话号码,虽然我认为这可能是价值对象,但这是另一个争论:)

我只是想知道在属性设置器中使用规范是否过分。我可以看到的一个优点是规范可以在层之间共享,即表示层,以便您可以共享验证代码。

如您所见,我不确定这是否是正确的方法。

非常感谢,菲尔

4

1 回答 1

0

您可能会研究前置条件和后置条件(不变量或合同设计)的概念。前提条件是您的功能正确运行所必须满足的条件。后置条件是当您的功能完成并正常退出时为真的事情。

“用户的电话号码有效”可能是您的 setter 功能的一个很好的发布条件。但是,您有 2 个前置条件选择:(1) 使其成为 setter 函数的前置条件,即传递给它的任何内容都是有效的,或者 (2) 对 setter 函数制定更宽松的前置条件并执行错误检查在你的 setter 函数中。选项 (1) 实质上将验证责任转嫁给了客户端。选项 (2) 赋予您的用户实体处理错误的责任。

我认为您选择的设计将取决于您的特定应用程序的大局。

以下是一些不变量和合同设计的链接: http://svengrand.blogspot.com/2008/11/preconditions-postconditions-invariants.html http://en.wikibooks.org/wiki/Computer_Programming/Design_by_Contract

于 2012-06-28T00:55:18.130 回答