一、领域驱动设计核心思想与设计过程

news2024/12/23 15:56:22

一、软件发展的必然规律

1、软件是对真是世界的模拟,但真实世界软件十分复杂。
2、人在认识真实世界的时候总是有一个从简单到复杂的过程
3、软件需求的变更成为一种必然的事情,并且总是由简单向复杂转变
4、初期软件的业务逻辑十分简单清晰命令,慢慢变得越来越复杂

二、复杂软件和简单软件

1、简单软件设计的时候有简单的方法,复杂的有复杂的方法(设计模式)
2、但是当刚开始是简单软件,需求变更的时候,我在原来简单设计的方法里塞代码,而不是演进到复杂软件的类设计,那么就会腐化。

三、高质量代码和软件退化

1、需求变更---->扩展,解耦---->实现需求—>高质量代码
2、需求变更----->没有调整------>实现需求----->软件退化

四、两顶帽子的设计方法

1、在不添加新代码的前提下,重构代码,以适应新功能
2、实现新功能
例子:假如 A 使用的时候 需要调用B ,B需要调用C,C需要调用D。那么A使用的成本会很高,耦合性很强。
A---->B----->C----->D
我们希望在应用A的时候不要强依赖:B,C,D解耦
抽取出一个B的接口B’,那么变更就会变得容易了。
A—B‘–>B---->C----->D
把需要变更地方的抽取成接口,然后第一个实现是过去的实现,新的实现是为了新的需求而做的实现,以此来应对变更。这个接口叫做可扩展点。

3、难点:是在第一点,重构。第一次第二次可能还能想清楚变更说明,如果迭代了十几轮,就很难想清楚了,就不知道怎样变得设计质量更高,维护成本更低了。所以需要一个变更的的指导方法。

五、领域模型及建模思想

1、领域驱动思想的本质:

软件的本质是对真是世界的模拟,把软件设计和真实世界对应起来,真实世界是什么样子的,软件就是什么样子的。当遇到新的需求变更的时候,我们先把新的需求放在真实世界里。无论找到多少轮的变更,我们都能找到设计。

2、如何将软件世界和真实世界对应起来?

①现实世界有什么事物—>软件世界就有什么对象
②现实世界这些对象有什么行为—>软件世界这些对象就有什么方法
③现实世界这些对象是什么关系—>软件设计这些对象就有什么关联

把这三个对应关系,制作成一个领域模型,再由这个领域模型,指导我们的开发。当我们遇到需求变更,先回到领域模型,领域模型对应的是真实世界,真实世界是什么样子的,通过真实世界先修改领域模型,然后通过领域模型指导程序的修改。

3、在领域模型里绘制的都是业务,业务和技术严格区分,不包含技术的事情。

当落实到设计开发的时候再考虑技术。因为技术是在一致变化的,但是业务是不变的,一个业务可以由不同的技术实现。当我们修改的时候,修改的是领域模型里的业务,当我们的系统越来越复杂的时候, 我们复杂的系统就是对现实世界抽象出来的业务。那么再业务上的变更会更加清晰。

4、案例:下单付款场景:

领域驱动设计过程:领域建模过程—>领域模型指导数据库设计---->领域模型指导软件设计

①原始需求:

用户付款功能:
Ⅰ、用户下单以后,经过下单流程进入付款功能
Ⅱ、通过用户档案获取用户名称,地址等信息
Ⅲ、记录商品及数量,并汇总付款金额。
Ⅳ、保存订单
Ⅴ、通过远程调用支付接口,进入支付功能。

②第一个版本的领域模型

在这里插入图片描述

③第一个版本的程序设计

在这里插入图片描述

在这里插入图片描述

④增加商品折扣功能

Ⅰ、限时折扣
Ⅱ、限量折扣
Ⅲ、对某类商品进行折扣
Ⅳ、对某个商品进行折扣
Ⅴ、不折扣

⑤坏味道:直接写代码

在这里插入图片描述

⑥再第一个版本的领域模型去分析

在这里插入图片描述

⑦思路:SRP,单一职责原则:一个职责是软件变化的一个原因。

⑧如何分析付款和折扣两者的关系

付款发生变化的时候,折扣一不一定变化。折扣变化的是,付款一不一定变化。
如果为否,那么付款和折扣就是软件变化的两个不同原因,因此把折扣写入付款就不合适了。
同理,限时折扣发生变化的时候,限量折扣一定变化么,某个商品折扣,某个商品折扣,不折扣一定发生变化么。我们发现不同类型的折扣也是软件变化的两种不同原因,所以,写在一个类里也不合适。

⑨第二个版本的领域模型设计

那么以后付款发生变更,和折扣变更没有干系,折扣变化也和付款变化没有关系。
在这里插入图片描述

⑩第二个版本的设计实现

在这里插入图片描述

领域驱动设计真正发挥优势:日后的维护,需求不同提取,系统在不断的变更,如何在新系统变更中维护系统。
新项目使用领域驱动设计,为了在日后的维护过程中,进行正确的设计,帮助我们维护。第一次开发并不一定能有用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言画直方图

