反DDD模式之“复用”
本文书接上回《反DDD模式之关系型数据库》,关注公众号(老肖想当外语大佬)获取信息:
最新文章更新;
DDD框架源码(.NET、Java双平台);
加群畅聊,建模分析、技术实现交流;
视频和直播在B站。
背景
在我们软件开发过程中,“复用接口(webapi)”、“复用服务(service)”是非常常见的现象,很多老司机都会为自己设计的代码可以“复用”而感到有成就感。然而当我们在一个较长的时间周期去看待系统的迭代过程,会发现这些“复用”,往往会成为后来迭代的绊脚石,修改代码牵一发而动全身,细微的修改也会引发广泛的影响面,从这个角度看,“复用”是不利于系统的可维护性的。
今天我们就来深度探讨一下“复用”和DDD之间的关系,打开一个不同的视角。
复用的本质
下图展示了一个非常典型的复用例子,不少开发者习惯提供一个“保存接口”来满足“创建”和“编辑”场景:

按照我们的惯例,“连线”代表着“耦合”,所以“复用”接口,本质上就是把不同的业务场景耦合在了一起,当一个场景发生变化时,同时会影响到其它场景。

进一步地推导,两个元素的耦合即打破它们的边界,它们因为耦合而成为了一个更大的整体:

而DDD的价值观是保持明确的边界,打破边界则与之完全相反,因此可以得出打破边界即反DDD:

把上面的推导过程整合在一起就是下图这样:

去掉中间过程,最终我们得出标题的的结论“复用”是一种“反DDD模式”:

限定条件
另外一方面,“复用”一词的含义还是比较广泛的,例如我们有两个系统,A系统和B系统都调用某家的“支付接口”,这算不算复用“支付接口”呢?在我们今天讨论的角度看,这不算复用,因为都是“支付场景”调用“支付接口”,场景其实是同一个。
那么我们需要限定一下范围,这里探讨的复用是指:为不同的场景或者目的所做的复用。基于这个范围我们可以看到一些典型的复用案例:
RestfulAPI复用
后端服务复用
业务中台复用

而这些场景,我相信很多老司机都有过痛彻心扉的体验,复用一时爽,迭代火葬场。
不要复用
基于前面推导的认知,我们知道复用作为反DDD模式,并不会为我们带来价值,反倒会使得系统丧失可维护性,因此我们在实践DDD过程中总结了一些原则,其中重要的部分就是“不要复用”:
为每个前端场景创建一个API;
为每个API创建各自的输入输出实体(RequestDto、ResponseDto);
为每个操作创建各自的命令(Command);
下面贴出DDD原则的文档和截图:
https://netcorepal.github.io/netcorepal-cloud-framework/rules-of-ddd/rules-of-ddd/

实战项目
目前开源DDD实战项目d3shop已经启动了,你可以自由地参与需求讨论、建模设计、代码贡献中来,我们每周都会针对模型设计、代码做直播评审和连麦讨论,从而帮助你更沉浸地体验DDD实践带来的成长和收益。
项目代码:https://github.com/netcorepal/d3shop
反DDD模式之“复用”的更多相关文章
- javascript优化--09模式(代码复用)02
原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...
- javascript优化--08模式(代码复用)01
优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...
- DDD模式
http://www.cnblogs.com/landeanfen/p/4816706.html https://www.cnblogs.com/malaoko/p/8732552.html
- javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...
- javascript代码复用模式
代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...
- 深入理解JavaScript系列(45):代码复用模式(避免篇)
介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...
- [转] DDD领域驱动设计(三) 之 理论知识收集汇总
最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...
- 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)
前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- 怎么说服领导,能让我用DDD架构肝项目?
作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/ezd-6xkRiNfPH1lGwhLd8Q 沉淀.分享.成长,让自己和他人都能 ...
随机推荐
- LM Studio + open-webui 快速本地部署大语言模型
目录 一.前言 二.环境准备 三.安装设置 四.下载模型并运行 五.配置 open-webui 写在结尾 一.前言 自 OpenAi 发布 ChatGPT 对话性大语言模型,AI 这两年发展迎来爆发, ...
- java面试一日一题:rabbitMQ如何保证消息不丢失
问题:请讲下rabbitMQ如何保证消息不丢失 分析:该问题属于概念题,同时也是一个设计方面的题,牵扯到部分设计层面的东西: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ在保证消息不丢失方 ...
- java web 开发框架编
学习web 框架上开发需要的是安装 mysql 8.0 idea 2022 git 2.2.23 node 16以上 (新版本不好拉有些库了)jdk 最好是17以上 jdk8也是行的,反正不管 ...
- SQL Server 清除一个数据库下所有表数据,保留表结构
用法:在需要清空数据的数据库创建并执行存储过程,该存储过程并不会影响其他数据库 请小心使用这些脚本,确保在生产环境之前备份您的数据库.️ 存储过程: CREATE PROCEDURE ClearAll ...
- 全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现
全网最适合入门的面向对象编程教程:27 类和对象的 Python 实现-Python 中异常层级与自定义异常类的实现 摘要: 本文主要介绍了在使用 Python 进行面向对象编程时,异常的层级和如何使 ...
- 我用Awesome-Graphs看论文:解读X-Stream
X-Stream论文:<X-Stream: Edge-centric Graph Processing using Streaming Partitions> 前面通过文章<论文图谱 ...
- web3 产品介绍:Decentraland:开启你的虚拟现实区块链游戏之旅
Decentraland(https://decentraland.org/)是一款基于区块链技术的虚拟现实游戏,它将去中心化的概念引入游戏世界,为玩家提供了一个创造.交互和探索的虚拟空间.在Dece ...
- 【转载】 linux中umask命令介绍
版权声明:本文为CSDN博主「立二拆四i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/weixin_4408 ...
- .gitignore文件的使用方法(学习总结版)—— .gitignore 文件的配合用法
本文紧接前文: .gitignore文件的使用方法(学习总结版) ============================================= 本文主要讨论前文中所说的一个操作,即: . ...
- 瑞芯微-I2S | 音频驱动调试基本命令和工具-基于rk3568-2
基于Linux嵌入式设备常用调试方法很多,本文一口君把调试语音用到的工具和方法给大家做一个简单的介绍. 1. procfs.sysfs Linux系统上的/proc目录是一种文件系统,即proc文件系 ...