领域驱动设计(DDD)笔记(三)后端工程架构

文章链接

  1. 领域驱动设计(DDD)笔记(一)基本概念-CSDN博客
  2. 领域驱动设计(DDD)笔记(二)代码组织原则-CSDN博客
  3. 领域驱动设计(DDD)笔记(三)后端工程架构-CSDN博客

前导

领域驱动设计(Domain Driven Design,简称DDD)是业内主导的业务工程理论。它在各中权威人士被广泛讨论,但实际落地的具体实践缺相对较少。有人认为DDD是一个听起来高深,缺缺乏实践指导,在各大佬口中被广泛提及但是很少有下场谈具体实现的。DDD是一种听起来高大上,谈起来空洞的方法论,这里我基于代码工程角度抛砖引玉,整理出我的认识。本次我使用GO语言作为工程目录参考,后续会补充Java

DDD 是一种方法论,是“分治”思想的更详细的描述,将一个复杂的系统拆分成一个个尽可能垂直正交的小问题域,让每个问题各自约束自己的职责,从而实现整体框架的简洁清晰。DDD 本质还是遵循高内聚、低耦合的设计原则;根SOLID原则遥相呼应。DDD的战略设计是站在一个更高更抽象的角度拆分问题,战术设计原则是指导具体的落地实现细节。如果对DDD接触不深的话可以参考DDD理论基础。下面简单列一下常见的工程代码的设计方法和特点。

设计方法出发点关注点模型所处层技术方案使用场景
数据驱动设计从数据存储方案出发怎么存实体关系建模,贫血模型,只有数据基础设施层根据存储方案密关联简单的业务场景CRUD
服务驱动设计从服务提供的资源和行为能力出发提供什么服务接口对象建模,贫血模型,只有数据应用层不关注实体实现方案简单的业务场景,API服务
领域驱动设计一切围绕着领域知识进行建模领域划分和建模领域对象建模,充血模型,包括数据和方法领域层不考虑存储方式(技术实现)复杂业务场景

数据驱动设计,采用的是事物脚步的写法,这种写法适合简单、初期项目;随着业务迭代复杂会出现逻辑散乱、职责不清、重复代码、无法单测等诸多问题,常常会出现改漏导致的Bug或事故。

工程代码结构

工程代码按照clean arch 架构来进行分层,如下图

分层概述

Domain是践行面向对象编程,为当前类(go是结构体)负责,按照对象能力方式组织代码。

UseCase是面向过程的编程,为场景能力负责,

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

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

相关文章

华为云耀云服务器开放端口

博客主页:花果山~程序猿-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一.华为云控制台开放端口 寻找到安全组信息 2. 添加开放的端口信息 3. 检查是否成…

信息泄露.

一,遍历目录 目录遍历:没有过滤目录相关的跳转符号(例如:../),我们可以利用这个目录找到服务器中的每一个文件,也就是遍历。 tipe:依次点击文件就可以找到flag 二,phpi…

JavaScript基础(四)

逻辑运算符 && 与 : 多个条件同时满足 ΙΙ 或 : 多个条件满足一个 &#xff01; 非 : 否定某个条件 例: <script> //&多个条件同时满足&#xff0c;才返回true //任意一个为false&#xff0c;就返回false var a 10; var b 20; …

vue快速入门(五十)重定向

注释很详细&#xff0c;直接上代码 上一篇 本篇建立在之前篇目前提下针对重定向进行演示 新增内容 路由重定向写法 源码 src/router/index.js //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import myMusic from "/v…

Java的分布式微服务

Java的分布式微服务是一个涉及多个方面的复杂概念&#xff0c;以下是对其的详细解释&#xff1a; 概念&#xff1a; 微服务&#xff1a;这是一种软件架构模式&#xff0c;它将大型的应用程序分解为一组小型、自治的服务单元。每个服务运行在其独立的进程中&#xff0c;并通过轻…

C#面:如何部署 ASP.NET 页面

在C#中部署 ASP.NET 页面有几种常见的方式&#xff0c;下面我将介绍其中两种常用的方式&#xff1a; IIS部署&#xff1a; 在服务器上安装IIS&#xff08;Internet Information Services&#xff09;。 在IIS中创建一个新的网站或虚拟目录&#xff0c;将其指向你的ASP.NET项目…

MongoDB聚合运算符:$strLenBytes

MongoDB聚合运算符&#xff1a;$strLenBytes 文章目录 MongoDB聚合运算符&#xff1a;$strLenBytes语法使用举例单字节和多字节字符集 $strLenBytes聚合运算符返回指定字符串中 UTF-8 编码的字节数。 语法 { $strLenBytes: <string expression> }<expression>为可…

