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,设置需要配置注释的文件类型,如下图所示…...
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的时候遇见了一个小问题,就是有时候敲空格,视频没办法播放,反而会回退一帧,经过摸索发现了一个解决办法: 点击编辑---首选项 然后选择“音频硬件” 然后选择正确的默认输出,点击确定即可...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
