反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 沉淀.分享.成长,让自己和他人都能 ...
随机推荐
- oeasy教您玩转vim - 58 - # 块可视化
块可视化编辑 回忆上节课内容 上次我们了解到行可视模式 行可视模式 V 也可配合各种motion o切换首尾 选区的开头和结尾是mark标记 开头是 '< 结尾是 '> 可以在选区内进 ...
- TIER 2: Oopsie
TIER 2: Oopsie Web 渗透 此次靶机结合前面知识,非常简单: nmap 扫描,发现 22 和 80 端口开放 服务 80 的 HTTP 服务 之后使用继续 Web 渗透: 使用 Wap ...
- 02-springboot配置
目录 1,前言 2,YAML介绍 3,获取yml配置文件内容 4,springboot的配置文件 5,springboot使用@Value实现映射 6,@PropertySource.@ImportR ...
- 阅读翻译Mathematics for Machine Learning之2.7 Linear Mappings
阅读翻译Mathematics for Machine Learning之2.7 Linear Mappings 关于: 首次发表日期:2024-07-23 Mathematics for Machi ...
- Linux 中 Crontab 执行时的环境变量问题(allure命令不执行)
前几天做了UI自动化脚本部署linux服务器,但是放下脚本的allure命令不执行(生成allure报告和启动allure服务的命令不执行),然后就各种找问题,一开始怀疑是allure的环境变量问题, ...
- 【Vue2】Filter 过滤器
过滤器案例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Hession-free 的共轭梯度法的高效计算版本的部分代码(pytorch实现,实现一阶求导的一次计算重复使用)
Hession-free 的共轭梯度法的高效计算版本的部分代码(pytorch实现,实现一阶求导的一次计算重复使用) Hession-free 的共轭梯度法在求解 H*v 的时候是先求一阶导,即雅可比 ...
- 【转载】 Integrating New Games into Retro Gym
https://medium.com/aureliantactics/integrating-new-games-into-retro-gym-12b237d3ed75 OpenAI's retro ...
- 【转载】 Mobaxterm 中文输入Backspace按键问题
版权声明:本文为CSDN博主「Flynnsin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_45830 ...
- 2023.4.12.汇报.pptx
6月份汇报想法 8月份写论文 ==========================================================