要做一个关于DDD的内部技术分享,记录下用到的资源,学习笔记(未完)

最后更新于2023年3月31日 20:15:17

问题建模=》软件分层=》具体结构,是层层递进的关系。有了问题建模,才能进行具体的软件分层的讨论,再有了分层,才能讨论在domain里面应该怎么实现具体结构。

1、问题建模:Domain、Model、Domain Model

  • 怎么获得精确的领域建模?通用语言、程序员和业务专家的好的沟通。

领域驱动设计中的领域模型是什么? 这里面说的挺对的,领域模型是处理问题的条理化和结构化的知识,而领域本身就是问题/就是需要解决的业务。对甲方的需求的分析(甲方公司的需求、业务、规则、流程等)组成了domain。
先有了领域模型这个东西,再将领域模型转化为具体的代码,而代码的转化就要分什么用户界面/展现层、应用层、领域层、基础设施层,再往下才是具体的设计,什么实体、值对象之类的。
在这里插入图片描述
Domain and Core Domain in DDD 这是一个系列,看着也都不错。包括了限界上下文等内容。

限界上下文&通用语言

看起来它是对前一小节完成的领域建模的一个划分。
首先,领域被分为问题领域和解决方案领域,其中解决方案空间由一个或多个限界上下文组成。
在每个限界上下文中,只存在一种通用语言;
同一个词在不同的上下文,表示的意思也不同,比如“Developer”在软件工程(程序员)、房地产(开发商)、化学(显影剂)几个领域的含义不同。
4. 领域驱动设计——限界上下文 在这篇文章里面针对这部分只讲了很小的一点儿,也看不出限界上下文的重要性。

2、软件分层:User Interface、Application、Domain、Infrastructure关注点分离,构造四个概念层

DDD 架構: 分層式架構與依賴反向原則 这个博主讲话真的有够机车的喔!他这个也是稍稍深了一点。
DDD架构的重心是围绕Domain层进行构建的
6. Domain-Driven Design - Layered Architecture 这个挺好的,比较浅。这哥们儿在infrastructure那写的很烂,看得出来是懒得写下去了。写麻了是吧 点开他的个人资料,有一系列文章,应该都不错。

  • User Interface

这一层可能是指前端,但是在一些没有前端的程序中,客户指的是外部的其它系统,于是也可以理解为暴露给外部使用的一些API。
这一层还有传统意义上的controller层的功能,即将传入的request转化为应用程序层的方法调用。
负责为每个服务调用启动事务”是什么勾巴意思?!这里应该跟事务脚本模式有关。

  • Application

几个栗子先,下面这是一个Application层的函数,从上面的文章里头扒的

public void cancelOrder(String username, Long orderId) {// Check authorization on accountOrder order = brokerageAccountRepository.findOrder(orderId);checkAccountAuthorization(getUser(username),order.getAccount().getId(),BrokerageAccountPermission.Trade);// Cancel orderorder.pendingCancel(orderEventPublisher);exchangeTradingService.cancelOrder(order);
}

这个函数做的事情:输入usernameorderId两个值对象,从brokerageAccountRepository这个infrastructure层的对象里identify到唯一的orderDomain=》检查账户的认证状态(这个我也不好说,调用了很多东西,很乱……)=》调用orderDomain来取消订单=》exchangeTradingService里面取消订单,这个不讨论。
根据上面这个函数,总结两点:1、该应用层的函数通过一个值对象,到infra层去检索一个聚合。2、该应用层的函数还能操作这个检索到的聚合,触发一些domain层的事情,就像上面提到的 order.pendingCancel(orderEventPublisher)

  • Domain

这是DDD的重中之重,这个Domain跟建模时候那个Domain是两码事,这个放在第三小节展开了讲。

  • Infrastructure

在这里插入图片描述

3、Domain层

Domain层是整个软件设计的核心部分,展开单独分配一小节来讨论。
参考文章:7. Domain-Driven Design - Domain Layer
这句话说的挺好的:

This layer is the heart of the application. It consists of entities, value objects, domain services and domain events.

  • 实体和聚合的区别

