当前位置: 首页 > news >正文

MVC OR DDD

MVC OR DDD


说明:这篇是标题党,不包含相关概念说明

前段时间跟随师兄学习了解了DDD领域驱动模型,觉得这个思想更好,进行下面解析和学习方面的思考和实践,觉得很好,耐心读下去。希望对您有所帮助。

首先,面向对象出来已久,但是大多情况下,我的思考分析方式停留在了MVC面条层面,比如学生管理系统,直接思考的是应该有哪几个表【学生,班级,成绩。。。】,然后基于这个表应该有哪些字段,进行数据库设计,生成dao,service层进行简单逻辑CRUD,Mangager和Controller,包个VO,暴露给前端,自己手动调用一下,好,没啥大问题,提交,部属个机器丢给前端,联调完事。
但是后面开发的时候前端对照PRD进行开发的时候经常发现,这个字段咋没有,这个PRD的交互不太合理,需要增加字段,更为复杂的时候,是你有一对N的表映射的时候,你发现你的状态字段,不是来源一个表,要主表,审批表,从表,聚合之后而来,好不容易写完了,然后测试,发现某个操作之后,展示的不对,产品看了看法完成之后的,这个咋不符合他原先的设计。我们不得不接受的现实是一千个人眼中就有一千个哈姆雷特以及你的需求不可能不变化。
那么我们怎么解决这类现象。其实我们上面开发代码的时候思考的方式用形象的比喻的话就是面条代码,基于底层数据库表,一层添加点东西一层一个entry,现在想想很形象。
后来接触DDD【领域驱动模型】,我们先要对领域边界划分,领域内进行高内聚,对于边界外的,让对应的领域提供必要的接口,我们核心设计的内容,不再是数据库中存储的表,把设计的中心,上移到领域层,我们应该划分那些领域,这个领域有那些model,这个model的主键(值对象)是什么,别的model都依赖这个值对象,另外我这个领域的对象,应该有那些能力(比如,鸭子这个领域对象,应该可以飞,吃)这些核心能力就是这个领域应该拥有的方法,另外这个对象应该是充血还是贫血(MVC那块只有getset方法的是贫血模型)把属于这个对象的方法放到这个领域对象中,就是这个对象拥有飞的能力。这样才更符合我们OOP的现实。
上面主要有两个问题,1。哈姆雷特,这个就需要一个开发团队中,大家【产品,系统owner,开发,测试】有统一的认知,统一的语言,向同一个方向搞项目,这个东西,客观其实比较难实现,多数情况下,面向领导编程模型中,我们是要向上级展现结果的,而不是我们的代码有多规范,并且这个东西,需要大家有统一的时间,有一定的学习成本,以及人员流动情况。但是我们需要有一定的项目结构,这就要求我们要有一定的文档记录我们的项目是干什么的,发展方向,未来愿景,不知道多少项目做到后面还能保持原来设计的方向,如果你的方向已经做的很大的改变,对于不重构的系统来说是灾难性的,并且你会发现,偏航不是一天跑远的,是潜移默化的。对于一个持久发展的项目,这个是一个严重影响的方向。所以哈姆雷特问题对于权限不高的小开发是一个黑洞。但是我们可以根据目前产品界面上的重点,用户高频使用的,重点关注的点,进行汇总,总结,这个项目前面的航向。2.变化的需求,项目要发展就要改变创新,跟你申请专利差不多,最难的就是创新型,最简单的就是改变外观,优化下界面,改变下交互,这可能就是某些人,向上交的作业,不过我要说明的是,改变用户习惯的习惯很可怕,对于一个用户习惯的改变会应该一段时间内用户的体感,不知道多少产品会考虑这方面的影响,OOP中一条重要的规则,对于修改关闭,对于扩展开放,对于之前的用户已经习惯的东西,如果你的新设计没有明显的好处就不要重新设计了,不如多思考下用户痛点,项目的核心是什么,多push下开发,共同解决优化下。DDD中很重要的思想是依赖倒置,领域层依赖存储层。这样你变更的核心的领域中那个对象应该拥有什么属性,能力,而不是这个应该存储到哪个表里面。另外一个就是加防腐层,外部第三方和前端页面中间加防腐,防腐,而不是前端有一个小的变化直接击穿到领域里面了,当然你原来领域中没有的肯定是要击穿到领域层的。
鬼扯半天毛用没有,举个例子,最近面试,八股文很多,在看和学习的过程中思考应该吧这个思想运用到生活中,我命名为糖葫芦模型。
网上借图
我们从一个java文件为开头,沿数据流向分析过程
java文件通过javac编译成class文件,然后通过ClassLoad加载进行内存,ClassLoad是双亲委派,最上面的是BootstrapClassLoad,加载rt.jar内容 【进入ClassLoad域】…
加载进内存后,JMM模型包含下面几个区域【JMM域、堆栈方法区pc本地方法区】【垃圾回收】
执行引擎+本地接口
这样从数据流向看过去,经过一段是一个领域,这样坐地铁什么的时候直接看我们串了几个糖葫芦就行。
mysql糖葫芦
sql -> conn -> server端 链接 解析 优化 + 缓存 -》 执行引擎
这样就又是一个糖葫芦,这种方法其实就是我们常见的图书目录【一般来说图书的目录是渐进式的,并不一定有数据流向有关系】,但是一个别致的名字总是会引起新的兴趣。水文一篇,欢迎吐槽

相关文章:

MVC OR DDD

