开发者社区> 超努力的写代码> 正文

如何在推行DDD时不照本宣科地使用《领域驱动设计》一书(上)

简介: 如何在推行DDD时不照本宣科地使用《领域驱动设计》一书(上)
+关注继续查看

只凭经验,我们得经过遥遥辽远的汗漫之游,才能得到便利直捷之径。

洛节·爱铿,转引自托马斯·哈代的《德伯家的苔丝》


距离领域驱动设计的提出已有十余年,开发人员面对的软件开发模式、开发技术和IT规模都有了天翻地覆的变化。即使领域驱动设计作为一种设计思维方式与软件设计过程,并未涉及具体的开发技术,但技术的发展仍然会对它产生影响,就连Eric Evans自己也认为:如果在推行领域驱动设计时继续照本宣科地使用《领域驱动设计》一书,这就不太光彩了![1]


上次谈到

针对领域驱动设计现存的这4个不足,我对领域驱动设计体系进行了精简与丰富。精简,意味着做减法,就是要剔除设计元模型中不太重要的模式,凸显核心模式的重要性,并对领域驱动设计过程进行固化,提供简单有效的实践方法。


软件构建的过程就是不断对问题空间求解获得解决方案,进而组成完整的解空间的过程。在这个过程中,若要构建出优良的软件系统,就需要不断控制软件的复杂度。因此,我对领域驱动设计的完善,就是在问题空间与解空间背景下,定义能够控制软件复杂度的领域驱动设计过程,并将该过程执行的工作流限定在领域关注点的边界之内,避免该过程的扩大化。我将这一过程称为领域驱动设计统一过程domain-driven design unified processDDDUP)。


3.2.1 统一过程的二维模型


领域驱动设计统一过程参考了统一过程(rationalunified processRUP)的二维开发模型。整个过程的二维模型如图3-1所示,横轴代表推动领域驱动设计在构建过程中的时间,体现了过程的动态结构,构成元素主要为3个阶段(phase),每个阶段可以由多个迭代构成;纵轴表现了领域驱动设计在各个阶段中执行的活动,体现了过程的静态结构,构成元素包括工作流(workflow)和元模型(meta model


不同于RUP等项目管理过程,领域驱动设计统一过程并没有也不需要覆盖完整的软件构建生命周期,例如软件的部署与发布就不在该统一过程的考虑范围内。结合领域驱动设计对问题空间和解空间的阶段划分、对战略设计和战术设计的层次划分,整个统一过程分为3个连续的阶段:


q全局分析阶段;

q架构映射阶段;

q领域建模阶段。


阶段都规定了自己的里程碑和产出物。里程碑作为阶段目标,可以作为该阶段结束的标志,避免团队无休止地投入人力物力到该阶段的工作流中;每个阶段都必须输出产出物,这些产出物无论形式如何,都是领域知识的一部分,并作为输入,成为执行下一阶段工作流的重要参考,甚至可以指导下一个阶段工作流的执行。根据情况,团队可以对每个阶段的产出物进行评审。每个团队可以设定验收规则,甚至做出严格规定,只有本阶段产出物通过了评审,才可以进入下一个阶段。


image.png


统一过程的每个阶段要执行的活动主要通过工作流来表现,一个工作流就是一个具有可观察结果的活动序列。整个统一过程的工作流分为过程工作流process work flow)与支撑工作流supporting work flow)。每个工作流都可能贯穿统一过程的所有阶段,只不过因为阶段目标与工作流活动的不同,工作流在不同阶段所占的比重各不相同,意味着在不同阶段花费的人力成本与时间成本的不同。图3-1中工作流图例的面积直观地体现了这种成本的差异。例如,价值需求分析工作流主要用于确定系统的利益相关者、系统愿景和系统范围,这些活动与全局分析阶段需要达成的里程碑相吻合,但这并不意味着在项目进入架构映射阶段时就不需要执行该工作。软件系统就像一座不断扩张的城市,通过价值需求分析获得的利益相关者、系统愿景和系统范围也会随着软件系统问题空间的变化而发生调整,其他工作流同样如此。


过程工作流构成了领域驱动设计统一过程的主要活动,它融合了领域驱动设计元模型,为工作流提供设计原则和模式的指导。这也使得整个统一过程保留了领域驱动设计的特征,遵循了“以领域为驱动力”的核心原则。支撑工作流严格说来不属于领域驱动设计的范围,但对它们的选择却会在整个统一过程中不断地影响着实施领域驱动设计的效果。领域驱动设计不能与它们强行绑定,毕竟不同企业、不同团队的文化基因和管理机制存在差异,但需要选择与领域驱动设计统一过程具有高匹配度的支撑工作流。


3.2.2 统一过程的动态结构


