【基于电商履约场景的 DDD 实战】DDD领域驱动设计的优势分析以及与MVC架构对比

news2024/10/6 10:34:30

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

🍁🍁🍁🍁🍁🍁🍁🍁

基于电商履约场景的 DDD 实战

在这里插入图片描述

介绍

DDD(领域驱动设计,Domain-Driven Design),是一种架构设计的思想,那么使用 DDD 和 MVC 两种架构思想设计出来的系统的区别就在于:

  • MVC 是面向数据库思维设计的,代码混乱,后期不易维护
  • DDD 是面向业务逻辑设计的,更易于维护,代码清晰易懂

现在 DDD 架构比较火,对于大型项目来说,通过 DDD 对不同业务进行界限划分,使得系统结构清晰,方法主流程清晰,而对于小型项目来说,如果过度使用 DDD 可能会导致不必要的复杂性

学习 DDD 一定要和 MVC 进行对比,因为我们平常用的最多的就是 MVC,那么面试的时候,面试官一定会问你,为什么要学习 DDD?DDD 和 MVC 有什么区别呢?这些东西,在学完 DDD 之后,一定要自己总结一下,要不然只能是稀里糊涂的了解 DDD!

接下来会根据履约场景分别按照 DDD 和 MVC 思想写出对应的代码,来对比一下思想上的差异

DDD 和 MVC 对比

先说一下履约场景的简单业务流程,之后再来编写代码

履约系统的作用:在用户支付成功之后,通知了电商平台,通过履约系统来履行约定,也就是在用户支付成功后,履约系统去做一系列的操作,保证商家把商品发货给用户

接下来说一下履约系统的整个流程:

  1. 履约系统收到用户支付成功后的订单
  2. 根据订单,生成履约单
  3. 预分仓:有多个发货仓库,先分配一个距离比较近的仓库
  4. 风控拦截:对一些有风险的操作进行拦截,比如说刷单、黄牛、黑客等操作
  5. 合并处理:将多个相同发货仓库的订单,合并到一起进行处理
  6. 人工审核:人工进行审核一下,检查一下订单有没有问题
    1. 重分仓:如果发现不合理,重新分配一个仓库
  7. 人工拣货,复核打包
  8. 发货:物流揽件、物流运输、物流派件、物流签收

接下来针对预分仓这一个方法,来对 DDD 和 MVC 两种架构进行分析,看一下有什么区别:

我们其实之前常用的架构思想就是 MVC 三层架构,是面向数据库思维的编码思想,而面向数据库思维进行编码会导致严重的脱离原有的业务语义

MVC 架构编码

首先说一下为什么说是面向数据库思维的方式去编码呢?

对于预分仓来说,它的业务逻辑是:

  1. 先拿到所有发货仓库的数据
  2. 再拿到所有履约单的数据
  3. 之后再去根据履约单,去和发货仓库一个一个对比,找出来最近的一个仓库
  4. 再将履约单和发货仓库的对应关系保存下来

那么按照我们原有的面向数据库的思维方式,对于第一步,要先去数据库中查询出来所有的发货仓库的数据,第二步再去数据库中查询出来所有的履约单的数据,第三步再去循环履约单以及发货仓库,找到距离最近的发货仓库,第四步再去将履约单和发货仓库的对应关系给存储到数据库中,伪代码如下:

public class FulfillService {
  // 预分仓逻辑
  public void preAllocateWarehouse() {
    // 1.查询仓库
    warehouseDao.find();
    // 2.查询履约单
    orderFulfillDao.find();
    // 3.将订单与仓库进行一系列匹配操作
    for (orderFulfill orderFulfill : orderFulfills) {
      for (Warehouse warehouse : warehouses) {
        // ...匹配
      }
    }
    // 4.将履约单与仓库对应关系存储到数据库中
    orderAllocateWarehouseDao.save();
  }
}

