论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
云原生
›
最新范畴驱动架构(DDD)建模中的模型到底是什么?,廖 ...
最新范畴驱动架构(DDD)建模中的模型到底是什么?,廖师兄springcloud视频 ...
万万哇
金牌会员
|
2024-12-17 11:07:35
|
显示全部楼层
|
阅读模式
楼主
主题
833
|
帖子
833
|
积分
2499
最后
ActiveMQ消息中间件口试专题
什么是ActiveMQ?
ActiveMQ服务器宕机怎么办?
丢消息怎么办?
长期化消息非常慢怎么办?
消息的不匀称消耗怎么办?
死信队列怎么办?
ActiveMQ中的消息重发时间隔断和重发次数吗?
ActiveMQ消息中间件口试专题剖析拓展:
redis口试专题及答案
支持同等性哈希的客户端有哪些?
Redis与其他key-value存储有什么差别?
Redis的内存占用环境怎么样?
都有哪些办法可以低沉Redis的内存使用环境呢?
查察Redis使用环境及状态信息用什么下令?
Redis的内存用完了会发生什么?
Redis是单线程的,怎样提高多核CPU的利用率?
Spring口试专题及答案
谈谈你对 Spring 的理解
Spring 有哪些优点?
Spring 中的设计模式
怎样开启注解装配以及常用注解
简单介绍下 Spring bean 的生命周期
Spring口试答案剖析拓展
高并发多线程口试专题
如今有线程 T1、T2 和 T3。你怎样确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么上风?如果让你实现一个高性能缓存,支持并发读取和单一写入,你怎样包管数据完整性。
Java 中 wait 和 sleep 方法有什么区别?
如安在 Java 中实现一个阻塞队列?
如安在 Java 中编写代码办理生产者消耗者问题?
写一段死锁代码。你在 Java 中怎样办理死锁?
高并发多线程口试剖析与拓展
jvm口试专题与剖析
JVM 由哪些部分组成?
JVM 内存划分?
Java 的内存模型?
引用的分类?
GC什么时候开始?
JVM口试专题剖析与拓展!
本文已被CODING开源项目:【一线大厂Java口试题剖析+核心总结学习条记+最新讲解视频+实战项目源码】收录
需要这份体系化的资料的朋侪,可以点击这里获取
订单=客户+商品信息
维修单=客户+商品信息+维修信息
客户=名字+电话
这里,维修单模型内里似乎包罗了一个完整的订单(客户+商品信息),为什么不直接复用订单呢?也许是因为维修部分也负责别的地方购买的商品。别的,客户的名字和电话更新之后,是不是要直接修改已经完成的订单和维修单呢?值得商椎,已经完成的信息不应该有料想之外的变化。另有,如果客户是一个单独的模型,那么背后的团队会是怎么样呢?需要仔细考虑。
当数据模型可以完全覆盖业务需要,建模也就初步完成了。
那么,为什么要建模?第一,要把心智模型提取出来,显性化,让差别的人对业务的理解达成同等;第二,要归类复用,避免重复的工作,让人可以关注更高层面的变乱。
如前面所示,即便是建立简单的模型,我们也需要诸多考虑。把这些需要考虑的点体系化,就引出了下一个问题:怎么建模才公道?
怎么建模才公道
判断模型好坏的重要依据是它的使用服从(扩展度、机动度、与构造的对应度),以是建模的公道性也围绕这个来睁开。
为了形成高扩展度、高机动度并且顺应康威定律的模型,Eric Evans 汇总并命名了DDD这种方法论。它的独特之处,是它认可了“人”这种生物在做抽象过程中的一些必然缺憾,并且提出了一些办理方案。
首先,它明确指出了“自然语言”这个工具的不正确性。其次,它明确指出了人在设计和实现上的抵牾性,即:人类的预测本领很差,以是我们拥抱变化;但同时,我们不能纯寄希望于误打误撞地演化出一个好效果,应该提前深思熟虑地做好设计,再辅之以小的改进。
语言的不正确性,可以用“普通话”(Ubiquitous Language)来办理,即大家在讨论任何东西之前先规范语言,同一词汇的定义。兼顾稳固和机动的设计,则由精良的分层来做到。
DDD把模型分成四层。
·Ul层,负责界面展示。
·应用层(Application Layer),负责业务流程。
·范畴层(Domain Layer),负责范畴逻辑。
·基建层(Infrastructure Layer),负责提供基建。
分类的依据是:越往上,预期变动越频察;越往下,预期变动越少。
对于步调员来说,UI和基建应该很轻易分清,一个只管展示,一个只管提供持续储存、网络传输等等基础办法,都没有“业务”的加入。轻易混淆的是应用层和范畴层,在这两层中存在的,就是应用模型和范畴模型。
这就引出了下一个问题:到底什么是范畴模型?
什么是“范畴”模型
按DDD的定义,范畴模型应该捕捉“业务规则”或者“范畴逻辑"(business rules/domain logic),而应用模型则捕捉“应用逻辑”(application logic)。
模型属于哪一层,有个粗略的判断方式。如果是一个实体(entity)和针对实体的增删改查,就属于范畴层;如果是一个场景,比如出如今UI菜单上的选项,就属于应用层。
比如:账单,用户,编辑商品,编辑库存,这些是范畴层;“购买商品”,则是应用层。
前者是针对实体的操作。每一个实体都只有增删改查如许的操作。与之相反的是,要完整实现“购买商品”这个场景,也许需要检查库存、创建订单、创建交易等多个操作。
如许看来,范畴模型就像是数据库的表。不过,除了字段定义之外,范畴模型还需要有范畴逻辑。关系型数据库通常可以部分实现范畴逻辑,比如使用外键、自增ID等等,但是更为复杂的范畴逻辑则需要用代码来实现。比如,在创建订单的时候,需要扣除相应数目的库存;当订单失效,则需要规复库存。
我们可以从两个方面理解范畴逻辑。
第一,范畴逻辑就是显性的专业知识,是相对轻易理解和学习的部分。买了东西要给钱,出了货要扣库存,飞机来了要腾跑道,炮弹来了要拦截,这些都是专业知识中符合逻辑,可以很轻易地推导和学习。与之相对的是隐性的专业知识,或者Martin Fowler 所说的“业务非逻辑"(business illogic),指的是逻辑很难推论的软知识,与人相关的部分,与不可抗拒的、稀奇古怪的意外环境相关的部分。
第二,范畴逻辑是提纯、通用的规则。不管是买手机、买房、买汽车,都会有创建订单、创建交易如许的零售范畴模型,它是高度提纯、通用的。如果我们需要去修改范畴模型,阐明我们已经进入了另一个范畴。此外,规则的存在是为了维护某个事物,这个事物,就是范畴模型的正确、完整性。对范畴模型的正常操作,总会给我们一个“合规”的范畴。
不管我们怎么去玩弄订单、交易、商品模型,增删改查,乱搞一通,最后出来的效果都应该符合规则。创建订单的时候,订单模型会尝试减库存,成功,则创建,失败,则不允许创建,云云云云。
最后出来的效果不会有逻辑问题,比如订单上的商品不存在,或者交易对应的订单不存在。
当然,范畴模型只管“合规”,但不管“公道”。大型超市里,一位收银员决定把全部货品下架,这是否公道?这个不属于范畴模型关心的范围,范畴模型只知道,要把货品库存的位置从货架转移到堆栈,目标堆栈必须有能存放这个货品的空位,转移完毕时从货架的可用空间中减去货品的巨细。至于谁做,为什么做,能不能做,这么做合不公道,(通常)不在范畴层的关心范围,而是放到应用层去做。
在前面的例子中,如果一个客户在黑名单中,不允许购买,那么这个检查,通常是在应用层去检查。如许,我们就可以很轻易地复用范畴模型或者调解应用规则,而不至于把易变的应用规则混到稳固的业务规则里去。
模型的设计和实现
那么,DDD的模型属于业务形貌还是代码、数据库定义?作者想表达的意思很明确,二者都是。好的业务形貌应该能非常好地对应到代码,代码也应该以最清晰地方式来呈现业务形貌。当然,转换和适配肯定不可少,毕竟有先例摆在那。想要达到设计即代码的UML,尸体都还是温的。
设计和实现的最佳契合点,实在就在“界面”之中。“界面”这个名字自己已经表现了这层意思。以是,建好的模型,和暴露出来的界面、接口,应该有相当高(或者完全同等)的对应关系。这个界面,可能是一个类的公开成员函数,也可能是一个微服务上暴露出来的RESTful接口,或者是一个公开的普通WebAPl,都没有差,只要和设计符合就行。
最后,总结起来,就是:
DDD把业务分成UI、应用、范畴、基建四层,其核心是高度提纯、通用、少变化的范畴层,是谓“范畴驱动";
范畴层中包罗范畴模型,捕捉范畴逻辑,暴露出接口用于操作范畴模型,这些接口提供的操作可以确保范畴是自治的;
范畴模型既是业务形貌,又是代码实现的布局设计,二者的结合点在于公开出来的界面、接口。
范畴模型的特点
总结一下,范畴模型具有如下的特点:
范畴模型是业务概念的可视化形貌,是需求分析的产物
范畴模型用于引导步调设计,但范畴模型与实现方式无关,范畴建模时不应该考虑怎样实现
范畴模型需要同项目全部成员(客户、项目经理、开发、测试…)达成共识
怎样画范畴模型
(1)找出用例模型中的名词,
(2)然后识别这些名词自己的相关信息,
(3)以及名词之间的相互关联关系,
(4)用UML画出范畴模型。
第一步:找出用例模型中的名词
原有用例如下,用蓝色加黑标出名词(重复的就不标了):
1)顾客携带商品到收银台;
2)收银员扫描商品条形码;
3)体系根据条形码获取并显示商品信息;
4)收银员重复2~3步,直到全部商品扫描完毕;
5)体系盘算商品总额;
。。。。。。。。。。。。。。。。。。。。
n)体系打出商品清单,完成交易。
这个用例中的名词有“顾客”、“商品”、“收银台”、“收银员”、“商品条形码”、“体系”、“商品信息”、“商品总额”、“商品清单”、“交易”。稍加整理:
1)“顾客”、“收银员”是体系的外部对象,不需要我们进行设计,但这些对象要和体系进行交互;
2)“商品”、“商品条形码”、“商品信息”、“商品总额”、“商品清单”、“交易”是范畴对象,但“商品条形码”、“商品信息”可以算作“商品”的属性、“商品总额”可以算作“交易”的属性,最后从这个用例总结出来的范畴对象有“商品”、“商品清单”、“交易”三个。
总结
总体来说,如果你想转行从事步调员的工作,Java开发肯定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件气力才是拿高薪的唯一手段。
如果你以这份学习门路来学习,你会有一个比力体系化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程头脑》、《Java核心技能》这些册本,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又黑白常有劳绩的事了。
本文已被CODING开源项目:【一线大厂Java口试题剖析+核心总结学习条记+最新讲解视频+实战项目源码】收录
需要这份体系化的资料的朋侪,可以点击这里获取
以看一些视频来学习,当自己能上手再买这些书看又黑白常有劳绩的事了。
[外链图片转存中…(img-AoX6fSgV-1715686993917)]
本文已被CODING开源项目:【一线大厂Java口试题剖析+核心总结学习条记+最新讲解视频+实战项目源码】收录
需要这份体系化的资料的朋侪,可以点击这里获取
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
万万哇
金牌会员
这个人很懒什么都没写!
楼主热帖
markdown day 01
基于CSDN云和docker全家桶的微服务项目 ...
Nacos注册中心-----从0开始搭建和使用 ...
Linux系统调用四、lseek()函数详解 ...
ClickHouse(05)ClickHouse数据类型详解 ...
【云原生】Docker 进阶 -- 数据卷使用 ...
谈谈技术能力
100天精通Python(进阶篇)——第39天 ...
阿里云域名购买流程以及免费证书的申请 ...
redis for windows 7.0.2安装包全网首 ...
标签云
挺好的
服务器
浏览过的版块
前端开发
快速回复
返回顶部
返回列表