浅谈一下对于DDD模式的理解3

浅谈一下对于DDD模式的理解,相互学习交流,不对之处欢迎大家指正。

在说到DDD(Domain-Driven Design)设计模式之前,先要说下我们在对系统进行架构设时需要遵循的几个原则:

  1. 单一职责(SRP)

    1. "单一职责原则"(Single Responsibility Principle,SRP)是面向对象编程中的一项基本原则,它是SOLID原则中的一部分。单一职责原则的核心思想是:’一个类或模块应该有且仅有一个引起它变化的原因。

      简而言之,这意味着一个类或模块应该只有一个职责,只负责一种类型的任务或功能。如果一个类有多个职责,那么它变得不稳定,难以维护,容易引发错误。

  2. 开闭原则(OCP)

    1. "开闭原则"(Open-Closed Principle,OCP)是面向对象编程中的设计原则之一,它是SOLID原则中的一部分。开闭原则的核心思想是:

      软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

      这意味着一个软件实体在不修改其源代码的情况下应该能够通过扩展来添加新的功能或行为。换句话说,应该能够通过添加新的类、模块或函数来扩展软件,而不需要修改现有的代码。这有助于保持现有代码的稳定性和可维护性。

  3. 里式替换(LSP)

    1. 里式替换原则(Liskov Substitution Principle,LSP)是面向对象编程中的一个重要原则,它是SOLID原则中的一部分。里式替换原则由计算机科学家Barbara Liskov提出,其核心思想是:

      子类型必须能够替换其基类型(父类型)而不影响程序的正确性。

      这意味着在使用继承的情况下,子类应该能够完全替代父类,而不引发错误或不一致的行为。简单来说,如果一个类是另一个类的子类,那么它应该具有与父类相同的行为,或者说,子类应该继承父类的所有约定和行为。

  4. 接口原则(ISP)

    1. "接口隔离原则"(Interface Segregation Principle,ISP)是SOLID原则中的一项,它关注的是接口的设计和使用。接口隔离原则的核心思想是:

      一个类不应该被强迫依赖它不使用的接口。

      这意味着接口应该足够小,以便客户端只需了解与其相关的方法,而不需要了解不相关的方法。接口隔离原则的目标是避免“胖接口”(Fat Interface)和“依赖过多”的问题,以提高代码的可维护性和灵活性。

  5. 依赖倒置(DIP)

    1. "依赖倒置原则"(Dependency Inversion Principle,DIP)是SOLID原则中的一项,它关注的是依赖关系的管理和解耦。依赖倒置原则的核心思想是:

      高层模块不应该依赖于低层模块。两者都应该依赖于抽象。

      这意味着在软件设计中,应该将高级别模块(例如,业务逻辑或应用程序逻辑)和低级别模块(例如,具体的实现细节或服务)都依赖于抽象接口或抽象类。高层模块和低层模块都应该依赖于共同的抽象,而不是彼此直接依赖。

我们在进行架构设计时说白了就是通过架构设计时软件系统可以使用尽可能少的人力成本去完成用户需求。而DDD模式主要是为了解决系统老化后,各种业务逻辑混杂,导致维护成本大大增加,明明一个很小的功能往往要花费很高的成本。系统设计的目前就是:高内聚、低耦合。

DDD模式首先需要根据业务情况,把系统划分为多个隔离的领域,领域与领域直接是分隔的,我们把这种分隔叫做 "限界上下文"(Bounded Contexts),领域之内应该要完成充分的自治,领域与领域之间需要通过接口层进行交互,接口层可以表现为:http接口、rpc调用、mq消息的定于 等等。每个领域只能处理自己领域内的事情,领域外的事情应该调用别的领域的接口进行处理。例如:我们可以把一个商城中的订单模块设计为订单领域、商品模块设计为商品领域。那么当用于进行下单扣减库存时,订单领域需要调用商品领域的接口完成实现,而不是之间操作商品库存数据。

边界设计好了之后,根据微服务的设计,个人理解我们可以把这一个个领域划分为一个个微服务。那么在这个大领域内我们也需要按DDD4层架构进行设计。DDD中把系统划分了四个层级分别为:用户接口层、应用服务层、领域层、基础设施层。对于我们之前的MVC架构,我理解是在servcie层面进行了跟细致的划分,为了高内聚、低耦合。

用户接口层,也称为表示层,这是与用户交互的界面层,包括用户界面、Web界面、API等。它主要负责用户输入的接收和显示,以及向应用程序传递用户请求。

应用服务层主要是完成对领域服务的组织和编排完成需求的流程和组织。应用层是业务逻辑的主要驱动者,它负责接收来自用户界面层的请求,协调领域层和基础设施层的工作,并执行具体的应用用例(Use Cases)。应用层通常包含应用服务(Application Services)和应用用例(Use Case)。

