领域驱动设计是程序员埃里克·埃文斯在2004年出版的《领域驱动设计:解决软件核心的复杂性》一书中提出的一个概念。
它是一种通过自顶向下的方法来研究软件的架构设计方法。在详细讨论这个话题之前,让我们试着聚焦一些光,并理解在这个上下文中域的含义。
什么是Domain域?
在软件开发上下文中使用的单词Domain指的是业务。在应用程序开发过程中,通常使用术语域逻辑或业务逻辑。基本上,业务逻辑是应用程序逻辑所围绕的知识领域。应用程序的业务逻辑是一组规则和指导原则,用于解释业务对象应如何相互交互以处理建模数据。
软件工程领域中的一个领域是用来构建应用程序的业务。
领域驱动设计
假设我们使用所有最新的技术堆栈和基础设施设计软件,我们的软件设计架构非常棒,但当我们在市场上发布这个软件时,最终由最终用户决定我们的系统是否优秀。另外,如果系统不能解决业务需求,对任何人都没有用;不管它看起来有多漂亮,也不管它的基础架构有多好。埃里克·埃文斯认为,当我们开发软件时,我们的重点不应该主要放在技术上,而应该主要放在业务上。
知道自己想要什么并不是顾客的工作
领域驱动设计涉及两种设计工具,一种是战略设计工具,另一种是战术设计工具。程序员或开发人员通常处理战术设计工具,但如果我们有知识和战略设计工具的良好理解,那么它将有助于我们设计好的软件。
Spring数据族下的大多数框架都是基于领域驱动的设计方法构建的。
战略设计
战略设计工具帮助我们解决与软件建模相关的所有问题。这是一种类似于面向对象设计的设计方法,在这种方法中,我们被迫从对象的角度来思考。因此,战略设计,我们不得不考虑的条件。
上下文
我们可以把它看作是一个英语单词,它指的是一个事件、事件、陈述或想法的情况,根据这些情况可以确定它的意思。
除了语境,战略设计还涉及模型、泛在语言和有限语境。这些是域驱动设计的策略设计中常用的术语。让我们逐一了解。
- Model - 它作为一个核心逻辑,描述域的选定方面。它用于解决与该业务相关的问题。
- 无处不在的语言 - 所有团队成员使用的公共语言,用于连接团队围绕域模型的所有活动。就像在与领域专家和团队成员交谈时,对类、方法、服务和对象使用常用的动词和名词一样。
- 受限上下文 - 它指的是上下文的边界条件。它是对边界的描述,并作为一个阈值,在该阈值内定义和应用特定的域模型。
战术设计
战术设计讨论实现细节,即建模领域。它通常负责有界上下文中的组件。我们可能听说或使用过服务、实体、存储库和工厂之类的东西。它们都是由领域驱动设计创造和流行的。战术设计过程发生在产品开发阶段。
让我们来讨论一些重要的战术设计工具。这些工具是高级概念,可用于创建和修改域模型。
Entity
研究过面向对象原则的程序员可能知道称为类和对象的概念。这里的实体是一个具有某些属性的类。这些类的实例具有全局标识,并且在整个生命周期中保持相同的标识。记住,财产的状态可以改变,但身份永远不会改变。简而言之,一个实体实现了一些业务逻辑,并且可以使用一个ID唯一地标识它。在编程上下文中,它通常作为DB中的一行持久化,并且它由值对象组成。
Value Objects
它们是不可变的、重量轻的、没有任何标识的对象。值对象通过执行复杂的计算来降低复杂性,将繁重的计算逻辑与实体隔离开来。
在上图中,用户是一个实体,地址是一个值对象,地址可以多次更改,但用户的身份永远不会更改。每当一个地址得到改变,那么一个新的地址将被实例化并分配给用户。
服务
服务是一个无状态类,它适合于实体或值对象以外的其他地方。简而言之,服务是一种存在于实体和值对象之间的功能,但它既不与实体相关,也不与值对象相关。
Aggregates
当我们有更大的项目时,对象图变大了,对象图越大,维护起来就越困难。聚合是单个事务边界下的实体和值的集合。聚合基本上控制更改,并有一个称为聚合根的根实体。根实体控制聚合中其他实体的生存期。
在上面的示例中,如果根实体用户或订单被删除,则与根实体关联的其他实体将毫无用处,并且此关联信息也将被删除。这意味着聚合在本质上总是一致的,这是在域事件的帮助下完成的。生成域事件以确保最终的一致性。
在上面的例子中,如果用户的地址已经改变了,那么它也必须按顺序反映出来。为了做到这一点,我们可以从用户到订单触发一个域事件,以便订单更新地址,这样我们就有了最终的一致性,并且订单最终也会是一致的。
聚合和聚合根的其他示例可以是帖子上的评论、问答细节、银行事务细节等。类似hibernate的ORM工具在创建一对多或多对一关系时大量使用聚合。
Factories & Repositories
工厂和存储库用于处理聚合。工厂有助于管理聚合生命周期的开始阶段,而存储库有助于管理聚合生命周期的中间阶段和结束阶段。工厂有助于创建聚合,而存储库有助于持久化聚合。我们应该始终为每个聚合根创建一个存储库,但不是为所有实体。
工厂是GoF的设计模式,工厂是有用的,但在聚合规则的上下文中不是强制性的。
领域驱动设计的优势
- 它改进了我们的工艺。
- 它提供了灵活性
- 它更喜欢域而不是接口
- 它通过无处不在的语言减少了团队之间的沟通差距
领域驱动设计的缺点
- 它需要一个专业人士拥有强大的领域专业知识
- 它鼓励团队遵循迭代实践
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1939.html
暂无评论