规格是什么意思?上周咱们聊了下关于设计模式和生命周期的相关规范和原则,但是并没有讲完。
在领域驱动设计中,还有一个非常重要的点,那就是规格(Specification)这个术语。
笔者本人不是很喜欢这个词,更喜欢用业务约束来描述它。顾名思义,它是用来规范或者检验实体对象是否是符合业务定义的这样一个定义标准。实体对象是否具备业务意义,在开发过程中是很容易被忽略,但又是极为关键的,因为如果一个实体对象不具备业务含义,本质上是无效的,不应该在系统中存在的。它的存在,只会对整个系统造成混乱和灾难。
在这里就具体项目实现中,一些具体的使用方法上展开说明下。
首先,是实体对象的新建。我们往往在代码中创建对象是非常随意的,直接拿系统默认值New一个对象出来,然后再通过赋值来确保它包含具体的业务数据。这样子的做法,很不推荐。好的做法是根据业务对象本身的业务复杂性来选择使用构造函数、或Factory模式、或Builder模式并完全按照规格来创建一个合法的实体对象。确保业务对象从存在的那一刻起,就是有效的。
其次,是实体对象的还原。更具体的,是从持久化(数据流、文件或数据库)中来复原。
要确保用来复原的数据本身包含的就是合法有效业务内容。换个角度来说,你不应该在持久化中包含不完整的、无效的业务数据。为什么呢,因为如果持久化中一旦包含了非法数据,那么一旦发生问题的时候要定位就很困难了。
再次,是实体对象的校验。应该确保实体对象的每一次状态变更都是合法的。都应该有完整的数据校验,确保业务数据符合规格(业务约束)。
最后,是在查询或者过滤的条件中,应确保采用了合理的规格。这点上,举个例子,比如,在创建订单的过程中,我们会查询商品内容,在这里的商品查询规格具体展开应该是处于有效售卖周期内、并是上架状态的商品。当然还会有更多其他的约束,这个就不展开了。
可以看到,规格其实是贯穿了各个方面。而且很多规格的定义并不是那么明显,在设计过程很容易被忽略。所以我们必须在设计的时候不断挖掘这些隐性的概念并使之显性化及明确定义。而规格设计围绕的核心就是实体的业务有效性。