【51蛋骗鸡595点阵88数码管流水灯综合应用】2021-12-30

缘由51单片机变量进阶与点阵LED-嵌入式-CSDN问答 大佬们 求解单片机点亮点阵程序 被困3天了一直想不明白 - 24小时必答区 #include<reg52.h>//头文件sbit shcpP1^2;//数据输入时钟线 595的11脚 sbit stcpP1^1;//输出存储器锁存时钟线 595的12脚 sbit dsP1^0;//数据线 5…

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts

这门课程专注于提示工程的掌握&#xff0c;教你以精确的方式引导GPT&#xff0c;利用它们的生成能力产生卓越的AI驱动结果。一步一步地&#xff0c;你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI&#xff0c;到以惊…

无人机+飞行汽车:低空经济新引擎,有望爆发式增长

无人机和飞行汽车作为低空经济的新引擎&#xff0c;正在引领一场全新的交通革命。随着技术的不断进步和政策的支持&#xff0c;低空经济有望成为未来经济发展的重要领域&#xff0c;实现爆发式增长。 首先&#xff0c;无人机和飞行汽车具有独特的优势和应用场景。无人机可以在…

Adobe PS 2023、Adobe Photoshop 2023下载教程、安装教程

Adobe Photoshop &#xff08;<-下载连接&#xff09;简介&#xff1a; Adobe Photoshop是一款广泛使用的图像处理软件&#xff0c;由Adobe公司开发。它提供了许多强大的工具和功能&#xff0c;可以用于图像编辑、合成、修饰、设计等各个领域。用户可以使用Photoshop来调整…

Mybatis四种实例化对象方式

代码准备 创建mybatis-config.xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration…

【HAL库 STM32】输入捕获并实现超声波测距

文章目录 HC-SR04 超声波模块简介HC-SR04 工作原理如何使用HC-SR04模块程序效果 一、工程配置代码如果您发现文章有错误请与我留言&#xff0c;感谢 HC-SR04 超声波模块简介 HC-SR04 工作原理 模块有2个超声波换能器&#xff08;如图所示&#xff09;&#xff0c;一个发出声波…

Web安全测试实战:SQL注入与XSS攻击的检测与防御

摘要&#xff1a; 在网络安全领域&#xff0c;SQL注入和跨站脚本&#xff08;XSS&#xff09;攻击是两大主要威胁&#xff0c;它们可以导致数据泄露、会话劫持甚至整个系统的破坏。本文将通过具体的代码示例、测试步骤和防御策略&#xff0c;展示如何检测和防御这两种攻击&…

三. Django项目之电商购物商城 -- 校验用户名 , 数据入库

Django项目之电商购物商城 – 校验用户名 , 数据入库 需要开发文档和前端资料的可私聊 一. 路由匹配获得用户名 在注册时 , 用户输入用户名 , 通过ajax请求发送到服务器 , 在路由中设置对应url , 响应视图 , 将用户输入的用户名传入视图 , 与数据库进行校验检查用户名是否重…

LeetCode 110.平衡二叉树(Java/C/Python3/Go实现含注释说明,Easy)

标签 树深度优先搜索递归 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡的二叉树定义为&#xff1a; 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 原题&#xff1a;LeetCode 110.平衡二叉树 思路及…

AutoLISP实现图元扩展属性的添加、编辑和删除功能

为了确保AutoLISP代码能够兼容各种CAD软件版本&#xff0c;并实现图元扩展属性的添加、编辑和删除功能&#xff0c;可以采取以下通用方法。这里提供一个示例代码&#xff0c;展示如何实现这些功能&#xff1a; lisp ; 函数&#xff1a;添加、编辑、删除图元扩展属性 (defun CP…

MFC列表控件用ADO添加数据实例

1、本程序基于前期我的博客文章《MFC用ADO连接ACESS数据库实例(免费源码下载)》 程序功能通过编辑框、组合框实时将数据写入ACESS数据库并在列表控件上显示。 2、在主界面资源视图上加上一个按钮控件、两个静态文本、一个编辑框IDC_EDIT1变量名name、一个组合框IDC_COMBO1变量名…

【Java从入门到精通】Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流…

021、Python+fastapi,第一个Python项目走向第21步:ubuntu 24.04 docker 安装mysql8、redis(二)

系列文章目录 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 安装redis 我会以三种方式安装&#xff0c; 第一、直接最简单安装&#xff0c;适用于测试环境玩玩 第二、conf配置安装 第三、集群环境安装 一…