这个写的好:Aggregates & Entities in Domain-Driven Design
举个例子:一个订单purchase order(PO)可能包含多个订单项Line items. 比如说结个婚要包含五金、彩礼、车子、房子啥的,一个道理。 聚合支持更高程度的概念。line items可以单独用,但是没啥意义。而且line items可能粒度太小,太麻烦。
在这里插入图片描述
这个我觉得说的挺好,一个PO是由entity和好多value object组成的一个聚合aggregate。这里面,PO这个entity是这个聚合的根。
业务逻辑被绑定在值对象上,而非实体上,实体更多地用来做identify。
一个聚合可能包含多个实体,比如说一个账户聚合可能包含一个账户实体和多个交易实体,通过定义事务边界来涵盖一个客户的存款/取款动作。

  • identify是啥意思

identify是啥意思:ChatGPT查了一下,差不多就是说不管实体中的值对象怎么变化,实体的身份不会变。就好像一个客户,包含电子邮箱、资产啥的都会变,但是客户就是客户,不会变成摩托车或者油轮什么的。
我上面划掉的这句话的理解不太对,identify就像一本书的isbn号似的,唯一确定一个实体。

  • 实体、值对象、聚合、聚合根

GoogleGroup的一个讨论
实体:域内具有重要意义(例如客户)并且可以随时间变化的唯一对象
值对象:域内的不可变对象,在其属性(例如日期、地址)之外没有任何意义
聚合:通过根对象相互关联的实体或值对象的集合
聚合根:“拥有”聚合并充当聚合内所有修改的网关的实体

DDD 戰術設計:Domain Service 这篇文章里有讲到domain service和application service的区别。这篇文章写的比较接地气,但是我觉得它是针对的对这两个概念有一定了解的同学,所以我没看太懂。
如何分辨领域服务与应用服务?
DDD理论学习系列(8)-- 应用服务&领域服务 应用服务属于application层

Practical DDD in Golang: Domain Service这一套文章都很好,收费的

  • 业务逻辑是放在领域对象里面好,还是领域服务里面好

chatGPT的回答供参考:

In Domain-Driven Design (DDD), whether to use a domain object or a domain service to process business logic depends on the nature of the logic itself.
Domain objects should be used to encapsulate behavior that is intrinsic to the object itself. In other words, behavior that is closely related to the object’s state and behavior that should be maintained within the object. For example, a Customer object might have a behavior like “placeOrder” that encapsulates the process of placing an order, and updates the state of the object accordingly.
On the other hand, domain services should be used to encapsulate behavior that doesn’t naturally belong to any particular domain object. These services often have broader responsibilities and may involve multiple domain objects in their operation. For example, a PaymentService might handle the payment process for an order, involving multiple domain objects such as Order, Payment, and Customer.
In summary, use a domain object when the behavior is intrinsic to the object itself and use a domain service when the behavior is not closely related to any particular domain object or involves multiple domain objects.

同样,在上面那个DDD理论学习(8)里面也提到了:

当领域中的某个操作过程或转换过程不是实体或值对象的职责时,我们便应该将该操作放在一个单独的接口中,即领域服务。请确保该服务和通用语言时一致的;并且保证它是无状态的。

这取决于业务逻辑与领域对象的相关性,例如一个客户对象有一个“下订单”的行为,这个行为封装了下订单的处理逻辑+更新了订单状态,则放在领域对象中;一个支付服务可能处理一个订单的支付过程,这里面涉及到了多个领域对象,则放在领域服务中。

  • Domain Event

DDD理论学习系列(9)-- 领域事件 这个系列讲的真是好。
Domain events: Design and implementation 下面有很多讲领域事件的链接。
实现领域事件 我感觉领域事件是DDD跟ES的一个耦合的点,在做技术分享的时候可以很好地从DDD过渡到ES。这个链接里的例子蛮好的,截个图:
在这里插入图片描述
它这个实现了一个简单的注册+登录的demo(spring-boot实现),可以试着改成Golang。
上面这个我有点理解了,就是说saveReply和sendPush可以拆分到不同的领域中,作为不同的listener存在。此时reply这个service就只负责发送一个reply事件到各个listener即可。这些saveReply,sendPush啥的就是领域事件。

  • 其它