这样写出来预分仓的代码,里边会先有一堆的数据库查询,之后再去 for 循环遍历,之后再去将数据保存在数据库中,这与原有的业务语义发生了脱离,本来预分仓方法的目的是要拿履约单和仓库进行匹配,找到最适合的发货仓库,结果通过面向数据库思维,先添加了很多数据库操作的边干逻辑,从而导致整个代码的主干流程不清晰

如果你作为一个产品经理,来看这一段代码,你可能根本不知道这一堆数据库查询以及 for 循环到底是干嘛的

这就是 MVC 架构所带来的缺点,当代码多了之后,整个结构混乱,不宜维护

DDD 架构编码

上边就是通过 MVC 架构设计的代码,整个过程中都是以面向数据库思维编写的,这样的系统如果发展了几年之后,可能根本就没有人愿意来接手这个代码

接下来看一下按照 DDD 架构写出来的代码,这里写的比较简单,主要是和 MVC 对比,后边会将履约场景的代码给规范的写出来

public class FulfillService {
  // 预分仓逻辑
  public void preAllocateWarehouse() {
    // 1.取出履约单
    OrderFulfill orderFulfill = orderFulfillRepository.getById(orderId);
    // 2.取出仓库信息
    Warehouses warehouses = warehouseRepository.find();
    // 3.寻找距离履约单最近的仓库
    Warehouse warehoiuse = warehouses.searchNearest(orderFulfill);
    // 4.检查仓库的库存是否充足
    Boolean checkInventoryResult = warehouse.checkInventoryResult(orderFulfill);
    if (!checkInventoryResult) {
      return;
    }
    // 5.锁定库存
    warehouse.lockInventory(orderFulfill);
    // 6.将仓库分给履约单
    orderFulfill.allocate(warehouse);
  }
}

上边是根据 DDD 思想写出来的代码,可以看到,就算你不是开发人员,你来看,整个方法的主干流程非常清晰,不会有很多数据库操作来干扰视线

这里 DDD 架构中,上边比如说寻找离履约单最近的仓库,我们是把方法写到 Warehouses 中去了,分配给履约单的方法写到 OrderFulfill 中去了,这两个其实相当于是实体类,之前在 MVC 中,肯定是不会向实体类中写方法的,这也是 DDD 与 MVC 有很大不同的一点,这些之后都会详细介绍

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

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

相关文章

LeetCode.2859. 计算 K 置位下标对应元素的和

