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端 链接 解析 优化 + 缓存 -》 执行引擎
这样就又是一个糖葫芦,这种方法其实就是我们常见的图书目录【一般来说图书的目录是渐进式的,并不一定有数据流向有关系】,但是一个别致的名字总是会引起新的兴趣。水文一篇,欢迎吐槽

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

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

相关文章

【Python】Python爬虫:网络数据的提取利器

随着互联网的快速发展,网络数据已经成为了一项重要的资源。如何从海量的网络数据中提取出我们需要的信息,就成为了各个行业都需要解决的问题。而Python爬虫,就是解决这个问题的利器。 首先,让我们了解一下什么是Python爬虫。Pyth…

curl 使用发送POST GET请求 HEADER设置

curl 使用发送POST GET请求 HEADER设置 文章目录 Get请求POST请求1. application/x-www-form-urlencoded2. Multipart/form-data3. application/json4. text/xml 文件内容作为提交的数据 curl 设置自定义HEADER 头注意事项:shell批处理外传 Get请求 get请求偏简单&…

Spring MVC 三 :基于注解配置

Servlet3.0 Servlet3.0是基于注解配置的理论基础。 Servlet3.0引入了基于注解配置Servlet的规范,提出了可拔插的ServletContext初始化方式,引入了一个叫ServletContainerInitializer的接口。 An instance of the ServletContainerInitializer is looke…

web层Controller通用处理(表格数据处理、分页数据、sql操作、客户端servlet、字符串工具类)

BaseController(一) public class BaseController{// slf4j-api-1.7.30.jarprotected final Logger logger LoggerFactory.getLogger(BaseController.class);/**将前端传递过来的日期格式字符串,转换为Date类型spring-web-5.3.1.jar*/InitB…

浅析阿里云灵积(平台)模型服务

简介: DashScope灵积模型服务以模型为中心,致力于面向AI应用开发者提供品类丰富、数量众多的模型选择,并为其提供开箱即用、能力卓越、成本经济的模型服务API。DashScope灵积模型服务依托达摩院等机构的优质模型,在阿里云基础设施…

软考高级系统架构设计师系列论文七十三:论中间件在SIM卡应用开发中的作用

软考高级系统架构设计师系列论文七十三:论中间件在SIM卡应用开发中的作用 一、中间件相关知识点二、摘要三、正文四、总结一、中间件相关知识点 软考高级系统架构设计师:构件与中间件技术二、摘要 我曾于近期参与过一个基于SIM卡应用的开发项目,并在项目中担任系统分析的工作…

Linux性能计数器

目录 一、简介二、sys_perf_event_open1、参数 struct perf_event_attr2、参数 pid3、参数 cpu4、参数 group_fd5、参数 flags6、记录信息的环形缓冲区 三、计数器(组)的启用或禁用四、示例代码 一、简介 性能计数器是在大多数现代cpu上可用的特殊硬件寄存器。这些寄存器统计特…

rke安装k8s

1、修改集群中各物理机主机名hostname文件 # 查看 cat /etc/hostname # 命令修改 hostnamectl set-hostname k8s-master2、实现主机名与ip地址解析 # 查看cat /etc/hosts # 修改 vi /etc/hosts3、配置ip_forward过滤机制 # 修改 vi /etc/sysctl.conf net.ipv4.ip_forward1…

CGY-OS 正式开源!【软件编写篇】

上一篇文章:CGY-OS 正式开源!_cgy091107的博客-CSDN博客 一、软件编写基础要求 在编写CGY-OS的应用程序之前,您需要: 1. 安装python3.10,配置好CGY-OS。 2.掌握python3的基本语法、lambda表达式、各种简单的数据结构。…

【Python】PySpark

前言 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…

LabVIEW是如何控制硬件的?

概述 工程 师 和 科学 家 可以 使用 LabVIEW 与 数千 种 不同 的 硬件 设备 无缝 集成, 并 通过 方便 的 功能 和 跨 所有 硬件 的 一致 编 程 框架 帮助 节省 开发 时间。 内容 通过更简单的系统集成节省开发时间 连接到任何硬件 NI 硬件 第三方硬件 快速找到…

ubuntu18.04复现yolo v8之最终章,realsenseD435i+yolo v8完美运行

背景:上一篇博客我们已经为复现yolov8配置好了环境,如果前面的工作顺利进行,我们已经完成了90%(学习类程序最难的是环境配置)。 接下来将正式下载yolov8的相关代码,以及进行realsenseD435i相机yolo v8的de…

【学习FreeRTOS】第16章——FreeRTOS事件标志组

1.事件标志组简介 事件标志位:用一个位,来表示事件是否发生 事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 事件标志组的特点: 它的每一个位表示一个事件(高8位不算&…

C++学习笔记总结练习:数组离散化的方法

数组离散化 1 问题描述 离散化一个序列的前提是我们只关心这个序列里面元素的相对大小,而不关心绝对大小(即只关心元素在序列中的排名);离散化的目的是让原来分布零散的值聚集到一起,减少空间浪费。那么如何获得元素…

linux入门详解

文章目录 一、引言1.1 开发环境1.2 生产环境1.3 测试环境1.4 操作系统的选择 二、Linux介绍2.1 Linux介绍2.2 Linux的版本2.3 Linux和Windows区别 三、Linux安装3.1 安装VMware3.2 安装Xterm3.3 在VMware中安装Linux3.3.1 选择安装方式3.3.2 指定镜像方式3.3.3 选择操作系统类型…

qt创建临时文件

1、临时文件系统 在 Linux 系统中,创建临时文件系统很简单,执行如下指令即可: mount -t tmpfs -o size1024m tmpfs /mnt/tmp 挂载成功后,在 /mnt/tmp 这个挂载点下创建的所有文件都将会是临时文件, 也就是说:当电脑关…

《C语言编程环境搭建》工欲善其事 必先利其器

C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 &#xff0c…

DevOps中的持续测试优势和工具

持续测试 DevOps中的持续测试是一种软件测试类型,它涉及在软件开发生命周期的每个阶段测试软件。持续测试的目标是通过早期测试和经常测试来评估持续交付过程的每一步的软件质量。 DevOps中的持续测试流程涉及开发人员、DevOps、QA和操作系统等利益相关者。 持续…

组件库的使用和自定义组件

目录 一、组件库介绍 1、什么是组件 2、组件库介绍 3、arco.design 二、组件库的使用 1、快速上手 2、主题定制 3、暗黑模式 4、语言国际化 5、业务常见问题 三、自定义组件 2、组件开发规范 3、示例实践guide-tip 4、业务组件快速托管 一、组件库介绍 1、什么是…

9个python自动化脚本,PPT批量生成缩略图、添加图片、重命名

引言 最近一番在整理资料,之前买的PPT资源很大很多,但归类并不好,于是一番准备把这些PPT资源重新整理一下。统计了下,这些PPT资源大概有2000多个,一共30多G,一个一个手动整理这个投入产出比也太低了。 作为…