共计 2236 个字符,预计需要花费 6 分钟才能阅读完成。
【注】本文译自:https://www.geeksforgeeks.org…
畛域驱动设计(Domain-Driven Design)是程序员 Eric Evans 于 2004 在他的 《畛域驱动设计:解决软件外围中的复杂性》 一书中提出的一个概念。
这是一种自顶向下的软件设计办法。首先,让咱们尝试重点介绍一下在这种状况下畛域的含意。
什么是畛域?
在软件开发的上下文中,“域”指的是业务。在利用程序开发过程中,通常应用术语域逻辑或业务逻辑。基本上,业务逻辑是利用程序逻辑所围绕的常识畛域。应用程序的业务逻辑是一组规定和领导准则,用于解释业务对象应如何互相交互以解决建模数据。
留神:
软件工程畛域的畛域是要在其上构建应用程序的业务。
畛域驱动设计:
假如咱们的软件曾经应用了所有最新技术堆栈和基础设施,这样的软件设计架构十分棒,然而当咱们在市场上公布这个软件时,最终还是要由最终用户来决定咱们的零碎是否优良。另外,如果零碎不能解决业务需要,对任何人都没有用途;不论它看起来有多丑陋,或者它的基础设施有多好。依据 Eric Evans 的说法,当咱们在开发软件时,咱们的重点不应该次要放在技术上,而应该次要放在业务上。记住:
“客户的工作不是晓得他们想要什么“— 史蒂夫·乔布斯
畛域驱动设计波及两种设计工具,一种是策略设计工具,另一种是战术设计工具。程序员或开发人员通常解决战术设计工具,但如果咱们有策略设计工具的常识和良好的了解,它将帮忙咱们构建好的软件。
Spring 数据家族下的大多数框架都是依据畛域驱动的设计办法构建的。
策略设计:
策略设计工具帮忙咱们解决所有与软件建模相干的问题。它是一种相似于面向对象设计的设计办法,在面向对象设计中,咱们被迫从对象的角度思考问题。在策略设计方面,咱们被迫从环境的角度来思考。
上下文(Context):
咱们能够把这个词看作是一个英语单词,它指的是某一事件、事件、陈说或想法的状况,它的意思能够依据这些状况来确定。
除了上下文之外,策略设计还探讨了模型、泛在语言和边界语境。这些是畛域驱动设计的策略设计中罕用的术语。让咱们逐个了解。
- 模型:
充当外围逻辑并形容畛域的选定方面。它用于解决与该业务无关的问题。 - 通用语言:
所有团队成员应用的一种公共语言,用于连贯团队围绕畛域模型的所有流动。与领域专家和团队成员交谈时,能够将其视为对类、办法、服务和对象应用通用动词和名词。 边界上下文:
指的是上下文的边界条件。它是对边界的形容,并充当一个阈值,在这个阈值中定义并实用于特定的域模型。战术设计:
战术设计探讨实现细节,即建模畛域。它通常会解决有界上下文中的组件。咱们可能据说过或应用过诸如服务、实体、存储库和工厂之类的货色。它们都是通过域驱动设计发明并风行的。战术设计过程产生在产品开发阶段。
让咱们探讨一些重要的战术设计工具。这些工具是高级概念,可用于创立和批改域模型。- 实体:
基于面向对象准则工作的程序员可能晓得类和对象的概念。在这里,实体是具备某些属性的类。这些类的实例具备全局标识,并且在整个生命周期中都放弃雷同的标识。请记住,属性状态可能会发生变化,但身份永远不会扭转。简而言之,实体能够实现一些业务逻辑,并且能够应用 ID 进行惟一标识。在编程的上下文中,它通常在 DB 中作为行长久保留,并且由值对象组成。 - 值对象:
它是不可变的轻量级对象,没有任何标识。值对象通过执行简单的计算,将沉重的计算逻辑与实体隔离开来,从而升高了复杂性。
在上图中,User 是一个实体,Address 是一个值对象,地址能够更改很屡次,但用户的身份证号永远不会更改。每当地址更改时,都会实例化一个新地址并将其调配给用户。 - 服务:
服务是无状态的类,能够适宜实体或值对象以外的其余中央。简而言之,服务是一种性能,存在于实体和值对象之间的某个地位,但它既不与实体相干,也不与值对象相干。 - 聚合:
当咱们有更大的我的项目时,对象图也变得更大,更大的对象图更难保护。聚合是位于单个事务边界下的实体和值的汇合。基本上是聚合,管制变动,有一个根实体叫做聚合根。根实体以聚合的形式治理其余实体的生命周期。
在下面的示例中,如果根实体 User 或 Order 被删除,则与该根实体关联的其余实体将毫无用处,并且该关联的信息也将被删除。这意味着聚合在实质上总是统一的,这是在域事件的帮忙下实现的。生成域事件是为了确保最终的一致性。
在下面的例子中,如果用户的地址曾经扭转,那么它必须同样反映在订单上。为此,咱们能够触发一个从 User 到 Order 的域事件,以便 Order 更新地址,这样咱们就有了最终的一致性,Order 也将最终统一。
聚合和聚合根的其余例子能够是对帖子的评论、问答细节、银行事务细节等。ORM 工具如 hibernate 在创立一对多或多对一关系时应用了大量聚合。 工厂和存储库:
工厂和存储库用于解决聚合。工厂帮忙治理聚合生命周期的开始,而存储库帮忙治理聚合生命周期的两头和末端。工厂帮忙创立聚合,而存储库帮忙长久化聚合。咱们应该总是为每个聚合根创立存储库,而不是为所有实体创立存储库。
工厂是 GoF 的设计模式,工厂是有用的,但在聚合规定的上下文中不是强制性的。畛域驱动设计的长处:
- 进步了咱们的技能
- 提供了灵活性
- 更偏向于域而不是接口
通过通用语言缩小了团队之间的沟通差距
畛域驱动设计的毛病:
- 须要一个具备很强畛域专业知识的业余人员
- 激励团队遵循迭代实际