题目 题目链接 分析 这道题的题意很明确。就是求每一个下标的二进制中1的个数为k的下标所对应的元素值之和。 Java 中有 库函数 Integer.bitCount(num),这个函数的返回值就是 num 中 1 的个数。 代码 class Solution {public int sumIndicesWithKSetBits(List…

如何训练和导出模型

介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法,全称为Deep Q-Network算法,是一种结合了Q学习(一种价值基础的强化学习算法)和深度学习的算法。该算法是由DeepMind团队在2013年提出的,…

开发板连接错误: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

1.出现错误 scp rkmedia_vi_venc_rtsp_test_sp root192.168.10.198:/home/sunpeng出现错误 2.错误原因:警告:远程主机标识已更改! 1)重新烧录开发板系统,导致IP地址变化。 2)报警错误-中文(警…

每日一练 | 华为认证真题练习Day172

1、关于OSPF的ASBR-SUMMARY-LSA中LSA头部他、信息描述错误的是 A. LINK STATE ID表示ASBR的ROUTER ID B. ADVERTISING ROUTER表示该ABR的ROUTER ID C. ADVERTISING ROUTER字段永远不会改变 D. METRIC表示该ABR到达ASBR的OSPF开销 2、关于OSPF外部路由种类描述错误的是 A. …

力扣354. 俄罗斯套娃信封问题

动态规划 思路: 同时控制 w、h 两个维度比较复杂,可以先固定一个维度,来找出另外一个维度的严格单调序列: 对 w 排序,然后再来找 h 维度严格单调递增序列长度;在 w 排序时,会遇到 w(i) w(j) 的…

字节发布MagicVideo2文本生成视频模型,一句话便可生成动态视频

文生图大模型已经火了很长一段时间了,而随着技术与模型算法的不断提升,文生视频模型也越来越多。今天就介绍一下字节跳动发布的MagicVideo-V2文生视频大模型。 文生图的大火对文本生成高保真视频的需求也不断增长,正是这种需求的增加&#xf…

李国武老师解读QFD:从理论到实践的全面指南

QFD,即质量功能展开(Quality Function Deployment),是一种将客户需求转化为产品设计要求和生产要求的系统方法。在当今市场竞争激烈的环境下,如何将客户的声音转化为产品优势,是每一个制造企业都需要面对的…

域名的安全性如何提高?

域名(Domain Name)是互联网上的一种层次结构式的字符标识,对应于计算机的互联网协议(IP)地址。域名是由一串用点分隔的名字组成的,它可以方便地在数据传输时标识计算机的电子方位。域名的作用在于提供易于记…

超级万能DIY模块化电商小程序源码系统 带完整的搭建教程

随着电商市场的不断扩大,越来越多的商家涌入电商平台,竞争愈发激烈。为了在众多竞争对手中脱颖而出,商家需要打造一款个性化、功能强大的电商小程序,以吸引更多的用户。而超级万能DIY模块化电商小程序源码系统正是为了满足商家的这…

已经写好代码,领导让我重写测试代码,我要不要提桶跑路?

我有一个朋友,有一天问我这样的一个问题:“说现在他们公司有五个 python 测试工程师。但是有一天领导要求他把所有的自动化测试代码,全部都转化成 Java 语言。” 虽然说他们在行动上还是接受了领导的任务,但是他一直想不清楚&…

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务bbc

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

2024亚马逊开店教程:开店准备与注册流程指南

随着新一年的到来,亚马逊开启了新一轮的卖家入驻,并且针对新卖家优化了入驻流程,下面为大家简单整理一下最新亚马逊入驻教程,有想要入驻开店的小伙伴速速看过来! 一、开店前准备 1、账号环境准备 为了防止账号由于网…

【华为 ICT HCIA eNSP 习题汇总】——题目集8

1、在VRP平台下,关于各个协议的外部优先级的描述,正确的是()。 A、OSPF路由的外部优先级是15 B、IS-IS路由的外部优先级是10 C、静态路由的外部优先级是60 D、BGP路由的外部优先级是20 考点:路由技术原理 解析&#xf…

OpenCV图像的基本操作

图像的基本操作(Python) 素材图 P1:die.jpg P2:cool.jpg V:rabbit.mp4, 下载地址 读取展示-图像 import cv2img_1 cv2.imread(./die.jpg) # default cv2.IMREAD_COLOR print("die.jpg shape(imre…

26.各品类中商品价格的中位数(ceil与floor函数)

题目: 题解: --这道题主要考察中位数的取法 SELECT category_id,cast(sum(price)/count(1) as DECIMAL(16,2)) medprice from( SELECTcategory_id,price,rn,max(rn)over(partition by category_id) max_rn from(SELECTcategory_id,price,row_number() …

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列: 音频编解码格式介绍(1) ADPCM:adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 :音频格式之MP3:(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 :音频格式之MP3&#x…

工业交换机的OAM功能有哪些?

OAM(Operations, Administration, and Maintenance)是工业交换机中的一种功能,用于管理和维护网络的操作、管理和维护任务。它提供了以下功能: 1. 连通性检测:OAM可以监测和检测交换机与其他网络设备之间的连通性&…

如何在外远程访问家中本地威联通QNAP NAS

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 前言 购入威联通NAS后,很多用户对于如何在外在公网环境下的远程访问威联通NAS…

python环境安装sklearn及报错解决

安装 如刚开始安装&#xff0c;还未遇到问题请直接从重新安装库开始看&#xff0c;如果遇到报错&#xff0c;从问题开始看 问题 python安装sklearn报错 &#xff0c;报错信息如下 File "<stdin>", line 1pip install scikit-learn^ SyntaxError: invalid s…

OSS上传下载乱码问题

配置headers&#xff1a; "Content-Disposition": attachment; filename*UTF-8${encodeURIComponent(file.file.name)},