如何在推行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)。


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



相关文章
|
Java 程序员
Java 求助! 为什么我拿不到错误信息,e.getMessage()
Java 求助! 为什么我拿不到错误信息,e.getMessage()
1521 0
Java 求助! 为什么我拿不到错误信息,e.getMessage()
|
NoSQL 测试技术 Linux
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
VLDB顶会论文Async-fork解读与Redis在得物的实践
410 0
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
|
弹性计算 分布式计算 大数据
阿里云计算平台大数据基础工程技术论文入选 VLDB 2023
近日,在 VLDB 2023 上,由阿里云计算平台大数据基础工程技术团队主导,与计算平台 MaxCompute 团队、华东师范大学数据科学与工程学院、达摩院合作的论文入选 Industrial Track
|
jenkins 持续交付
Jenkins常用插件Copy Artifact的使用
使用Copy Artifact插件,可以完成不同任务间传输文件
2522 0
Jenkins常用插件Copy Artifact的使用
|
11月前
快手同城视频自动评论脚本,对同城用户可指定性别年龄作品点赞评论,精准营销必备神器
这是一款快手自动营销工具,可帮助用户在快手上实现自动化点赞、评论等功能,适用于产品推广和引流。通过模拟真实用户行为,如自动评论、随机观看时长
|
缓存 前端开发 JavaScript
前端领域驱动设计的一些思考
前端领域驱动设计的一些思考
1385 0
|
存储 智能硬件
CPU的定义与功能与架构
CPU(中央处理器)是计算机的核心部件,负责执行程序指令、控制数据传输和进行运算。它能处理算术与逻辑运算,并协调其他硬件协同工作。x86架构源于英特尔,适用于PC和服务器,采用复杂指令集;ARM架构则由Acorn等公司开发,广泛用于移动设备和嵌入式系统,采用精简指令集,功耗低且能效比高。
1727 5
|
安全 网络协议 Linux
结合 `nc` 工具利用笑脸漏洞(Smile Bug)攻击 Metasploitable2 Linux
本文介绍如何使用 `nc`(Netcat)工具结合笑脸漏洞(Smiley Bug)攻击 Metasploitable2 Linux 靶机。首先概述了 `nc` 的基本功能和高级用法,包括建立连接、监听端口、文件传输等操作。接着详细描述了笑脸漏洞的原理及其在网络攻防中的应用,展示了通过 `nc` 发送恶意输入检测漏洞的方法。最后结合 Python 脚本实现更复杂的攻击场景,并强调了合法性和环境隔离的重要性。
602 13
|
SQL 存储 分布式计算
Hologres+Paimon构建一体化实时湖仓
Hologres 3.0全新升级,面向未来的一体化实时湖仓。它支持多种Table Format,提供湖仓存储、多模式计算、分析服务和Data+AI一体的能力。Hologres与Paimon结合,实现统一元数据管理、极速查询性能、增量消费及ETL功能。Dynamic Table支持流式、增量和全量三种刷新模式,满足不同业务需求,实现一份数据、一份SQL、一份计算的多模式刷新。该架构适用于高时效性要求的场景,也可用于成本敏感的数据共享场景。

热门文章

最新文章