前言 最近在看K&R的《C语言程序设计语言》这本书,第一单元的练习13要求画一个统计单词长度的直方图,这里忽略了计算单词长度的代码,假设已知单词长度存入一个digit数组中,根据这个数组画水平直方图和垂直直方图。实话说&…

C++11新特性-原始字面量

当我们书写文件路径的时候,会发现,文件路径无法正确输出,如下: 这是因为反斜杠本身就是转义的意思,如果想要输出反斜杠则需要两个反斜杠,如下: 当然这只是其中一种解决方法,还有一种…

实战项目如何抵御即跨站脚本(XSS)攻击

一、XSS攻击的危害 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、Flash或者甚至是…

思派健康通过上市聆讯:F轮估值17亿美元 腾讯是大股东

雷递网 雷建平 12月3日思派健康科技日前通过聆讯,准备在香港上市。思派健康早在2021年8月就已经递交招股书,这是时隔一年多后,这之前第三次递交招股书。这也意味着,时隔一年多后,思派健康终于要上市了。上半年亏损3.5亿…

SpringSecurity(八)【会话管理】

八、会话管理 简介 当浏览器调用登录接口登录成功之后,服务端会和浏览器之间创建一个会话(Session),浏览器在每次发送请求时都会携带一个 SessionId,服务端则根据这个 SessionId 来判断用户身份。当浏览器关闭之后&…

从硬件角度看服务器性能调优

bios整体配置bios系统设置Hyper Thread开启超线程,设置后lscpu命令Thread(s) per core 值显示为 2。超线程可以理解为CPU的虚拟化,一颗物理CPU并行执行两条流水线指令。确认处理器基本频率及睿频频率,部分处理器基础频率低,但是睿…

看完了你还能不懂JAVA内存模型(JMM),我输了

前言 开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。 Slf4j(topic "c.VolatileTest") public class VolatileTest { static boolean run true; public static void main(S…

基于Java+Swing实现《扫雷》游戏

基于JavaSwing实现《扫雷》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本程序参考《扫雷》的规则进行了简化,用java语言实现,采用了swing技术进行了界面化处理,设…

基于蚁群算法求解运钞车路径规划问题(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

[附源码]JAVA毕业设计桔子酒店客房管理系统(系统+LW)

[附源码]JAVA毕业设计桔子酒店客房管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

vue app开发调用原生方法实现权限访问授权处理(一)

vue app开发调用原生方法实现权限访问授权处理 前提:在写代码之前应该想清楚调用原生安卓、ios的方法,就应该遵循双端的方法规则,调用方法时应该注意,在这里先主要介绍一下注意事项: 根据App发布应用市场的要求&…

【sciter】安全应用列表控件总结

一、效果图 二、功能点 实现电脑文件拖拽进入到安全桌面,读取文件路径,生成应用。可以配置允许拖拽进入安全桌面的文件应用。点击添加图标,可以添加应用到安全桌面中。在安全桌面列表中每一个应用实现双击、失去焦点,获取焦点、右键事件在安全桌面列表中每一个应用可以实现…

[附源码]计算机毕业设计springboot疫情防控平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

HTML5期末大作业:用DIV+CSS技术设计的网页与实现(剪纸传统文化网页设计主题)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

二本土木工程管理毕业5年,零基础转型大数据开发,收割长沙深圳多个大数据offer...

点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接,进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群分享一位学习群同学的转型经历,他是二本土木类工程管理专业,17年毕业,毕业后在长沙工地从事了…

Java基于springboot+vue的汽车饰品销售购物商城系统 前后端分离

开发背景 随着我国科技和经济的发展,我国的汽车数量也越来越多,基本家家户户都拥有了自己的汽车,为了让汽车用起来更加的舒心,于是各类琳琅满目的汽车饰品也出现了。大多数时候人们在购买汽车饰品的时候都回到这些专卖店购买&…

C++之面向对象

目录 对象与类 类的语法: C中class与struct的区别: 通过类实例化对象的方式 具体案例 类作用域与分文件编写 创建circle.h头文件 创建源文件circle.cpp 创建all.cpp来作为程序的入口 封装 封装的意义 访问权限符 成员属性私有化 优点 具体…

Python解题 - 括号上色(递归)

题目 小艺酱又得到了一堆括号。括号是严格匹配的。现在给括号进行上色。上色有三个要求: 1、只有三种上色方案,不上色,上红色,上蓝色。 2、每对括号只有一个上色。 3、相邻的两个括号不能上相同的颜色,但是可以都不上色…

【Java面试指北】Exception Error Throwable 你分得清么?

读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么? 你的反应是不是像下面一样呢? 你在写代码时会经常 try catch(Exception)在 log 中会看到 OutOfMemoryErrorThrowable 似乎不常见&#xff0c…

为什么大部分人做网赚是赚不到钱的,这才是真正的原因!

说实话,互联网已经发展到现在的水平,目前来看,互联网上只存在两种平台,一种是社交平台,一种是内容平台。 所有的抖音、知乎、小红书、搜索引擎、淘宝等等这些都是内容平台,如果你想要解决精准流量问题&…