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,分离出有价值的模块,直到你觉得没有有价值的模块需要移动。

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

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

相关文章

OSI公布OSAID 1.0版 “开源人工智能”首次被定义

在2024年ALL THINGS OPEN大会上,Open Source Initiative (OSI) 正式发布了开源人工智能定义(OSAID)1.0版本,标志着全球首个开源AI标准的诞生。OSAID将作为衡量人工智能系统是否符合“开源人工智能”标准的依据,为社区主…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求:批量注册5个用户,从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

pycharm 中 json 库的常用操作

文章目录 1. 导入 json 模块2. 将 Python 对象编码为 JSON 字符串(序列化)3. 将 JSON 字符串解码为 Python 对象(反序列化)4. 从文件中读取 JSON 数据5. 将 Python 对象写入 JSON 文件6. 处理 JSON 解码错误总结 在 PyCharm 中&am…

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

在移动开发中,展示复杂的富文本是一项常见需求,而有时候我们需要将HTML文件直接嵌入到Flutter应用中。使用HTML不仅能丰富内容展示,还可以避免重复开发。但是,如何在Flutter中高效、优雅地加载本地HTML呢?这篇文章就带…

MySQL数据库数据类型介绍

1. 数值类型 整数类型: TINYINT:1 字节,范围 -128 到 127(或 0 到 255)。SMALLINT:2 字节,范围 -32,768 到 32,767(或 0 到 65,535)。MEDIUMINT:3 字节&…

PART 1 数据挖掘概论 — 数据挖掘方法论

目录 数据库知识发掘步骤 数据挖掘技术的产业标准 CRISP-DM SEMMA 数据库知识发掘步骤 数据库知识发掘(Knowledge Discovery in Database,KDD)是从数据库中的大量数据中发现不明显、之前未知、可能有用的知识。 知识发掘流程(Knowledge Discovery Process)包括属性选择…

【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影

文章目录 C 前缀和详解:基础题解与思维分析前言第一章:前缀和基础应用1.1 一维前缀和模板题解法(前缀和)图解分析C代码实现易错点提示代码解读题目解析总结 1.2 二维前缀和模板题解法(二维前缀和)图解分析C…

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 发布日期:2024 年 10 月 28 日 Xcode 16.1 包含适用于 iOS 18.1、iPadOS 18.1、Apple tvOS 18.1、watchOS 11.1、macOS Sequoia 15.1 和 visionOS 2.1 的 SDK。Xco…

Codeforces Round 946 (Div. 3) G. Money Buys Less Happiness Now(反悔贪心)

题目链接 Codeforces Round 946 (Div. 3) G. Money Buys Less Happiness Now 思路 我们维护当前拥有的钱 s u m sum sum和一个大根堆,大根堆记录用了哪些 c i c_{i} ci​。 我们先尝试获得当前月的幸福, s u m s u m − c i sum sum - c_{i} sumsu…

LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化

【LetMeFly】3211.生成不含相邻零的二进制字符串:二进制枚举位运算优化 力扣题目链接:https://leetcode.cn/problems/generate-binary-strings-without-adjacent-zeros/ 给你一个正整数 n。 如果一个二进制字符串 x 的所有长度为 2 的子字符串中包含 …

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理(parent) 三、提供 starter简化 Maven 配置 四、自动配置 Spring(引导类) 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理(parent) SpringBoot项目都会继…

Gin框架html/vue前端使用hls.js播放/点播m3u8(hls)格式视频

说明 在web应用开发时遇到在线播放m3u8格式视频,由于m3u8是多分片视频,原生video标签无法直接播放,所以需要js对m3u8处理才能播放,网上有很多插件,这里我选择最近简单方法hls.js播放,引入一个js文件即可。…

【云原生】云原生后端:监控与观察性

目录 引言一、监控的概念1.1 指标监控1.2 事件监控1.3 告警管理 二、观察性的定义三、实现监控与观察性的方法3.1 指标收集与监控3.2 日志管理3.3 性能分析 四、监控与观察性的最佳实践4.1 监控工具选择4.2 定期回顾与优化 结论参考资料 引言 在现代云原生架构中,监…

【感知模块】深度神经网络实现运动预测

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言运动预测(Motion Prediction)感知中的运动预测(深度神经网络)前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! …

数据库之多表查询

一.子查询 在SQL语句中嵌套select语句,称为嵌套查询,又称子查询 # 语法select * from 表1 where 字段1(select 字段1 from 表2); 子查询是一个嵌套在select、insert、update 或delete 语句或其他子查询中查询 注意:将子查询和比较运算符联…

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中,企业的业务流程高度依赖于数据的准确性和完整性。然而,数据失真问题却如同隐匿在流程中的“暗礁”,频繁地给企业的业务流程顺畅度带来严重挑战,进而影响企业的整体运营效率和竞争力。 数据失真的表…

使用 Pandas 进行时间序列分析的 10个关键点

使用Pandas进行时间序列分析的10个关键点(由于篇幅限制,这里调整为10个,但实际操作中可能涉及更多细节)如下: 1. 创建时间序列数据 时间序列数据是指在多个时间点上形成的数值序列。在Pandas中,可以使用t…

vscode和pycharm在当前工作目录的不同|python获取当前文件目录和当前工作目录

问题背景 相信大家都遇到过一个问题:一个项目在vscode(或pycharm)明明可以正常运行,但当在pycharm(或vscode)中时,却经常会出现路径错误。起初,对于这个问题,我也是一知…

RN如何实现页面渐变背景

在React Native(RN)中,实现页面渐变背景通常需要使用LinearGradient组件。LinearGradient是React Native的一个第三方库,它允许你创建线性渐变效果。以下是一个简单的步骤指南,教你如何在React Native中实现页面渐变背…

基于Java的电商书城系统源码带本地搭建教程

技术框架:jQuery MySQL5.7 mybatis jsp shiro 运行环境:jdk8 IntelliJ IDEA maven3 宝塔面板 系统功能介绍 该系统分为前台展示和后台管理两大模块,前台主要是为消费者服务。该子系统实现了注册,登录, 以及…