MVC OR DDD 说明:这篇是标题党,不包含相关概念说明 前段时间跟随师兄学习了解了DDD领域驱动模型,觉得这个思想更好,进行下面解析和学习方面的思考和实践,觉得很好,耐心读下去。希望对您有所帮助。 首先&am…...

前端面试:【TypeScript】静态类型检查与编译时类型检查

TypeScript是一种由Microsoft开发的编程语言,它在JavaScript的基础上添加了强大的静态类型系统。在本文中,我们将深入探讨TypeScript的静态类型检查和编译时类型检查,以及它们如何提高代码的可靠性和可维护性。 1. 静态类型检查(S…...

Qt中设置QListWidget滑动条滚动速度

QListWidget继承QListView控件,Qt帮助文档中说 QAbstractItemView::ScrollPerPixel 和QAbstractItemView::ScrollPerItem分别可以实现按item滚动和像数点滚动,但是好像都没效果。还有就是说通过创建QScrollBar有用,但是也没效果。 亲测还是这…...

STM32的lorawan协议栈

LoRa 是LPWAN通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统,进而扩展传感网络。目前&…...

IC芯片 trustzone学习

搭建Airplay TA环境需要在IC的TrustZone中进行。TrustZone是一种安全技术,用于隔离安全和非安全环境,并保护敏感文件。在TrustZone中,我们需要编写一个叫做TA(Trusted Application)的应用程序来控制这些私密文档。 &am…...

Day19-异步请求-axios文件上传

Day19-异步请求 什么是同步请求当前浏览器刷新或者改变浏览器地址栏地址才能发送请求,这种请求称为同步请求 什么是异步请求当我们发送请求时,浏览器不会刷新,浏览器地址栏也不会变化,这种请求称为异步请求异步请求用到的前端技术: ajax 或 axios一 封装Ajax /*** 编写ajax函…...

从零学算法79

79.给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直…...

ctfshow-web-红包题第六弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先跑一下字典,这里用的dirmap,可以看到有一个web.zip 下载下来之后发现是一个网站备份,备份的是check.php.bak 然后接着看,可以看到这里不太可能是sql注入,有…...

蓝蓝设计UI设计公司-界面设计与开发案例

天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司,坐落于天津滨海新区航天技术产业园,是航天五院家入住天津未来科技城的军民融合型企业&…...

IDEA 配置注释模板

目录 一、配置类模板注释 二、配置方法注释 一、配置类模板注释 打开IDEA,打开settings(快捷键:Ctrl Alt s),选择Editor,找到File and Code Templates,设置需要配置注释的文件类型,如下图所示&#xf…...

Kuka机器人设计通用码垛程序

假设需要一个码垛程序, 从输送线抓到托盘, 托盘每层4个, 需要码5层, 可以用以下程序架构设计: 1, 再config中定义层数cengshu , 每层码垛的个数(码垛的次数)cishu , 每层的高度levelHeight , 码垛放置点的集合putPoint[,] ,预放点1集合prePut1[,], 预放点2集合prePut2[,] DEC…...

pandas由入门到精通-数据清洗-扩展数据类型

pandas-02-数据清洗&预处理 扩展数据类型1. 传统数据类型缺点2. 扩展的数据类型3. 如何转换类型文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分…...

深入理解 Vue Router:构建可靠的前端路由系统

目录 01-什么是前端路由以及路由两种模式实现原理02-路由的基本搭建与嵌套路由模式03-动态路由模式与编程式路由模式04-命名路由与命名视图与路由元信息05-路由传递参数的多种方式及应用场景06-详解route对象与router对象07-路由守卫详解及应用场景 01-什么是前端路由以及路由两…...

Mysql B+数索引结构

一、B树和B树区别 二、 B 树形成过程 三、页分裂过程 3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4,因为 页10 最多只能放3条记录所以我们不得不再分配一个新页: 新分配的数据页编号可能并不是连续的,也…...

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件);NASM也支持大量的文件格式,包括Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32以及Win64,同…...

用QT实现MVP模式

近些天用qt 作项目,遇到参数界面.偷闲写个mvp模式示例. mvp模式重要的有两点 1 低耦合: 界面与后端数据类,不直接引用,可方便替换. 2 形成界面驱动-界面更新的闭环.:通过函数指针类技术,让数据自动回流. MVP (Model-View-Presenter) 视图(View): 接…...

(2023)Linux安装pytorch并使用pycharm远程编译运行

(2023)Linux安装pytorch并使用pycharm远程编译运行 安装miniconda 这部分参考我这篇博客的前半部分Linux服务器上通过miniconda安装R(2022)_miniconda 安装r_Dream of Grass的博客-CSDN博客 创建环境 创建一个叫pytorch的环境…...

poi带表头多sheet导出

导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…...

RedisDesktopManager(redis客户端,可输入用户名密码)

RedisDesktopManager(redis客户端,可输入用户名密码) Redis桌面管理器(又名RDM) - 是一个用于Windows,Linux和MacOS的快速开源Redis数据库管理应用程序。可以使用url连接或账号密码。 redis设置账号密码后…...

【Adobe After Effects】关于ae点击空格不会播放反而回退一帧的解决方案

最近玩ae的时候遇见了一个小问题,就是有时候敲空格,视频没办法播放,反而会回退一帧,经过摸索发现了一个解决办法: 点击编辑---首选项 然后选择“音频硬件” 然后选择正确的默认输出,点击确定即可...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...