《领域驱动设计:软件核心复杂性应对之道(修订版)》—第1章 1.4节知识丰富的设计-阿里云开发者社区

开发者社区> 异步社区> 正文

《领域驱动设计:软件核心复杂性应对之道(修订版)》—第1章 1.4节知识丰富的设计

简介: 通过像PCB示例这样的模型获得的知识远远不只是“发现名词”。业务活动和规则如同所涉及的实体一样,都是领域的核心,任何领域都有各种类别的概念。
+关注继续查看

本节书摘来自异步社区《领域驱动设计:软件核心复杂性应对之道(修订版)》一书中的第1章,第1.4节知识丰富的设计,作者【美】埃里克•埃文斯(Eric Evans), 马利伟 , 万龙,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4 知识丰富的设计
通过像PCB示例这样的模型获得的知识远远不只是“发现名词”。业务活动和规则如同所涉及的实体一样,都是领域的核心,任何领域都有各种类别的概念。知识消化所产生的模型能够反映出对知识的深层理解。在模型发生改变的同时,开发人员对实现进行重构,以便反映出模型的变化,这样,新知识就被合并到应用程序中了。

当我们的建模不再局限于寻找实体和值对象时,我们才能充分吸取知识,因为业务规则之间可能会存在不一致。领域专家在反复研究所有规则、解决规则之间的矛盾以及以常识来弥补规则的不足等一系列工作中,往往不会意识到他们的思考过程有多么复杂。软件是无法完成这一工作的。正是通过与软件专家紧密协作来消化知识的过程才使得规则得以澄清和充实,并消除规则之间的矛盾以及删除一些无用规则。

示例 提取一个隐藏的概念

我们从一个非常简单的领域模型开始学习,基于此模型的应用程序用来预订一艘船在一次航程中要运载的货物,如图1-8所示。


e61a466b4f05bb6a854056bc12479d13337a4c0c

我们规定这个应用程序的任务是将每件货物(Cargo)与一次航程(Voyage)关联起来,记录并跟踪这种关系。现在看来一切都还算简单。应用程序代码中可能会有一个像下面这样的方法:
public int makeBooking(Cargo cargo, Voyage voyage) {
   int confirmation = orderConfirmationSequence.next(); 
   voyage.addCargo(cargo, confirmation);
   return confirmation;
}

由于总会有人在最后一刻取消订单,因此航运业的一般做法是接受比其运载能力多一些的货物。这称为“超订”。有时使用一个简单的容量百分比来表示,如预订110%的载货量。有时则采用复杂的规则——主要客户或特定种类的货物优先。

17
这是航运领域的一个基本策略,从事航运业的业务人员都知道它,但在软件团队中可能不是所有技术人员都知道这条规则。

需求文档中包含下面这句话:

允许10%的超订。

现在,类图就应该像图1-9这样,代码如下:

public int makeBooking(Cargo cargo, Voyage voyage) {
   double maxBooking = voyage.capacity() * 1.1;
   if ((voyage.bookedCargoSize() + cargo.size()) > maxBooking) 
       return –1;
   int confirmation = orderConfirmationSequence.next(); 
   voyage.addCargo(cargo, confirmation);
   return confirmation;
}


f2a73ee1eaa620f5141e1300ab07bbe9ff0d9104

现在,一条重要的业务规则被隐藏在上面这段方法代码的一个卫语句②中。第4章将介绍Layered Architecture,它会帮助我们将超订规则转移到领域对象中,但现在我们主要考虑如何把这条规则更清楚地表达出来,并让项目中的每个人都能了解到它。这将使我们得到一个类似的解决方案。

(1) 如果业务规则如上述代码所写,不可能有业务专家会通过阅读这段代码来检验规则,即使在开发人员的帮助下也无法完成。

(2) 非业务的技术人员很难将需求文本与代码联系起来。

如果规则更复杂,情况将更糟。

我们可以改变一下设计来更好地捕获这个知识。超订规则是一个策略,如图1-10所示。策略(policy)其实是Strategy模式③[Gamma et al. 1995]的别名。我们知道,使用Strategy的动机一般是为了替换不同的规则,虽然在这里并不需要这么做。但我们要获取的概念的确符合策略的含义,这在领域驱动设计中是同等重要的动机(参见第12章)。