领域层就是以实体的维度根据业务要求进行业务实现。领域中的实体是充血模型。什么是充血模型了,如果我们有一个订单类,那么这个类里面只有订单各个字段的各个set get方法,我们把他成为贫血模型。如果我们把订单的业务操作也放入到实体里面,例如:订单的生成、订单的更新、订单的删除、订单相关所有的业务操作都放入到这个订单实体中,那么这个订单实体就称为充血模型。当我们同时要操作多个订单实体的能力,如果同时更新两个订单,这么这项业务能力放在实体里面就不合适了,那么我们需要定义一个服务,去同时操作这两个对象,那么对这个服务我们称之为领域服务。领域层是唯一进行业务逻辑实现的层。领域层的能力往往需要通过基础设施层实现,如果一个写库操作,具体的数据库操作会在基础设施层,那么领域层需要依赖基础设施层接口去完成具体的操作。这个接口类称之为仓库:Repository。 领域层内的实体对象创建往往是比较复杂的,往往我们可以通过工厂去灵活的创建实体对象。领域层是DDD的核心,它包含了领域模型、实体、值对象、聚合、仓库、领域服务等,用于表示应用程序的核心业务逻辑。领域层负责处理领域规则、状态管理和业务规则的执行。

基础设施层包括所有与技术和外部资源交互的组件,例如数据库、消息队列、外部服务、文件系统等。它提供了与这些资源进行通信的接口,并为应用程序提供支持,如数据访问、日志记录、安全性等

DDD.jpg

六边形架构又是啥呢?

六边形架构,也称为端口与适配器架构(Port and Adapter Architecture)或六边形架构模式,是一种软件架构模式,旨在将系统划分为多个不同的层次,并以六边形的形状来表示其结构。这个模式的目标是实现系统的高内聚、低耦合和可测试性,同时使系统更易于扩展和维护。

六边形架构的主要组成部分包括:

  1. 应用层(Application Layer) :应用层是系统的核心,包含了应用程序的业务逻辑和用例(Use Cases)。它负责协调和组织领域层中的领域对象来满足外部请求。
  2. 接口适配器(Interface Adapters) :接口适配器位于系统的外部,与外部世界(用户界面、外部服务、消息队列等)进行交互。接口适配器将外部请求转换为应用层可以理解的形式,并将应用层的响应适配为外部期望的格式。
  3. 端口(Ports) :端口是接口适配器与应用层之间的接口定义,用于定义外部请求如何访问应用层的业务逻辑。端口通常是抽象的,不包含具体实现。
  4. 领域层(Domain Layer) :领域层包含了领域模型、实体、值对象、聚合根、仓库等,用于表示应用程序的核心业务逻辑。领域层负责处理领域规则和业务规则。
  5. 适配器(Adapters) :适配器负责将外部依赖(例如数据库、外部服务、文件系统)适配为应用程序可以使用的形式。适配器包含了与外部依赖交互的具体实现。
  6. 依赖关系:依赖关系通常是从外部适配器指向应用层和领域层,表示外部请求通过适配器进入系统,然后由应用层和领域层处理。

六边形架构模式的核心思想是将核心业务逻辑(领域层)与外部依赖(接口适配器和适配器)分离开来,使系统更易于测试、扩展和维护。这种分离也有助于将外部依赖的变化隔离在适配器中,不会对核心业务逻辑造成影响。

这个模式的名字来源于图形表示,其中中心的应用层和领域层被描绘为六边形的中心,而外部接口和适配器则位于六边形的边缘,形成了一个六边形的形状。这种图形表示有助于清晰地理解架构的结构。六边形架构也与领域驱动设计(DDD)和依赖倒置原则(Dependency Inversion Principle)紧密相关。

六边形和DDD的关系是什么,我理解6变形架构 和 DDD设计模式 有相同之处,叫法不同其核心都是为了 高内聚、低耦合。

端口:DDD中的接口层

Adapters :可以理解为接口层中VO->DTO的转换

应用层:应用服务层

领域层:领域层

适配器:基础设施层

DDD2.jpg

因为DDD模式往往需要较大的人力成本,比较适合核心和复杂的业务。而MVC这种清晰的分层模式往往效率比较高,适合非核心业务。我们在架构设计可以考虑这两种架构结合使用。需要考虑根据业务进行架构设计。技术本身需要适配业务才有其价值。架构的核心就是以最小的人力成本完成业务需要,适合的架构设计 需要考虑 成本 系统老化 人员能力 等各方面因素,不能一概而论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念,为了更好地服务于客户…

文献速递:基于SAM的医学图像分割---阶梯式微调方法,用于整合补充网络的自适应矩估计(SAM)

Title 题目 Ladder Fine-tuning approach for SAM integrating complementary network 阶梯式微调方法,用于整合补充网络的自适应矩估计(SAM) 01 文献速递介绍 医学图像分割在医疗保健中扮演着至关重要的角色。它旨在使用各种医学成像方式…

MS2574/2574T/2574S高速、四通道差动线路驱动器

品简述 MS2574/MS2574T/MS2574S 是一款高速、低功耗的四通道 差动线路驱动芯片,用于平衡或非平衡的数字数据传输。可 以满足 ANSI TIA/EIA-422-B 和 ITU (原 CCITT )建议 V.11 的要求。 三态输出可提供用于驱动双绞线或平行双线传输线路等…

