草庐IT

架构思维学习总结(十九)

奋斗的韭菜汪 2023-03-28 原文

5-4 DDD之战术设计

一、值对象和实体

Value object :从字面理解就是系统中对象的值,描述领域中的重要事物,将相关属性组合为不可分割的单元来对概念整体建模。
特征:

  • (衣服颜色从红色变成蓝色,红色本身是不变的,同理蓝色本身也是不变的,所以颜色是一个值对象)
  • 可替换性(红色衣服可以重新上色变成蓝色)
  • 可替换性(可以重新赋值给它)
  • 可比较性(red == red, red != blue)
  • 无副作用的行为
  • 线程安全
  • 整体性,不仅可以包含数据,还可以包含业务逻辑和校验代码。
    ,即复杂的业务放在valueObject中,简单的业务放在entity中
不可变性在代码中的体现:
public class ItemNum implements ValueObject<ItemNum> {

    private Integer num;

    public ItemNum(Integer num) {
        this.setNum(num);
    }

    public ItemNum addNum(ItemNum addNum) {
        Validator.validateNotNull(addNum, "addNum is required");
        return new ItemNum(this.num + addNum.getNum());
    }
//    //错误写法(改变了num的值)    
//    public void addNum(ItemNum addNum) {
//        Validator.validateNotNull(addNum, "addNum is required");
//        this.num = this.num + addNum.getNum();
//    }
...
支持外币的money值对象

image.png

值对象基类:参考实现

Value Object ORM
  1. 核心,所以必须要转换
  2. 顺序:业务优先
  3. Value Object可以在资料库中有id
  4. 复杂值对象保存
Entities

定义:是一个不是由属性所定义的对象,它表示了一条有连续性的身份标示线,这条线横跨了系统的生命周期甚至更长。
特性:

  • 唯一性
  • 容器性
  • 跨越性
  • 持久性
  • 可修改性(和Value Object最大的区别)
设计entity步骤:
  • 1分辨业务中那些适合entity,哪些适合放在Value Object中
  • 2根据业务规则,识别Entity ID设计方法。(根据上一Page介绍的方法)
    *3找出关键行为与对应的业务规则,然后照着Ubiquitous Language命名后使用
Entity和Value Object的区别
  • 1系统是否在于对象生命周期的变化
  • 2Entity可以拥有Value Object,但Value Object一般不可拥有Entity
  • 3是否可修改

二、集合(Aggregate)设计

Entity特征之一:id相同则对象相同
此特性会带来什么副作用?
不同人load一个entity对象进行修改会导致数据不一致,所以外部不能直接调用entity,需要通过Aggregate来调用,保证出口一致。

每一个Aggregate都需要一个entity作为它的Aggregate Root,

特征:
  1. Aggregate 由Entites和Value Objects组成,这些对象由Aggregate负责统一保存。,
  2. Aggregate控制修改。
  3. Aggregate都有一个Root Entity
  4. Root entity管理Aggregate中其他entities的生命周期
Aggregate设计指导

Aggregate.png

图片2.png

图片33.png

若同时保存两个Aggregate需要发布事件

三、资源库(Repository)和工厂(factory)

Aggregate由Factory来创建,由Repository来保存

图片40.png

四、领域服务和应用服务

Domain Service /Application Service/Infrastructure service
相同点:

  1. 服务(Service)首先不是事务(Someting),而是行为(Behavior)
  2. Service statelessness principle:服务无状态性是一种设计原则,适用于面向服务的设计范式


    image.png

五、事件风暴构建领域模型

白板+便签

六、DDD java开源项目

DDD Sample地址

七、推荐使用DDD时机

领导安排

reference:

领域驱动设计DDD实战案例

有关架构思维学习总结(十九)的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  6. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  7. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  8. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  9. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  10. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

随机推荐