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

@@ -532,7 +532,7 @@ function hide_canvas() {
<p>wǒ yǒu kuài dì</p>
</blockquote>
<p>到底是什么意思?</p>
<p><img src="assets/a1df9f10-9e41-11e8-a532-c96c5ba7ae58" alt="enter image description here" /></p>
<p><img src="assets/a1df9f10-9e41-11e8-a532-c96c5ba7ae58" alt="png" /></p>
<p>我们能确定到底是哪个意思吗?<strong>确定不了!!!</strong> 我们必须结合说话人的语气与语境来理解,例如:</p>
<ul>
<li>wǒ yǒu kuài dìzǔ shàng liú xià lái de → 我有块地,祖上留下来的。</li>
@@ -543,7 +543,7 @@ function hide_canvas() {
<p>假设有这样一个业务场景我作为一名咨询师从成都出发前往深圳为客户做领域驱动咨询无论是从家乘坐地铁到达成都双流机场还是乘坐飞机到达深圳宝安再从宝安机场乘坐出租车到达酒店我的身份都是一名乘客Passenger虽然因为交通工具的不同参与的活动也不尽相同但无论上车、下车还是办理登机手续、安检、登机和下机等活动终归都与交通出行有关。那么我坐在交通工具上就一定代表我属于这个上下文吗未必注意在交通出行上下文中其实模糊了“我”这个概念强调了“乘客”这个概念这是参与到该上下文的角色Role或者说“身份”。</p>
<p>例如我在飞机上忽然想起给客户提供的咨询方案还需要完善于是我拿出电脑在一万米高空上继续思考我的领域驱动设计方案这时的我虽然还在飞机上身份却切换成了一名咨询师Consultant。当我作为乘客乘坐出租车前往酒店并到前台办理入住手续时我又“撕下了乘客的面具”摇身一变成为了酒店的宾客Guest。次日早晨我在酒店餐厅用完早餐后离开酒店前往客户公司。随着我走出酒店这个活动的发生酒店上下文又切换回交通出行。当我到达客户所在地时面对客户我开始以一名咨询师身份与客户团队交谈了解他们的咨询目标与现有痛点。我制定咨询计划与方案并与客户一起评审咨询方案这时的上下文就切换为咨询工作了。巧合的是无论是交通出行还是酒店都需要支付费用支付的费用虽然不同支付的行为也有所差别需要用到的领域知识却是相同的因此这个活动又可以归为支付上下文。</p>
<p>上下文在流程中的切换犹如电影画面的场景切换,相同的人物扮演了不同的角色,在不同的上下文参与了不同的活动。由于活动的目标发生了改变,履行的职责亦有所不同,上述场景如下图所示:</p>
<p><img src="assets/b30fa550-9e41-11e8-87cc-5b643420a0df" alt="enter image description here" /></p>
<p><img src="assets/b30fa550-9e41-11e8-87cc-5b643420a0df" alt="png" /></p>
<p>整个业务流程由诸多活动Actions组成参与这些活动的有不同的角色。在每一个上下文中角色与角色之间通过活动产生协作以满足业务流程的需求。这些活动是分散的活动的目标也不相同<strong>在同一个上下文中,这些活动却是为同一个目标提供服务</strong></p>
<p>因此,在理解限界上下文时,我们需要重视几个关键点:</p>
<ul>
@@ -586,7 +586,7 @@ function hide_canvas() {
<li>彻底悟透:模块、服务或组件仍然是限界上下文。</li>
</ul>
<p>能理解吗?——更糊涂了!好吧,以上三重境界纯属忽悠,还是让我上一点干货吧。注意了,我要提到一个重要的概念,就是“自治”,抛开模块、服务或组件对你的影响,请大家先把限界上下文看做是一个“自治”的单元。所谓“自治”就是满足四个特征:最小完备、稳定空间、自我履行、独立进化。如下图所示的自治单元就是限界上下文,映射到编码实现,则<strong>可能</strong>是模块、组件或服务:</p>
<p><img src="assets/c6f4b970-9e41-11e8-87cc-5b643420a0df" alt="enter image description here" /></p>
<p><img src="assets/c6f4b970-9e41-11e8-87cc-5b643420a0df" alt="png" /></p>
<p><strong>最小完备</strong>是实现“自治”的基本条件。所谓“完备”,是指自治单元履行的职责是完整的,无需针对自己的信息去求助别的自治单元,这就避免了不必要的依赖关系。而“最小完备”则进一步地限制了完备的范围,避免将不必要的职责被错误地添加到该自治单元上。对于限界上下文而言,就是要根据业务价值的完整性进行设计。例如,对于支付上下文,其业务价值就是“安全地完成在线支付业务”,那么在确定限界上下文的时候,就应该以完成该业务价值的最小功能集为设计边界。</p>
<p><strong>自我履行</strong>意味着由自治单元自身决定要做什么。从拟人的角度来思考,就是这些自治单元能够对外部请求做出符合自身利益的明智判断,是否应该履行该职责,由限界上下文拥有的信息来决定。例如,可以站在自治单元的角度去思考:“如果我拥有了这些信息,我究竟应该履行哪些职责?”这些职责属于当前上下文的活动范围,一旦超出,就该毫不犹豫地将不属于该范围的请求转交给别的上下文。例如,在当订单上下文履行了验证订单的职责之后,需要执行支付活动时,由于与支付相关的业务行为要操作的信息已经超出了订单上下文的范畴,就应该将该职责转移到支付上下文。自我履行其实意味着对知识的掌握,为避免风险,你要履行的职责一定是你掌握的知识范畴之内。</p>
<p><strong>稳定空间</strong>指的是减少外界变化对限界上下文内部的影响。自治的设计就是要划定分属自己的稳定空间,让自治单元拥有空间内的掌控权,保持空间的私密性,开放空间接口应对外部的请求。划分自治空间,需要找到限界上下文之间的间隙处,然后依势而为,沿着间隙方向顺势划分,而所谓“间隙”,其实就是依赖最为薄弱之处。例如,在电商系统中,管理商品上架、下架与评价商品都与商品直接相关,但显然评价商品与商品的依赖关系更弱。倘若需要分解限界上下文,保证上下文的稳定性,就可以将评价商品的职责从商品上下文中分离出去,但却不能分离商品上架和下架功能。稳定空间符合<strong>开放封闭原则OCP</strong>,即对修改是封闭的,对扩展是开放的,该原则其实体现了一个单元的封闭空间与开放空间。封闭空间体现为对细节的封装与隐藏,开放空间体现为对共性特征的抽象与统一,二者共同确保了整个空间的稳定。</p>