01.如何用DDD重构老项目

学习资料来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid=1940048&ctype=0

文章目录

  • 动机
  • DDD与重构
  • 实践
    • 重构? 重写
    • 从一开始就采用DDD
    • 重构步骤
      • 1. 添加领域模块
      • 2.分离出有价值的代码
      • 3.迁移到领域模块
      • 4.重复2,3

动机

  • 为了程序员的理想? 为了商业利益?
  • 通过重构老项目来学习DDD并不合适。DDD应该是项目一开始就使用DDD,而不是用它来做重构。
  • 考虑投入产出,收益不高不做。死代码,没有新的需求来了,没必要重构;或者去先做其他更收益更高的事情
  • 得到各方支持,测试、产品、领导。不要私自做,难以坚持下去。

如果你是打工的,代码是公司的,不是你自己的。哪怕是座屎山,也不要轻易重构或DDD改造,屎山也能带来商业价值。改造能对屎山代码起到很好效果的几乎没有。

DDD与重构

  • DDD和重构不存在直接关系。DDD不是指导重构的方法论,重构也不需要DDD的指导。一个完全不懂DDD的人,也可做重构。
  • 实践DDD最好不要从重构开始。DDD最核心的部分是从问题域出发,设计出领域模型,再将模型落地为代码。但是重构不是从问题域出发的,而是从老代码出发的。
  • DDD架构风格可以成为重构的目标
  • 如果老项目本来就是用DDD做的,可以通过重构不断改进DDD代码。

实践

重构? 重写

首先要搞明白,是要做重构还是重写。
重构是不改变功能,逐步改进代码,量变引起质变。增量改变,风险更小。
重写是抛弃老代码,完全写一份新的,往往是一次性完成的。重写风险更大,一般不建议采用。
不管是重构还是重写,都应该用测试驱动开发保驾护航。如果原有代码确少测试用例,首先要补充自动化的测试用例。单元测试、集成测试、接口测试等等。然后再重构,如果只靠人力,很可能会失败。

从一开始就采用DDD

如果是新项目或者新需求,目前这个年代,使用DDD成本并不高。如果一开始不是DDD,后期重构成本更高。

重构步骤

1. 添加领域模块

在这里插入图片描述
这里的领域模块,就是业务核心模块,六边形架构里边所说的核心。刚建出来这个模块可能是空的,具体表现如在Java项目中可能是个jar包。

2.分离出有价值的代码

在这里插入图片描述
不可能一下子把老代码都用DDD改造。把最有价值的模块分离,并定义接口,老代码使用接口,待分离模块实现接口。接口把功能的使用方和实现方隔离开来,接口到后边不再变化,代表了老代码和分离模块之间的协议。

3.迁移到领域模块

在这里插入图片描述

4.重复2,3

重复步骤2,3,分离出有价值的模块,直到你觉得没有有价值的模块需要移动。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF+MVVM案例实战(十八)- 自定义字体图标按钮的封装与实现(ABD类)

文章目录 1、案例效果1、按钮分类2、ABD类按钮实现描述1.文件创建与代码实现2、样式引用与控件封装3、按钮案例演示1、页面实现与文件创建2、运行效果如下3、总结4、源代码获取1、案例效果 1、按钮分类 在WPF开发中,最常见的就是按钮的使用,这里我们总结以下大概的按钮种类,…

Python 5个数据容器

列表(list) 列表的定义 定义空列表: 变量名 [] 或 变量名 list() 定义变量: 变量名 [元素1,元素2,元素3,... ] 取出列表元素 列表 [下标索引] 从前向后,从0开始&#xff…

使用语言模型进行文本摘要的五个级别(llm)

视频链接:5 Levels Of LLM Summarizing: Novice to Expert

Qt5.15.x源码编译

介绍: QT5.15以上版本已经不提供现成的集成软件了。所以当我们项目中需要用到5.15以上的版本时,只能自己对源码进行编译来生成一个环境了(Qt提供了在线升级,但是在线升级中没有MinGW版本了) 背景: 我们想要…

Ubuntu 系统、Docker配置、Docker的常用软件配置(下)

前言 书接上文,现在操作系统已经有了,作为程序的载体Docker也安装配置好了,接下来我们需要让Docker发挥它的法力了。 Docker常用软件的安装 1.Redis 缓存安装 1.1 下载 docker pull redis:7.4.1 #可改为自己需要的版本 1.2 创建本地目录存储…

