DDD领域驱动设计

DDD 领域驱动实践

  • 业务初期由于业务简单 只要简单的crud就可以满足。这个时候系统功能是清晰的。但是随着疯狂的迭代 不断的业务演化。业务逻辑越来越复杂。系统也越来越冗余。模块彼此关联。资深业务开发也很难说清楚这一块会涉及到什么功能。
  • 这个时候要基于这个版本去做迭代 需要花费大量的时间去做回溯。更加不要提如果更新带来的不可预知的影响面。
  • 如果PM没有考虑这个点 开发去开发的时候 会+额外大量的工作量。
    在这里插入图片描述
    订单服务提供了查询 创建订单等订单核心功能。也提供了订单评价、支付、保险的入口。然后我们的表也是个订单大表,包含了非常多的字段。在我们维护代码时,改动一个地方就会导致一些莫名的问题。很可能就是想改动评价 但是却影响到了下单。虽然可以通过测试保证功能 这样带来的问题就是 测试工作量加大 + 开发并行的时候 改动重叠 从而恶性循环。

有一种解决方案

按照演进式设计理论。让系统的设计随着系统实现的增长而增长。不需要提前做设计,让系统随着业务成长而演进。敏捷实战中的重构 TDD以及持续集成可以对付各种混乱问题。

  • 重构-保持行为不变的代码改善清楚了不协调的局部设计
  • TDD 确保对系统的更改不会导致系统丢失或者破坏现有功能
  • 持续集成 为团队保证了同一个代码库

三种实践中,重构是克服演进式设计中大杂烩问题的主力。通过在单独的类以及方法级别上做一系列小步重构来完成。我们可以很容易重构出一个独立的类来放某些通用的逻辑。但是你会很难给她一个业务上面的定义。只能给予一个解决维度的含义。这带来的问题就是新接手的人或者说新同学并不一定知道对通用逻辑的改动和获取来自该类。很明显 在代码整洁之道里面的腐败的味道。。

事实上,你可能意识到问题之所在。在解决现实问题的时候,会将问题映射到脑海中的概念模型,在模型中解决问题,再将解决方案转换为实际的代码。上述问题在于我们解决了设计到代码之间的重构。但是提炼出来的模型并没有实际的业务含义。这代表着在开发新需求的时候,其他人不能很自然的将业务问题映射到模型中。这样的设计就好像重构者的自娱自乐,代码继续腐败,然后重新重构。。。无休止的循环

用DDD可以很好的解决领域模型到设计模型的同步演化 最后再将反映了领域的设计模型转换为实际的代码
模型代表着解决实际问题抽象出来的概念模型
领域模型代表与业务相关的事实
设计模型代表要构建的系统

贫血症和失忆症

贫血领域模型:贫血领域对象 是指仅用做数据载体 而没有行为和动作的领域对象

传统的MVC分层模式。会很自然的写出过程代码。而学到的很多关于OOP理论的也毫无用武之地。使用这种开发方式,对象只是数据的载体,没有行为。以数据为中心,以数据库ER设计为驱动。实现的是对数据的查询 移动 处理 展示的过程。

以抽奖实现展开

场景:奖池里配置很多奖项,事先按照要求配置中奖概率。实现大概就是生成一个randomNum 匹配该随机数生成概率。

设计奖池和奖项的库表配置。实现业务逻辑。实现简单直接跳过。在service里面写业务逻辑。按照正常是没问题的。
简单的业务系统采用这种贫血模式和过程化设计是没有问题的。但是当业务逻辑复杂了,业务逻辑、状态会散落在大量方法中。原来的代码意图不明确。我们将这种称为贫血引起的失忆症。

更好的是采用领域模型的开发方式,将数据和行为捆绑在一起。并且和现实世界中的业务对象相映射

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习目标检测】九、基于yolov5的路标识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型,其具有以下几个优势: 1. 高精度:YOLOv5相比于其前身YOLOv4,在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进,如更深的网络结构、更多的特征层和更高分辨率的输入图…

金融数据可视化大屏,开启数字时代的金融新篇章

随着数字化时代的到来,金融行业的数据量正在迅速增长。如何有效处理、分析和呈现这些数据,成为了一个亟待解决的问题。而金融数据可视化大屏的出现,正是为了解决这一问题,让金融行业的数据处理和分析更加直观、高效。 一、金融数据…

网络的发展历史,ip地址

TCP/IP 是获得最广泛支持的通信协议集合 包含了大量internet应用的标准协议 -支持跨网络架构,跨操作系统平台的通信 主机与主机之间通信的三个要素 1.ip地址(ip address) 2.子网掩码(subent mask) 3.ip路由(ip router) ip地址: 作用:用…

实时时钟(RTC)的选择与设计:内置晶体与外置晶体的优缺点对比

实时时钟(RTC)作为一种具备独立计时和事件记录功能的设备,现已广泛应用于许多电子产品中,并对时钟的精度要求越来越高。根据封装尺寸、接口方式、附加功能、时钟精度和待机功耗等因素进行分类,市场上有各种种类的RTC产品可供选择。 而在设计…

webpack知识点总结(基础应用篇)

一、为什么需要webpack 1.为什么使用webpack ①传统的书写方式,加载太多脚本会导致网络瓶颈,如不小心改变JavaScript文件加载顺序,项目会崩溃,还会导致作用域问题、js文件太大无法做到按需加载、可读性和可维护性太低的问题。 ②…

node.js mongoose中间件(middleware)

目录 简介 定义模型 注册中间件 创建doc实例,并进行增删改查 方法名和注册的中间件名相匹配 执行结果 分析 错误处理中间件 手动抛出错误 注意点 简介 在mongoose中,中间件是一种允许在执行数据库操作前(pre)或后&…

数据结构(Chapter Two -02)—顺序表基本操作实现

在前一部分我们了解线性表和顺序表概念,如果有不清楚可以参考下面的博客: 数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客 首先列出线性表的数据结构: #define MaxSize 50 //定义顺序表最大长度 typedef struct{ElemType data…

Next.js 学习笔记(三)——路由

路由 路由基础知识 每个应用程序的骨架都是路由。本页将向你介绍互联网路由的基本概念以及如何在 Next.js 中处理路由。 术语 首先,你将在整个文档中看到这些术语的使用情况。以下是一个快速参考: 树(Tree):用于可…

制造企业可以通过哪些措施改善设备OEE

设备综合效率OEE(Overall Equipment Effectiveness)是制造企业衡量设备效率的关键指标之一。高效的设备运行对于提高生产效率、降低成本和实现竞争优势至关重要。然而,实现高水平的设备OEE并不是一项简单的任务。本文将介绍一些制造企业可以采…

QT绘图类 QPixmap、QImage、QPicture、QBitmap

前言 绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap、QBitmap、QImage和 QPicture。其中: QPixmap是为在屏…

广州华锐互动 | VR稀有金属冶炼业职业危害教学系统

虚拟现实(VR)技术在许多领域都得到了广泛的应用,其中包括职业病危害培训。对于稀有金属加工场所来说,VR技术可以提供一种全新的、高效的培训方式,帮助员工了解和预防职业病的危害。 传统的职业病危害培训通常需要大量的…

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…