What’s the Difference Between an Aggregate and a Bounded Context 这个文章太深了。。。
什么是域逻辑? 这个我也没看明白。。。

4、适用于DDD的设计模式等技术

  • CQRS (Command-Query Responsibility Segregation)

DDD 中的那些模式 — CQRS 我截了一张图放下面了,这个图挺好的。这个就先不放在技术分享里面说了。
直接扒了一张图

  • Event Sourcing 事件溯源模式

Event Sourcing Example & Explained in plain English 源码收费,想给他个大逼斗,给我死。
Why Event Sourcing? 这个是有关于一个叫eventuate local的微服务开源框架的,这一篇有点儿用,剩下都是废话;
记录事件,用replay事件的方式去重组实体entity。作为消息的载体,允许services去订阅这些事件。事件存储是事件驱动结构的支柱。

Event Sourcing 这个太早了。05年的,不一定有用。
将应用程序的状态的所有更改都存储为事件序列……前面都是老调重弹;
Structuring the Event Handler Logic(构建事件处理的逻辑)这个没人提到过:事务脚本/域模型是什么勾巴东西?!
事件逆转:把+10美元变成-10美元,感觉这个水ppt挺有用的……
…………………………还有一些奇怪的点,都看完估计我就困了,主要看示例吧。

Event Sourcing in Go 写的不好,都是代码片段,不看了。

  • Transaction Script 事务脚本模式

5、ES相关的开源package

Benthos

其它

DDD与es之间的联系;

事件溯源与事件驱动之间的区别和关系:

写一个基于我们的新系统的例子;

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

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

相关文章

网景创始人出生 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 3 月 23 日,在 141 年前的今天,1882 年 3 月 23 日,抽象代数之母艾米诺特(Emmy Noether)诞生。她的研…

goose desktop捣乱鹅完整说明

今天这里有一只捣乱的鹅,会乱拉窗口,又好气又好笑 其实这只鹅有两个版本,一个是简化版,没有安装目录,但是不能自定义设置,不能自己传图片,不能正常显示自带的图片,所以这里只分享完整…

微信h5录音,长按录音(wx.startRecord)

嗨嗨,好久不见,自从chatgpt爆火之后,愈发不想更新文章了,因为大部分问题都可以得到解答,但是今日无事,还是记录下自己最近做的一个事吧,vue2中的录音h5,一个小活动,长按录…