4cd5d1e6b106fa3e3ab7540cdd5cb01f527b771d

修改后的代码如下:
public int makeBooking(Cargo cargo, Voyage voyage) {
   if (!overbookingpolicy.isallowed(cargo, voyage)) return –1;
   int confirmation = orderConfirmationSequence.next(); 
   voyage.addCargo(cargo, confirmation);
   return confirmation;
}

新的Overbooking Policy类包含以下方法:

public boolean isAllowed(Cargo cargo, Voyage voyage) {
   return (cargo.size() + voyage.bookedCargoSize()) <= 
         (voyage.capacity() * 1.1);
}

现在所有人都清楚超订是一个独特的策略,而且超订规则的实现即明确又独立。

现在,我并不建议将这样的精细设计应用到领域的每个细节中。第15章将深入阐述如何关注重点以及如何隔离其他问题或使这些问题最小化。这个例子的目的是说明领域模型和相应的设计可用来保护和共享知识。更明确的设计具有以下优点:

19
(1) 为了实现更明确的设计,程序员和其他各位相关人员都必须理解超订的本质,明白它是一个明确且重要的业务规则,而不只是一个不起眼的计算。

(2) 程序员可以向业务专家展示技术工件,甚至是代码,但应该是领域专家(在程序员指导下)可以理解的,以便形成反馈闭环。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
关于USB驱动的软件测试方法
在工作中难免会使用一些外部设备挂载到平台进行测试,比如U盘,那么判断一个U盘是否能正常读写的方法如下: 1、在U盘中放入一个二进制文件(xxx.bin) 2、通过U盘在软件上读取该二进制文件,并计算其checksum值 3、通过checksum值的正确与否即可判断U盘读写是否好坏 核心算法...
778 0
智芯一号USB转串口驱动及下载软件安装
一、USB转串口驱动安装     切记,安装时不要将USB线跟开发板连接。会引起安装不成功,而卸载又难以干净!     二、下载软件的安装 下载软件为一个绿色软件,不用安装!     ...
565 0
8月14日云栖精选夜读:驱动行业未来20年发展 阿里巴巴AIR视频解说进入倒计时
2017年,阿里巴巴首次发布全球创新研究计划Alibaba Innovative Research,简称AIR。AIR计划旨在让全世界的科技人才在追逐世界的同时,用科技创造新的未来! 为了让更多参与者深入理解AIR(Alibaba Innovative Research)的研究课题,阿里巴巴近日宣布将在8月15日-16日围绕此前发布的课题进行AIR open day主题视频解说, 二十多位科研课题负责人将在视频中深度解析课题研究内容。
3339 0
目标驱动系统模式,能否成为实现人工通用智能(AGI)的关键?
组织开发AI方案时采取的一大核心模式,正是目标驱动型系统模式。与其他AI模式一样,这种形式的AI能够解决一系列原本需要人类认知能力才能处理的常见问题。
713 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8463 0
敏捷模型驱动开发(AMDD):攀登敏捷软件开发的关键
Agile Model Driven Development (AMDD): The Key to Scaling Agile Software Development 敏捷模型驱动开发(AMDD):攀登敏捷软件开发的关键   Table ...
1233 0
最精简领域驱动设计开发模版(针对WPF)
一:领域驱动中的分层 领域驱动设计将软件系统分为四层:基础结构层、领域层、应用层和表现层。 · 基础结构层:该层专为其它各层提供技术框架支持。注意,这部分内容不会涉及任何业务知识。众所周知的数据访问的内容,也被放在了该层当中,因为数据的读写是业务无关的。
559 0
领域驱动设计(DDD)-简单落地
一、序言     领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法。在本文中的实战示例可能会与常见的DDD规则方法不太一样,是简单、入门级别,新手可以快速实践版的DDD。如果不熟悉DDD设计思想可看下基础思想篇 二、设计阶段     领域建模设计阶段常见的方法有 四色建模法、EventSourcing等 推荐一篇博文正确理解领域建
4473 0
使用CDK在RVB2061上编写IIC软件驱动——快来测体温队
本文将为大家带来一个完整的iIIC驱动解析
86 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载