领域驱动设计统一过程的动态结构通过3个阶段,从问题空间到解空间完整而准确地展现了运用领域驱动设计构建目标系统的过程。这里所谓的“目标系统”是一个抽象的概念,取决于领域驱动设计统一过程的运用范围,既可大至整个组织,将该组织的所有IT系统都囊括在这一统一过程之下(问题空间的范围也将由此扩大至整个组织),也可小至一个已有系统的新开发功能模块,将其独立出来,严格遵循该统一过程,运用领域驱动设计完成其构建。目标系统的大小直接决定了问题空间的大小,自然也就决定了它所映射的解空间的大小。


1.全局分析阶段

全局分析big picture analysis)阶段的目标是探索与分析问题空间。该阶段主要通过对目标系统执行价值需求分析与业务需求分析这两个工作流,完全抛开对解决方案的思考与选择,仅仅从需求分析的角度以递进方式开展对问题空间的深入剖析。整个全局分析过程如图3-2所示。


image.png


从价值需求开始,识别目标系统的利益相关者,明确系统愿景,识别系统范围。只有明确了利益相关者,才能就不同利益相关者的项目目标达成共识,以明确组织对目标系统树立的愿景,确保构建的目标系统能够对准组织的战略目标,避免软件投资方向的偏离。通过了解目标系统的当前状态和预期的未来状态,可以确定目标系统的范围,从而界定问题空间的边界,为进一步探索目标系统的解决方案提供战略指导。价值需求分析的成果看似虚无缥缈,似乎都是宏观层次言不及义的大话、套话,实则描绘了目标系统的蓝图,避免开发团队只见树木不见森林,缺乏对系统的整体把控。同时,它还指明了目标系统的方向,为我们确定和排列业务需求优先级提供了参考,为解空间进行技术选型和技术决策提供了依据,做出恰如其分的设计。


在价值需求的指导和约束下,根据用户发起的服务请求,逐一梳理出提供业务价值的动态业务流程,体现了多个角色在不同阶段进行协作的执行序列。每个业务流程都具有时间属性,通过划定里程碑时间节点,即可在业务目标的指导下将业务流程划分为不同时间阶段的多个业务场景。业务场景由多个角色共同参与,每个角色在该场景下与目标系统的一次功能交互,都是为了满足该角色希望获得的服务价值,由此即可获得业务服务。


在对业务需求进行深入分析后,可以结合价值需求分析的结果,将那些对准系统愿景的业务需求放到核心子领域,将提供支撑作用的业务需求放到支撑子领域,将提供公共功能的业务需求放到通用子领域,由此就可以从价值角度完成对问题空间的分解。


全局分析阶段的里程碑目标是探索和固定目标系统的问题空间,通过分析价值需求与业务需求,获得以业务服务为业务需求单元的全局分析规格说明书(参见附录D)。


参与全局分析阶段的角色包括客户或客户代表、业务分析师、产品经理、用户体验设计师、架构师或技术负责人、测试负责人。其中,客户、业务分析师、产品经理共同扮演领域专家的角色,并在本阶段作为关键的引导者和推动者。



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

相关文章
全网最细 | 教你如何在 docker 容器下使用 mmdetection 训练自己的数据集
全网最细 | 教你如何在 docker 容器下使用 mmdetection 训练自己的数据集
161 0
Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?
单例设计模式是Java常用的设计模式, 也是Java 面试经常遇到的问题,让我们一起了解一下单例设计模式吧!
634 0
短视频“元年”,又是一场技术驱动的攻坚战
短视频“元年”,又是一场技术驱动的攻坚战
60 0
如何使用async和await这对组合设计统一的取Access Token的函数
最近我在使用SAP云平台的机器学习API做和SAP系统的集成,因为SAP Cloud Platform Leonardo上的机器学期API,每次消费时需要传一个Access Token,故在每次实际调用API前,我需要先发一个请求去获取Access Token. 该请求的响应,除了返回实际的token外,还有一个过期时间,expires_in字段: 根据OAuth 2.0标准定义,expires_in字段代表服务器颁发的该token,距离过期时间还剩的秒数。
526 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24852 0
元数据驱动的YonBIP:真正让商业创新便捷高效
元数据驱动的YonBIP:真正让商业创新便捷高效
49 0
面试7 GC机制中如何判断一个对象是否任在使用
GC 通过在使用的根引用遍历所有引用的对象实例,当一个对象不能被遍历时,将被视为不能被使用。博客内容仅代表个人观点,如发现阐述有误,麻烦指正,谢谢!
570 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18122 0
Python使用Mysql官方驱动(取出dict类型的数据)
简介 虽然Python有很多连接mysql的库,比如mysqldb, pymysql~这些都很方便,现在就教大家使用mysql的官方库来操作mysql. 安装 windows: 下载链接 选择自己的windows版本和Python版本,下载msi文件后双击安装即可。
1235 0
block使用小结、在arc中使用block、如何防止循环引用(zz)
<div class="articalTag" id="sina_keyword_ad_area" style="width:690px; clear:both; word-break:break-all; line-height:20px; color:rgb(70,70,70); font-family:Verdana,宋体,sans-serif"> <table style="ma
1245 0
1946
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载