This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -551,7 +551,7 @@ function hide_canvas() {
</ul>
<p>考虑在线试题领域中问题与答案的关系。Question 若缺少 Answer 就无法保证领域概念的完整性,调用者也不会绕开 Question 单独查看 Answer因为 Answer 离开 Question 是没有任何意义的。因此Question 与 Answer 属于同一个聚合,且以 Question 实体为聚合根。</p>
<p>同样是问题与答案之间的关系如果为知乎问答平台设计领域模型情况就发生了变化。虽然从领域概念的完整性看Question 与 Answer 依然属于强相关的关系Answer 依附于 Question没有 Question 的 Answer 也没有任何意义,但由于业务场景允许阅读 Answer 的读者可以单独针对它进行赞赏、赞同、评论、分享、收藏等操作,如下图所示:</p>
<p><img src="assets/becd14e0-ccbc-11e9-9f23-07a3e2a236db" alt="62821636.png" /></p>
<p><img src="assets/becd14e0-ccbc-11e9-9f23-07a3e2a236db" alt="png" /></p>
<p>这些操作就等同于为 Answer 赋予了“完全民事行为能力”,具备了独立性,就可以脱离 Question 聚合成为单独的 Answer 聚合。</p>
<p>与实体相反,领域设计模型中值对象不存在这种独立性。根据聚合的定义,最小的聚合必须至少要有一个实体,这就意味着值对象不能单独成为一个聚合。值对象必须寻找一个聚合,作为它要依存的主体。个别值对象如 Money 等与单位、度量有关的类甚至会在多个聚合中重复出现。</p>
<h4>不变量</h4>
@@ -561,7 +561,7 @@ function hide_canvas() {
</code></pre>
<p>该不变量决定了 LineItem 与 PurchaseOrder 必须放在一个聚合中,因为只有将它们控制在聚合边界内,才能够有效满足该不变量。</p>
<p>要完全理解何为“不变量”虽有这三大特征作为辨别的依据仍非易事。为了让不变量帮助我们确定聚合的边界可以放宽定义将其视为“施加在聚合边界内部各个对象之上的业务约束”。例如业务约束规定一篇博文Post必须至少有一个博文类别Post Category就可以当做是一个不变量。要满足这个不变量就需要将 Post 与 PostCategory 放到同一个聚合中:</p>
<p><img src="assets/ee896350-ccbc-11e9-8d89-4fa271cb1633" alt="77139148.png" /></p>
<p><img src="assets/ee896350-ccbc-11e9-8d89-4fa271cb1633" alt="png" /></p>
<p>在设计聚合时,可以结合领域逻辑去寻找具有不变量特征的业务约束。通常,此类约束表现为用例的前置条件与后置条件,或者用户故事的验收标准。即使不是为了设计聚合,业务分析人员也应当给出业务约束的描述。例如,在航班计划业务场景中,编写“修改航班计划起飞时间与计划到达时间”这一用户故事时,就需要给出验收标准,如:</p>
<ul>
<li>若该航班有共享航班,在修改航班计划起飞时间与计划到达时间时,关联的所有共享航班的计划起飞时间与计划到达时间也要随之修改,以保持与主航班的一致。</li>