【问题标题】:What is the difference between Invariants and Validation Rules?不变量和验证规则有什么区别?
【发布时间】:2015-07-23 07:02:28
【问题描述】:

我经常在 DDD 中看到术语不变量Here Dino Esposito 谈论它。如果我查看 .NET 库,我会看到一个 ValidationAttribute 类。 不变量验证规则是否相同?例如,我可以说 50% 的折扣只有在订单总额超过 250 美元时才可用 是一个不变量?

或者它们是不同的,不变量是为了保护对象不变得无效,而验证是检查对象的有效性,即使它已经改变了它的状态(它可以处于有效或无效状态)?在上面的例子中,如果我使用不变量,我会在更新折扣之前检查不变量,在验证的情况下,我会应用 50% 的折扣,然后检查有效性(对象已经处于无效状态)。

【问题讨论】:

    标签: validation domain-driven-design invariants


    【解决方案1】:

    当然,验证是批准给定对象状态的过程,而不变的强制执行发生在甚至达到该状态之前。

    一个推论是,不变的执行最好由正在变异(或创建)的事物本身执行,例如自我保护反射,而验证通常由第三方完成。

    Always valid 学派主张使用不变量而不是验证。我认为它与 DDD 和 Aggregates 完美搭配。

    【讨论】:

    • 然而,有些人不会将一些基本的验证规则视为域不变量,因为它们通常是源自技术约束的规则。例如,电子邮件地址的最大长度不能被一些 DDD 从业者视为业务不变性,因为业务不关心电子邮件的长度,但为了实用,必须设置技术约束(例如使用varchar(500) 在 DB 中,因为您不能对每个字段都使用 varchar(max),否则每个 DB 的最大行大小会溢出)。
    • 因此,有人可能会争辩说email.length <= 500 不是一个不变量,并可能决定将检查委托给数据库。但是,大多数数据库甚至不会告诉哪个列溢出,这可能是在域内执行规则的一个论据。
    • 既然“不变量”和“验证”之间的区别很明显,“不变量”也可以称为“规范”吗?我正在考虑更多地针对“不变量”测试域对象。
    • @wonderfulworld 我更喜欢“业务规则”作为名称。归根结底,就是保持对象处于有效状态。验证通常处理可以成为业务规则一部分的数据格式。作为一个经验法则:您使用验证来确保输入数据的格式有效,然后业务规则决定输入如何/是否更改模型。
    • 我经常看到的是,欧洲的建筑师在他们的作品中使用“不变量”这个词,而美国的建筑师在他们的著作中使用“商业规则”这个词。目的似乎不是让实体处于无效状态。
    【解决方案2】:

    是的,我想是的

    在 DDD 中,验证规则可以被认为是不变量。主要的 聚合的责任是在整个状态中强制执行不变量 该聚合中所有实体的更改。

    您可以在此page 中参考更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 2013-08-11
      • 2014-08-16
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多