`

领域模型驱动设计(DDD)之模型提炼

阅读更多

  当Java世界提供的可选择性框架平台越来越多时,我们可能被平台架构所深深困扰,而无暇顾及软件的真正核心:业务建模,其实,业务领域建模同样是一个比平台架构更复杂,更需要学习的新的领域。

  相反,在实践中,我们技术人员在经过冗长的平台架构学习和实践后,就匆忙开始项目开发,这时是什么指导他们进行软件业务实现呢?大部分可能是依赖数据库建模,甚至是复杂冗长的数据库存储过程设计,这些已经开始走向面向对象分析设计的反方向,走上了一条错误的软件开发方向,最终开发出缓慢的、经常当机的Java企业系统。

  如果你没有恰当的OO设计思想,Java就会用性能惩罚你,这可能是Java世界的一个潜规则。

  那么,一个正确的OOA/OOD/OOP步骤是什么呢?目前围绕模型驱动设计(MDD)的设计思想成为主流思想,MDA更是在MDD基础上提升和升华。下面让我们首先了解,如何使用领域驱动设计思想来分析设计一个软件系统。

  当我们不再对一个新系统进行数据库提炼时,取而代之的时面向对象的模型提炼。我们必须大刀阔斧地对业务领域进行细分,将一个复杂的业务领域划分为多个小的子领域,同时还必须分清重点和次要部分,抓住核心领域概念,实现重点突破。

核心领域模型

  精简模型,找出核心领域,将业务需求中最有价值的概念体现出来,让核心变精要,这实际就是一个使复杂问题变简单的过程,也是对我们软件设计人员真正能力的考验。

  核心领域模型不是轻易能够发现,特别是他处于一个纷乱复杂的众多领域模型结构中时,核心模型通常是我们某个子领域关注的重点,例如订单模型是订单管理领域的核心;消息模型是论坛或消息领域系统的核心。

  目前,分析领域有很多模式来帮助我们来提炼核心模型,例如四色原型、Martin Fowler 的分析模式等,例如MF的"分析模式"(Analysis Patterns)中的记帐模型就是不仅仅用来记录账目数值,而且可以记录和控制账目的每一次修改。而四色原型则是一种高于分析模式的一种原型基本模式,下面是本人根据四色原型提炼的核心领域模型概念。

  一般情况下,在企业应用中,核心模型总是在其周围围绕一些所谓的“卫星”,这实际上也是来自四色原型的一个推论,核心模型和其“卫星”的类图如下:

core model

  根据Eric Evans在其“领域驱动设计”一书中定义,领域模型划分为实体和值对象两种,实体模型是指业务领域中具有独立属性的对象;而值对象则可能是一种Description或状态或规则。只要有实体对象,就可能存在实体的状态,状态跟踪有时成为一个业务领域使用计算机软件的首要跟踪,但是,数据库不是对象状态的唯一表达方式,只是一种存储方式(见状态对象:数据库的替代者)。

  图中,实体核心对象大部分可能有一种类型,例如核心模型是产品,那么存在产品目录;核心模型是消息;就存在消息类型;核心模型是信息;总存在信息类别,我们总是使用分类方式来管理业务领域的信息,有时,类别甚至复杂到树形结构

  核心实体模型有时会有一个1:N关联的子实体,一般可能表达实体的细节,例如:核心模型是订单,那么存在订单条目这样一个细节,一个订单中可能有多个订单条目;如果核心模型是信息,那么存在该信息的多个回复或评论;这样的关联一般存在多个业务领域中。

模型界面实现

  原来,我们以为分析设计阶段无需了解实现细节,分析人员只要闷头做分析UML图,而无需顾及如何具体实现,其实这是一个误区。

  Eric Evans在其“领域驱动设计”一书中认为:分析人员负责从领域中收集基本概念; 设计则必须指明一组适应编程工具构造的组件,以及这些组件必须能够在目标环境中有效执行。模型驱动设计(Model-Driven Design)抛弃了分裂分析模型与设计的做法,使用单一的模型来满足这两方面的要求。因此,对于核心模型必须掌握了解其实现细节。

  从另外一个方面来说,中国的客户总是从界面设计来表达他们的意图(如果中国客户能够使用Use Case等UML图来表达他们概念真是不可想象),例如客户会说,我希望有一个界面让我将订单数据输入,然后能够查询符合查询条件的订单。因此,我们的核心模型至少能够顺利地映射到界面实现,相反,这个客户有这样订单界面要求,但是你没有提供一个与之适应的核心实体模型,界面实现将变得复杂,甚至走很多弯路,诞生不少DTO垃圾对象。

  以JdonFramework框架实现为例子,框架提供了围绕核心模型的新增删除修改查询(CRUD)功能以及批量功能的快速实现,尤其CRUD功能实现前提是必须提炼出核心模型,从而其界面设计流程就能通过配置立即实现,这样一步到位实现领域模型到界面的过渡,可以将我们设计核心模型和客户要求的界面需求能够做到完整的统一。

  开源JdonFramework下载包中message案例实际就是上述核心模型图的一种实现项目,更复杂的项目可以认为是核心模型的重叠和反复使用(从原理上讲,核心模型是四色原型的体现,而四色原型被认为是大部分企业系统的基本组成元素,见[book][UML][Peter Coad]Java Modeling in Color with UML)。

核心模型的选择

  实际项目中,会存在多个核心模型的重叠和覆盖使用,主要取决于你的领域关注重点。

  例如当客户和我们说要做一个旅游网站时,我们必须充分了解需求,它的软件系统重点是哪些功能。如果当他首先说:我需要一个酒店设备的查询系统,因为他的客户对酒店设备非常关注,那么我们可能认为酒店设备是这个领域模型的核心;酒店设备。如果他又进行描述:我需要一个界面,客户在输入酒店资料时,选择多个酒店设备,那么在这样一个关注领域,核心模型实际是酒店,而酒店设备可能成为酒店的一个特征实体属性,甚至是值对象了。

  以进销存系统为例子,在采购系统中,采购单是一个核心实体模型,而原材料是一种辅助实体模型;在库存系统中,入出库单是一个核心实体模型,原材料或成品代表的是一个库存物品概念模型,当需要库存报表查询输出,可以立即计算出来,或将结果缓存起来,缓存起来的结果其实是库存物品对象的状态,可以使用值对象来实现。

核心模型的精练

  当核心模型被定位和确定后,相当于我们抓住领域本质,这时我们可以使用面向对象的概念对模型进行精练细化,实际就是明确对象的属性,确定模型对象的边界,通过反复重构,结合GoF等设计模式,使得我们得模型准确反映本质,从而实现模型的灵活性设计。所有这些,都是数据表驱动设计所不能实现的。那你还抱着数据库建模干什么呢?

分享到:
评论

相关推荐

    领域驱动模型设计和应用

    5. **设计领域服务**:根据业务流程,设计领域服务,实现复杂的业务逻辑。 6. **实现领域模型**:编写代码实现上述模型,保持模型的简洁性和可测试性。 7. **持续调整**:随着业务发展,模型需要不断迭代和优化,以...

    微服务中的领域驱动设计.pdf

    领域驱动设计(DDD,Domain-Driven Design)是一种专注于软件核心复杂性领域的设计方法,强调从领域专家的知识中获取领域模型,并利用这些模型来指导软件设计。在微服务架构中运用领域驱动设计可以进一步提高系统的...

    新的架构之领域驱动设计.zip

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,它强调通过与领域专家紧密合作,将复杂的业务逻辑转化为可操作的软件模型。在本压缩包中,包含三份重要的学习资料,分别是“2020年系统架构设计...

    领域驱动设计:软件核心复杂性应对之道 英文版

    第二部分“构建模型驱动设计的模块”则更深入地探讨如何构建DDD项目。第4章“隔离领域”探讨了如何将复杂的业务逻辑分解为独立的、可管理的子领域,以实现更好的封装和解耦。后面的章节会继续介绍其他关键概念,如...

    领域驱动设计精简版,domain driven design

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,由Eric Evans在其2003年的著作《领域驱动设计:软件核心复杂性的应对之道》中提出。该方法论强调通过深入理解和分析业务领域,来驱动软件的...

    领域驱动设计-精简版

    在“领域驱动设计-精简版”中,Evans对原版书中的关键概念进行了提炼,以更简洁的形式呈现,适合快速理解和应用DDD理念。 首先,我们要理解DDD的核心概念——领域模型(Domain Model)。领域模型是业务领域的抽象...

    Domain-Driven Design: Tackling Complexty in the Heart of Software -- 领域驱动设计: 软件核心复杂性应对之道》

    关于DDD可参考InfoQ的Mini Book Domain Driven Design Quickly , 还有 Banq 的文章 实战DDD(Domain-Driven Design领域驱动设计), 和 领域模型驱动设计(DDD)之模型提炼 。 本书分为四部分,第一部分讲述了领域模型...

    领域驱动设计.软件核心复杂性应对之道

    软件核心复杂性应对之道》这本书深入探讨了如何通过领域驱动设计(DDD)来应对软件开发中的复杂性,尤其是针对那些核心业务逻辑复杂的项目。DDD 是一种软件开发方法,旨在确保软件模型紧密贴合业务需求,同时提高...

    领域驱动设计学习总结(一)

    领域驱动设计(DDD)是一种软件开发方法,它强调以业务领域为中心进行系统分析和设计,目的是构建更加贴合业务逻辑的软件系统。DDD的核心在于通过领域模型来表达业务规则和流程,使代码与业务语言保持一致,从而提高...

    01. 领域驱动设计概览1

    领域驱动设计(DDD)是一种由Eric Evans提出的软件开发方法,主要针对大型复杂系统的领域建模和分析。它强调以业务领域为中心,通过建立领域模型来理解和表述业务逻辑,从而简化系统的复杂性,增强其可扩展性和适应...

    【推荐】张逸-DDD聚合工作坊

    【推荐】张逸-DDD聚合工作坊是一份深入探讨领域驱动设计(Domain-Driven Design,简称DDD)的专题资料,由知名专家张逸在IAS2019演讲中分享。这份29页的PDF文件是关于如何有效地运用DDD方法论进行软件开发的实践指导...

    领域驱动设计方法实践总结-第二版 (2).docx

    领域驱动设计(Domain-Driven Design,简称DDD)作为一种面向对象的设计方法,旨在解决这一难题。它不仅仅是一种设计模式或架构方法,更是一种思维方式和一组优先级事项,旨在帮助开发团队更好地理解和构建与复杂...

    基于DDD和微服务中台架构与实现

    【基于DDD和微服务的中台架构与实现】是一本深度探讨现代企业IT架构的书籍,作者欧创新和邓頔结合实践经验,阐述了如何利用领域驱动设计(DDD)和微服务架构构建灵活且高效的中台系统。以下是该书涉及的主要知识点:...

Global site tag (gtag.js) - Google Analytics