Redis全系列学习基础篇之位图(bitmap)常用命令的解析

文章目录 描述常用命令及解析常用命令解析 应用场景统计不确定时间周期内用户登录情况思路分析实现 统计某一特定时间内活跃用户(登录一次即算活跃)的数量思路分析与实现 描述 bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计…

面试题:JVM(四)

new对象流程?(龙湖地产) 对象创建方法,对象的内存分配。(360安全) 1. 对象实例化 创建对象的方式有几种? 创建对象的步骤 指针碰撞:以指针为分界线,一边是已连续使用的…

手写实现call,apply,和bind方法

手写实现call,apply和bind方法 call,apply和bind方法均是改变this指向的硬绑定方法,要想手写实现此三方法,都要用到一个知识点,即对象调用函数时,this会指向这个对象(谁调用this就指向谁&#…

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本,以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…

AI驱动无人驾驶:安全与效率能否兼得?

内容概要 如今,人工智能正以其神奇的魔力驱动着无人驾驶的浪潮,带来了无数令人兴奋的可能性。这一领域的最新动态显示,AI技术在车辆的决策过程和实时数据分析中发挥着重要作用,帮助车辆更聪明地应对复杂的交通环境。通过实时监测…

从头开始学PHP之面向对象

首先介绍下最近情况,因为最近入职了且通勤距离较远,导致精力不够了,而且我发现,人一旦上了班,下班之后就不想再进行任何脑力劳动了(对大部分牛马来说,精英除外)。 话不多说进入今天的…

Systemd:现代 Linux 系统服务管理的核心

Systemd:现代 Linux 系统服务管理的核心 引言 Systemd 是一种现代的系统和服务管理器,用于在 Linux 系统启动时初始化用户空间,并通过服务管理和资源控制实现系统的自动化管理。自发布以来,Systemd 已逐渐取代传统的 SysVinit 和…

Linux初阶——线程(Part3):POSIX 信号量 CP 模型变体

一、什么是 POSIX 信号量 信号量本质就是一个统计资源数量的计数器。​​​​​​​ 1、PV 操作 pv操作就是一种让信号量变化的操作。其中 P 操作可以让信号量减 1(如果信号量大于 0),V 操作可以让信号量加 1. 2、信号量类型——sem_t 3…

《女巫攻击:潜伏在网络背后的隐秘威胁与防御策略》

目录 引言 一、基本概念 二、攻击机制 三、Sybil攻击类型 1、直接通信 2、间接通信 3、伪造身份 4、盗用身份 5、同时攻击 6、非同时攻击 四、攻击影响 五、防御措施 总结 引言 随着区块链技术和去中心化网络的迅速发展,网络安全问题也愈发引起关注。其…

Mybatis-plus入门教程

注意版本 jdk 18 springboot 3.1.0 mybatis 3.0.3 mybatisplus 3.5.5 快速入门 构建模块 导入依赖 <properties><maven.compiler.source>18</maven.compiler.source><maven.compiler.target>18</maven.compiler.target><project.build…

插件式模块化软件框架的思想图解一(框架篇)

插件式模块化软件框架的思想图解一&#xff08;框架篇&#xff09; Chapter1 插件式模块化软件框架的思想图解一&#xff08;框架篇&#xff09;一、前述二、模块化原则1、高度独立2、接口规范 三、从管理需求出发四、框架雏形五、接口引用规定六、子模块与代码模板七、把优秀当…

用ChatGPT-o1搞定论文写作!完整的8步指南

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助论文写作可以显著提升效率和质量&#xff0c;关键在于正确的方法和对学术规范的遵守。以下将详细说明完整步骤&#xff0c;并提供ChatGPT的具体操作指南。 1. 确定研究…

LabVIEW继电器视觉检测系统

随着制造业的自动化与高精度要求不断提升&#xff0c;传统的人工检测方法逐渐难以满足高效和高精度的需求。特别是在航空航天、医疗设备等高端领域&#xff0c;密封继电器推动杆部件的质量直接影响到设备的性能与可靠性。LabVIEW自动化视觉检测系统&#xff0c;能对推动杆部件进…

SYN590RH

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围&#xff0c;低功耗&#xff0c;高性能&#xff0c;无需外置AGC电容&#xff0c;灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

网络编程_day6

目录 【0】复习 并发服务器实现思路梳理 多进程 多线程 IO多路复用select 【1】setsockopt&#xff1a;设置套接字属性 socket属性 设置地址重用 【2】超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函…