公司购买阿里云服务器多少钱一年?199元2核4G5M配置

阿里云服务器ECS u1实例,2核4G,5M固定带宽,80G ESSD Entry盘优惠价格199元一年,性能很不错,CPU采用Intel Xeon Platinum可扩展处理器,购买限制条件为企业客户专享,实名认证信息是企业用户即可&a…

基于机器视觉的太阳能电池片异物遮挡检测含数据集

分享链接见文末 近年来,随着太阳能发电技术的快速发展,太阳能电池片的应用越来越广泛。然而,太阳能电池片在实际运行过程中常常会受到各种异物的遮挡,如树叶、灰尘等,导致发电效率下降甚至损坏设备。因此,…

python 基于 websocket 的简单将视频推流到网页

本来有一台设备是要搞成无线的形式的,设备的摄像头的数据可以在一台局域网连接的平板上查看,因为试着使用 RTMP 推流,感觉延时太大了,而 Webrtc 感觉有太麻烦了,所以一开始看到这篇文章使用 UDP 协议进行推流&#xff…

竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…

“比特币跌至8900美元”?逢低买入信号闪现!亚洲投资者需求正持续增长!

3月19日,美股三大指数集体收涨,美联储正在召开为期两天的货币政策会议,周三公布结果,市场普遍预计美联储将按兵不动。 然而,比特币近几日却面临显著的价格回调,昨早再次从6.7万美元水平快速下滑&#xff0c…

学习vue3第九节(新加指令 v-pre/v-once/v-memo/v-cloak )

1、v-pre 作用:防止编译器解析某个特定的元素及其内容,即v-pre 会跳过当前元素以及其子元素的vue语法解析,并将其保持原样输出; 用于:vue 中一些没有指令和插值表达式的节点的元素,使用 v-pre 可以提高 Vu…

【Linux】shell命令运行原理---认识Linux基本指令

主页:醋溜马桶圈-CSDN博客 专栏:Linux_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.shell命令以及运行原理 1.1 shell命令 1.2 Linux内核权限 1.3 图示Linux shell和bash的区别 2.认识Linux基本指令 2.1 指令的…

选马桶别再犯错,这7点要注意!福州中宅装饰,福州装修

在众多卫浴品牌中,各种型号尺寸和性能的马桶更是层出不穷,在选购的时候总是陷入难题,那么接下来就给大家讲讲马桶应该怎么选购: ①高效冲水系统:高效的冲水系统,不仅能确保每一次冲洗都干净彻底&#xff0c…

【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

本文通过docker-compose构建一个单体的rabbtimq容器。 1,docker、docker-compose环境 首先需要有docker和docker-compose环境,docker安装[1],docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 [root192 ge…

春暖花开,一起来看看2024年品牌春分海报吧!

春分(Vernal equinox)已至,春花烂漫、燕子归来、百草回芽。 今天我们要分享的是2024年品牌发布的春分节气海报合集,快来随我们一起感受这昂扬、蓬勃的春意吧! (1)泸州老窖 (2)BD…

语义分割基础知识

1、什么是语义分割 目标检测: 检测出图像中目标位置和类别,使用锚框框出目标位置 实例分割: 将前景物体分割开来,并且每一个物体有不同的id(颜色) 语义分割: 和实例分割相似,但…

nginx介绍及搭建

架构模型 Nginx是由一个master管理进程、多个worker进程组成的多进程模型。master负责管理worker进程,worker进程负责处理网络事件,整个框架被设计为一种依赖事件驱动、异步、非阻塞的模式。 优势: 1、充分利用多核,增强并发处理…

Python快速导入id至json文件(2024.3.19)

Python实现id导入至json文件 2024.3.19 需求分析1、输入数据介绍1.1 三个.txt文件1.1.1 computers.txt(计算机)1.1.2 cameras.txt(摄像头)1.1.3 monitors.txt(显示器) 1.2 单个.xlsx文件 2、实现思路3、Pyt…

软考81-上午题-【面向对象技术3-设计模式】-行为型设计模式01

一、行为型设计模式一览 二、责任链模式 2-1、意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 1-2、结构 1-3、代码实现 1-4、适…

基于python的4s店客户管理系统

技术:pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

一文带你详解天池电商数据集

行业介绍: 淘系技术部隶属于阿里巴巴新零售技术事业群,支撑淘宝、天猫核心电商以及闲鱼、躺平等创新业务,服务9亿用户,赋能各行业1000万商家。 淘系技术打造了全球领先的线上新零售技术平台,并作为核心技术团队保障了…

常用大数据组件的Web端口号总结

常用大数据组件的Web端口号总结 网站访问方式 在地址栏中输入虚拟机名称对应组建的Web端口号,回车访问。 常用大数据组建的Web端口号 Hadoop HDFS:9870Hadoop YARN ResourceManager:8088JobHistoryServer:19888 Zeppelin&…