本文书接上回《反DDD模式之关系型数据库》,关注公众号(老肖想当外语大佬)获取信息:

  1. 最新文章更新;

  2. DDD框架源码(.NET、Java双平台);

  3. 加群畅聊,建模分析、技术实现交流;

  4. 视频和直播在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模式之“复用”的更多相关文章

  1. javascript优化--09模式(代码复用)02

    原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...

  2. javascript优化--08模式(代码复用)01

    优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...

  3. DDD模式

    http://www.cnblogs.com/landeanfen/p/4816706.html https://www.cnblogs.com/malaoko/p/8732552.html

  4. javascript 模式(1)——代码复用

    程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...

  5. javascript代码复用模式

    代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...

  6. 深入理解JavaScript系列(45):代码复用模式(避免篇)

    介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...

  7. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

  8. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

  9. 关于DDD领域驱动设计的理论知识收集汇总

    原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...

  10. 怎么说服领导,能让我用DDD架构肝项目?

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/ezd-6xkRiNfPH1lGwhLd8Q 沉淀.分享.成长,让自己和他人都能 ...

随机推荐

  1. LM Studio + open-webui 快速本地部署大语言模型

    目录 一.前言 二.环境准备 三.安装设置 四.下载模型并运行 五.配置 open-webui 写在结尾 一.前言 自 OpenAi 发布 ChatGPT 对话性大语言模型,AI 这两年发展迎来爆发, ...

  2. java面试一日一题:rabbitMQ如何保证消息不丢失

    问题:请讲下rabbitMQ如何保证消息不丢失 分析:该问题属于概念题,同时也是一个设计方面的题,牵扯到部分设计层面的东西: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ在保证消息不丢失方 ...

  3. java web 开发框架编

    学习web 框架上开发需要的是安装  mysql 8.0  idea 2022 git  2.2.23  node 16以上 (新版本不好拉有些库了)jdk 最好是17以上 jdk8也是行的,反正不管 ...

  4. SQL Server 清除一个数据库下所有表数据,保留表结构

    用法:在需要清空数据的数据库创建并执行存储过程,该存储过程并不会影响其他数据库 请小心使用这些脚本,确保在生产环境之前备份您的数据库.️ 存储过程: CREATE PROCEDURE ClearAll ...

  5. 全网最适合入门的面向对象编程教程:27 类和对象的Python实现-Python中异常层级与自定义异常类的实现

    全网最适合入门的面向对象编程教程:27 类和对象的 Python 实现-Python 中异常层级与自定义异常类的实现 摘要: 本文主要介绍了在使用 Python 进行面向对象编程时,异常的层级和如何使 ...

  6. 我用Awesome-Graphs看论文:解读X-Stream

    X-Stream论文:<X-Stream: Edge-centric Graph Processing using Streaming Partitions> 前面通过文章<论文图谱 ...

  7. web3 产品介绍:Decentraland:开启你的虚拟现实区块链游戏之旅

    Decentraland(https://decentraland.org/)是一款基于区块链技术的虚拟现实游戏,它将去中心化的概念引入游戏世界,为玩家提供了一个创造.交互和探索的虚拟空间.在Dece ...

  8. 【转载】 linux中umask命令介绍

    版权声明:本文为CSDN博主「立二拆四i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/weixin_4408 ...

  9. .gitignore文件的使用方法(学习总结版)—— .gitignore 文件的配合用法

    本文紧接前文: .gitignore文件的使用方法(学习总结版) ============================================= 本文主要讨论前文中所说的一个操作,即: . ...

  10. 瑞芯微-I2S | 音频驱动调试基本命令和工具-基于rk3568-2

    基于Linux嵌入式设备常用调试方法很多,本文一口君把调试语音用到的工具和方法给大家做一个简单的介绍. 1. procfs.sysfs Linux系统上的/proc目录是一种文件系统,即proc文件系 ...