DDD领域模型、事务脚本、实体、值对象

前言

DDD指的是领域驱动设计(Domain-Driven Design),是一种软件开发方法论,强调将软件的关注点从技术层面转移到业务层面,将业务模型转化为软件实现的核心概念,并通过设计模式和规范化的方法来实现高质量的软件开发。

DDD与微服务区别

虽然DDD和微服务都关注架构设计,但它们关注的方面不同。DDD强调的是如何设计和实现领域模型,而微服务强调的则是如何拆分应用程序为小型独立的服务,它们是两个不同的概念,但是我们在开发中通常一起使用。

优点:

  1. 更好的业务建模:建立起更为精确、细致的业务模型,减少开发过程中对于复杂业务逻辑的误解和化简。

  2. 更容易实现业务需求变化:业务模型具有更强的灵活性,当业务需求变化时,只需对相关的业务模型进行修改即可,无需对整个系统进行大规模的变更。

  3. 更好的可测试性:每个子系统都可以独立地进行测试,从而提高系统的可测试性和可靠性。

缺点: 

  1. 需要更多的资源:实施DDD需要更多的资源,包括技术和人力资源。这可能会增加开发成本。

  2. 需要更多的协作和沟通:开发人员和业务人员之间的协作和沟通。

  3. 不适用于所有的项目:DDD适用于复杂的项目和大型团队,对于小型的项目或个人开发来说,可能并不适用。

一般用于大型企业应用程序、 需要高度可定制的软件、需要与其他系统进行交互的软件、需要快速迭代的软件。

一、什么是事务脚本?

如语文试卷当中写作文,我将作文以流水化的形式完成,说白一点就是口水话作文。在编程当中就是程序员以自己的语言去描述业务,比如账号密码注册,if判断账号密码是否为空、账号密码是否合规等等,最后注册成功,写第一版代码的时候浑然天成,但是后面要加一些功能,要邀请码的才能注册,要审核员审批通过了才能注册等等,就只能不断的加if判断,渐渐的“史山”就堆起来了。

缺点也就显而易见了:

  1. 代码冗余:事务脚本通常涉及多个操作,需要编写大量冗长重复的代码来处理这些操作。

  2. 结构不清:事务脚本往往缺乏良好的组织结构,难以维护和扩展。

  3. 可重用性差:事务脚本通常特定于某个应用程序或业务流程,难以在其他场景中重用。

  4. 事务控制逻辑和业务逻辑混淆:事务脚本既包含业务逻辑,又包含事务管理代码,使得代码难以理解和维护。

  5. 难以测试:由于事务脚本的复杂性和副作用,测试事务脚本时往往需要设置一个完整的测试环境,使得测试变得非常困难。

当然也有优点,最大的优点就是开发简单以及老板不好开我。

 这也是DDD中不推荐的写法,但是又不是每篇作文都能评上“优秀作文”。

二、Model

2.1、实体Entity

拥有唯一标识符,标识符用于跟踪对象状态变化,无论这个实体如何去变,这个标识符都是不可能改变的,都可以通过标识符寻找到实体。它是领域模型中最核心的部分。实体代表领域模型中的一个具体事物,具有唯一标识和一组属性,可以有行为和状态。

2.2、值对象Value Object

没有唯一标识符的对象,有多个属性、依附于某个实体对象而存在,通常用于描述实体(Entity)的属性,或者作为参数和返回值传输数据。在DDD中,我们常常使用值对象来描述实体和实体之间的关系,或者是实体的某些属性。

三、领域模型

3.1、领域

领域的划分:核领域、支撑域、通用域

核心域:解决项目核心问题

领域模型中的核心域是指应用的内在价值和复杂性所在的部分,通常包含的是应用的核心流程和业务逻辑,也是应用的重点和难点。在软件开发中,核心域是需要格外关注和重视的部分,因为它对应用的稳定性和可维护性有着至关重要的影响。

支撑域:解决项目非核心问题

支撑域是指在领域模型中,不具备业务特征,但是对于业务流程的实现有着重要作用的一部分。它们通常是提供业务支撑的技术、组织或基础设施等方面。

通用域:解决通用问题

通用域是领域模型中经常出现的、适用于许多领域的概念或对象模型,例如时间、日期、地址、人员等。它们可以被视为领域模型中的共享概念,而不是只属于一个特定领域或业务领域。

列如阿里巴巴总公司,它就是领域,他旗下的支付宝、淘宝、阿里云、高德地图、优酷、菜鸟等就是子领域,这些子领域当中,重要的支付宝、淘宝、阿里云(本家企业)这些给阿里巴巴带来主要经济的就是核心域,其次一些的优酷、菜鸟、高德(收购产业)就是支撑域,而通用域则是其他的投资产业。

3.2、建模

领域模型建模是指将现实世界中的事物和概念映射到计算机程序中,就如现实中的商品,在计算机当中所映射的就是商品的一个名称,对商品的买卖,就是在计算机中对商品名称的一个删除或添加。

建立领域模型需要进行以下步骤:

  1. 确定领域对象:将现实世界中的实体(如人、物、事件)和概念(如任务、责任、需求)抽象为领域对象。

  2. 确定属性:确定领域对象的属性,比如人的姓名、年龄、性别等。

  3. 确定关系:确定领域对象之间的关系,比如人与家庭的关系为拥有等。

  4. 定义类和方法:确定领域对象的行为特征,比如人要做什么。

  5. 完善模型:综合考虑领域模型的特征和需求,不断完善模型,使其更符合实际应用场景。

你可能感兴趣的:(设计模式,架构,微服务)