在契约设计中提出契约(合约)Contact和DDD中的聚合体同一个高度,不同点是前者侧重行为之间的关系,而聚合体是一种结构关系,我以前也曾经认为事件是一种行为关系,涉及到两个以上对象的行为是一种协调关系,可以用事件表达,而这种协调关系也是一种合约Contact,那么是否可以认为事件是合约的另外一种俗称呢
事件:客户提款(异步命令)
事件处理前:判断是否有足够的余额(同步命令)
事件处理: 扣款(同步命令)
事件处理后:发短信提醒客户。(异步命令)
让我联想起契约设计Design by contact,又与BDD行为驱动开发中的Given-When-Then模板类似,发这篇文章试图探究一下它们之间是否有必然的关系?
我曾经在契约设计中提出契约(合约)Contact和DDD中的聚合体同一个高度,不同点是前者侧重行为之间的关系,而聚合体是一种结构关系,我以前也曾经认为事件是一种行为关系,涉及到两个以上对象的行为是一种协调关系,可以用事件表达,而这种协调关系也是一种合约Contact,那么是否可以认为事件是合约的另外一种俗称呢?
在契约设计中,分为三种:前置条件, 后置条件和不变性。
前置条件是表达合约(事件)发生的前提条件,比如扣款这个事件或合约发生的前提是必须有足够的余额,那么前置条件是:是否有足够余额。
后置条件表达合约(事件)发生后的情况,比如扣款事件后,通知客户。
不变性是表示在事件发生后的一种状态,我们可以用值对象来表达状态的这种不变性。
当我们使用@gameboyLV 的嵌套事件用语来表达时,发现几乎是一致,而且比较通俗易懂:
事件后的状态:聚合体内对象发生了改变,并且自此以后一直不变。
对于契约设计Design by contact表达还有使用义务和权利这样表达方式,这种表达方式更符合类似现实世界中合同的表达方式,甲乙双方签订合同,合同中规定甲乙双方的义务付出以及得到的利益分配。
其实这种义务付出是一种前置条件,得到的利益或权利是一种后置条件。
再看看契约细化定义:
1.一个契约负责管理多个实体之间的交互
2.一个契约包含权力(可以做什么)和义务(必须先做什么)
3.一个契约会辨识到在一个场景下实体之间交互的结果状态
我们如果转化为事件用语,可能会更明白简单:
1.一个事件代表多个实体之间的交互。
2.一个事件包括事件发生前后两个阶段。
3.一个事件发生后会改变实体状态。,事件:客户提款(异步命令)
3.一个事件发生后会改变实体状态。