音视频技术开发周刊 | 290

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 TCSVT 2022 | 基于环路多帧预测的深度视频压缩 本文基于端到端深度视频压缩框架,提出了一种环路多帧预测模块(in-loop frame prediction module&a…

【程序员如何买股票 一】 股票基础知识

这一系列的博客是源于《2019 时不我与》,为了契合2019年度计划对投资理财理论知识的学习而开展的。股票作为长期理财和主要收益来源(股票,房产,长期持有债券)的一种,知道怎么玩儿才能让财富增值。搜寻了很多…

从冬奥看中国科技(三):数字人的觉醒与进化

冬奥赛事已过半,我们的情绪也在酣畅淋漓的竞技中跌宕起伏。在谷爱凌自由式滑雪的比赛中,武大靖代表的短道速滑团体赛的金牌中激昂;也为年轻单板滑雪小将苏翊鸣的银牌成绩判罚不停争论,为顶级花滑运动员羽生结弦的冬奥成绩惋惜。 近…

Vue快速入门

文章目录 一、Vue概述1.1什么是vue1.2Vue的特点1.3Vue和其他框架 二、Vue实例选项和基础语法2.1Vue实例选项2.2第一个应用2.3Vue第一个数据处理应用2.4基础语法2.4.1插值表达式2.4.2指令:v-text/v-html2.4.3 v-once2.4.4v-show、v-if2.4.5v-bind2.4.6v-on2.4.7v-for…

浅聊自媒体热点文章的万能写法,肯定可以帮到你

随着闭幕式的结束,这届冬奥会也落下帷幕。 要说今年这届冬奥,最火的莫过于他们两个人——谷爱凌和羽生结弦。 一个阳光自信完美到让人感慨上帝到底为她关上了哪扇门,一个用生命挑战4A让大家看到了奥林匹克精神。 圈内自媒体都说:为…

集合框架最详细知识点含例题

# 集合框架 **集合**:把具有相同数据类型的一组变量,汇聚成一个整体,就被称之为集合。 **集合框架**:为了表示和操作集合而规定的一种统一标准的体系结构。最简单的集合如数组、队列和列表等。任何集合框架一般包含:对…

AI赋能花样滑冰,景联文科技提供3D数据标注业务

在本届北京冬奥会花样滑冰男子单人自由滑中,日本选手羽生结弦如约挑战公认难度极高花滑动作4A(阿克塞尔4周跳),虽然结局有些遗憾,在落地时不慎摔倒,并未挑战成功,最终以排名第四的总成绩无缘领奖…

一文读懂MySQL常用语法

MySQL查询语句链接地址 MySQL是什么? 成为MySQL大神的基础~ 数据类型 数值:整数,浮点数(小数) 日期:年,年月日,时分秒,年月日时分秒 字符串:文本类型字符串,二进制类型…

冬奥幕后故事:从低碳火炬到AI裁判,十四年后中国科技再上场

北京冬奥会开幕后,一个段子在社交媒体上流传甚广:“夏奥开幕式和冬奥开幕式就差半年,这半年人类科技进步真大啊。” 冬奥季终于到来。 2月4日晚,北京冬奥会开幕式来到了万众瞩目的主火炬点燃时刻,两名运动员共同点燃…

python实现图片切九宫格拼图

上一篇文章写道照片切成正方形,这篇文章将介绍,正方形怎么切割成九宫格,自己实现的九宫格发朋友很炫的。 先上代码: # -*- coding: utf-8 -*-from PIL import Image import sys# 将图片填充为正方形 def fill_image(image):width…

python实现图片切正方形

想做个照片切规则的正方形用来做九宫图,一般真实照片都是长方形那种,我见过别人把找照片填充成正方形,然后九宫格实在是太丑了,我喜欢整张图全是照片的。 不多赘述,上代码: import os from random import…

python深度学习基于pytorch——tensor中逐元素计算addcdiv()、clamp()

对tensor中的元素按个计算操作,方法如下图所示: 主要就是tensor之间的运算,已经附加代码输出部分,很容易理解。 import torch #coco #逐元素操作 torch.manual_seed(0) t torch.randn(1, 3) print(t) #tensor([[ 1.5410, -0.293…

如何有效追热点打造爆款作品,教你快速创作

追热点是小编必备的使命,没有热点的文章,就像没有珍珠的奶茶!没有灵魂!“拆解、模仿、反馈、总结、反复”,是助我们在任何领域从菜鸟到高手的秘密武器。今天就给大家介绍一下,追热点有什么必备姿势&#xf…

java集合框架

java集合框架 集合:把具有相同数据类型的一组变量,汇聚成一个整体,就被称之为集合。 集合框架:为了表示和操作集合而规定的一种统一标准的体系结构。最简单的集合如数组、队列和列表等。任何集合框架一般包含:对外的…

python实现 pdf转png格式

转换的图片要实现给固定像素坐标生成RGB值,找了好几段代码只能转换不能进行第二步 不说了,发出来就是解决了,先上代码: #!/usr/bin/env python # -*- coding:utf-8 -*- # Time : 2022/6/27 14:45 # Author : coco # File : tes…

css3学习(01认知,选择器,样式)

文章目录 一 基础认知1.1 CSS的介绍1.2 CSS语法规则1.3 CSS引入方式1.4 CSS常见三种引入方式的特点区别(书写位置、作用范围、使用场景) 二 基础选择器2.1 标签选择器2.2 类选择器2.3 id选择器2.4 通配符选择器 三 字体和文本样式【1】字体样式3.1.1 字体…

【CSS】——cascading stylesheets层叠式样式表

目录 0、CSS介绍 1、CSS语句组成 2、CSS选择器的选择方式 1)CSS选择器的方式和选择器大全: 2)常见的三种方式: 3、添加CSS方式 1)外部样式表 html调用css代码 css文件 html文件 展示 2)内部样式表…