• [其他] 领域驱动设计介绍(二)
     领域驱动设计(DDD)是一种软件开发方法,它旨在解决复杂业务需求并实现可维护、可扩展的软件系统。DDD的核心理念是将业务领域的概念、规则和逻辑与技术实现分离,从而使得软件开发过程更加关注业务价值。本文将介绍DDD的基本概念、优势以及如何在实际项目中应用。  一、领域驱动设计的基本概念  1. 领域:领域是指一个组织所从事的业务范围,包括其中的业务实体、业务规则和业务流程。在DDD中,领域是一个核心概念,因为它是软件开发的基础。  2. 限界上下文:限界上下文是一个显式定义的边界,用于划分领域中的不同子域。每个限界上下文内部包含一组紧密相关的模型、业务规则和逻辑。限界上下文之间通过上下文映射进行交互。  3. 聚合:聚合是一组紧密相关的对象,它们共同组成一个更大的业务实体。聚合内部的实体之间的关系非常紧密,而聚合之间的交互则相对较少。聚合的目的是确保数据的一致性和完整性。  4. 实体:实体是领域中具有唯一标识的对象,如用户、订单等。实体具有属性和行为,可以表示业务领域中的某个概念或事物。  5. 值对象:值对象是领域中不具有唯一标识的对象,如地址、价格等。值对象主要用于描述实体的属性或状态,它们是不可变的,即在创建后不会发生变化。  6. 领域事件:领域事件是领域中发生的重要业务事件,如订单创建、用户注册等。领域事件可以触发其他业务逻辑,从而实现业务领域的协同工作。  二、领域驱动设计的优势  1. 提高业务理解:通过将业务领域的概念、规则和逻辑与技术实现分离,DDD有助于开发人员更好地理解业务需求,从而提高软件的质量和业务价值。  2. 降低复杂度:DDD通过限界上下文、聚合等概念对领域进行划分,有助于降低系统的复杂度,提高代码的可维护性和可扩展性。  3. 提高团队协作效率:DDD鼓励团队成员共同参与领域模型的建立和维护,有助于提高团队协作效率,减少沟通成本。  三、如何在实际项目中应用领域驱动设计  1. 建立领域模型:首先需要对业务领域进行分析,识别出领域中的实体、值对象、聚合等概念,并建立领域模型。领域模型是DDD的核心,它有助于团队成员对业务需求达成共识。  2. 划分限界上下文:根据领域模型,将领域划分为不同的限界上下文。每个限界上下文内部包含一组紧密相关的模型、业务规则和逻辑。限界上下文之间通过上下文映射进行交互。  3. 设计领域事件:识别领域中的重要业务事件,并设计相应的领域事件。领域事件可以触发其他业务逻辑,从而实现业务领域的协同工作。  4. 实现领域逻辑:根据领域模型和领域事件,实现相应的领域逻辑。领域逻辑应该集中在领域层,而不是基础设施层或应用层。  总之,领域驱动设计是一种以业务领域为核心的软件开发方法,它有助于提高软件质量、降低系统复杂度并提高团队协作效率。在实际项目中应用DDD,需要团队成员共同参与领域模型的建立和维护,以确保软件系统能够更好地满足业务需求。 
  • [其他] DDD领域驱动设计详解
     1. 领域驱动概述 1.1 领域驱动简介 领域驱动设计是Eric Evans在2004年发表的Domain Driven Design(领域驱动设计,DDD)著作中提出的一种从系统分析到软件建模的一套方法论。以领域为核心驱动力的设计体系。  从领域驱动定义来看,领域驱动设计-软件核心复杂性应对之道,从Eric 定义中可以看出,领域驱动设计是为了解决复杂的软件设计,而且只是解决软件复杂性的一种方式,并不是唯一选择。另外不是所有的业务服务都合适做DDD架构,DDD适合产品化,可持续迭代,业务逻辑足够复杂的业务系统,对于系统初期业务逻辑相对比较简单的应用,传统MVC架构更具有优势,可以减少一部分认知成本与开发成本。而且领域驱动设计并不是万金油,只是解决复杂软件的一种方案,领域驱动设计本身只提供了理论思想,具体的落地方案一定是结合具体的业务场景实现的。目前市面上也有很多依据领域驱动思想落地的开源框架可以参考。  从领域驱动对应关系来看,一方面目前很多建设中台的时候大多采用DDD思想落地,DDD很多思想比如领域划分,领域事件,领域服务,边界上下文划分,充血模型,代码防腐,统一语义等等可以很好的帮助实现中台的落地,但是中台落地DDD并不是唯一选择。另一方面对于DDD的这些思想,与DDD的关系更多是聚合关系,而不是组合关系,也就是在具体应用开发中,即使采用传统的MVC架构,这些思想依然可以很好的发挥其作用。  1.2 领域驱动优点 DDD最大的好处是:接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言,而不是数据。DDD强调业务抽象和面向对象编程,而不是过程式业务逻辑实现。重点不同导致编程世界观不同。  1.面向对象设计,数据行为绑定,告别贫血模型。 2.优先考虑领域模型,而不是切割数据和行为。 3.业务语义显性化,准确传达业务规则。 4.代码即设计,通过领域设计即可很清晰的实现代码。 5.它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现业务和技术统一的架构演进。  领域驱动设计,又称"软件核心复杂性应对之道"。是一套基于对象思维的业务建模设计思想,相对于 CRUD 系统有更高的灵活性,是业务人员处理复杂问题的有效手段。  通用语言:“一个团队,一种语言”,将模型作为语言的支柱。确保团队在内部的所有交流中,代码中,画图,写东西,特别是讲话的时候都要使用这种语言。例如账号,转账,透支策略,这些都是非常重要的领域概念,如果这些命名都和我们日常讨论以及PRD中的描述保持一致,将会极大提升代码的可读性,减少认知成本。说到这,稍微吐槽一下我们有些工程师的英语水平,有些神翻译让一些核心领域概念变得面目全非。 显性化:就是将隐式的业务逻辑从一推if-else里面抽取出来,用通用语言去命名、去写代码、去扩展,让其变成显示概念,比如"透支策略"这个重要的业务概念,按照事务脚本的写法,其含义完全淹没在代码逻辑中没有突显出来,看代码的人自然也是一脸懵逼,而领域模型里面将其用策略模式抽象出来,不仅提高了代码的可读性,可扩展性也好了很多。  1.3 领域驱动解决复杂度方式 首先, 典型的DDD实现了业务复杂度和技术复杂度的隔离,通过分层架构隔离了关注点,举个例子,在传统的DDD四层架构中,DDD划分出了领域层、仓储层、基础设施层、接口层;  在领域层中,存放业务逻辑的关注点,即所谓的领域行为;在应用层中,DDD暴露出了 业务用例级别 (Use Case)的服务接口,粘合业务逻辑与技术实现;在基础设施层中,DDD集中放置了支撑业务逻辑的技术实现,如:MQ消息发送、对缓存的操作等;在仓储层中,DDD放置了和领域状态相关的逻辑,打通了领域状态持久化与存储设施之间的联系。  除了划分不同分层外,DDD还提出了一个建设性的概念: “限界上下文(Bounded Context)”,通过限界上下文对业务流程分而治之,切分为不同的子系统,在每个子系统中利用DDD的分层架构/六边形架构等思想分别进行逻辑分层。通过这样的分治之后,DDD帮我们将业务复杂度隔离到了每个细分的领域内部,而且DDD本身的分治思想,也帮助我们隔离了业务需求和技术需求的关注点。  这是一个典型的领域驱动设计分层架构,蓝色区域的内容与业务逻辑有关,而灰色区域的内容则与技术实现有关。这二者泾渭分明,最后汇合在应用层。 应用层确定了业务逻辑与技术实现的边界,通过直接依赖或者依赖注入(DI,Dependency Injection)的方式将二者结合起来。充分体现了DDD能够隔离技术复杂度与业务复杂度的特点。  1.4 领域驱动疑问 对于领域驱动设计与传统架构设计,不同的人有不同的见解,也可以理解,这里梳理领域驱动设计也不是认为传统架构有什么问题,具体采用什么样的架构设计一定是根据现有架构并结合当前实际的业务场景所决定的,任何撇开业务场景谈架构都是耍流氓,就像撇开剂量谈药性一样荒诞。  其次,领域驱动设计全称叫领域驱动设计软件核心复杂性应对之道,是为了更好的解决复杂软件的架构设计,但是这并不意味着领域驱动设计就是万金油,可以解决所有的问题。面对复杂的业务也会存在复杂的聚合,也会存在性能问题,也需要做幂等,也需要高可用,高性能,高并发等等,会与传统架构一样存在这些问题,不同的架构设计工具解决不同的问题,与领域驱动也并不冲突。  不管是领域驱动设计还是传统三层架构都是面向对象设计,很多地方认为传统是面向数据,面向过程,数据也是对象,过程也是对象,只不过领域驱动更加贴合业务,以业务为核心展开的设计开发,对于聚合问题,业务的复杂必然带来聚合复杂,也是正常现象,不是说使用了DDD就变得不复杂了,对于性能问题,与DDD完全两个概念,领域驱动解决的是软件核心复杂性应对之道,是为了更好的应对复杂业务,使技术实现与业务更好的分离,使外部调用与内部系统相隔离,采用充血,聚合,代码防腐,领域事件,领域服务。对于性能的问题采用相应性能对应的技术手段去解决,而不应该把问题归咎于领域驱动设计。 
总条数:16 到第
上滑加载中