说点题外话01|好耦和与坏耦和
徐昊
该思维导图由 AI 生成,仅供参考
你好,我是徐昊。今天我们专门来说点题外话(都知道,这门课里的题外话,都不是题外话)。
目前我们正好完成了旧约部分的学习。也就是说:
内容整体来说是比较紧凑的,知识密度也比较大,所以在进入新约部分的学习之前,我希望你能喘口气儿,稍微回顾一下我们学习过的内容。
要知道,反思是学习真正发生的时候。毕竟学习的目的是改变我们的行为和思维,而一味地摄入内容和信息呢,并不一定真的能达到你想要的效果。
那么接下来,我将会集中回答一系列问题,帮助你更好地理解我们在旧约部分讲到的内容。因此,如果你有什么迫切的疑问,请尽快在评论区留言。时间有限,抓紧上车,入股不亏(当然,非官方版本是因为作者突发腰伤,需要休刊)。
左为《如何落地业务建模》作者徐昊,右为日本漫画家富坚义博
今天,我想先来谈一谈耦合的问题。因为我从收到的留言和问题反馈中,发现很多同学对耦合已经有创伤后应激障碍(PTSD Post Traumatic Stress Disorder)了。有同学经常担心是不是会存在耦合,然后开始准备用各种手段消除耦合,等等。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
徐昊在本文中探讨了耦合的概念,区分了必然耦合和偶然耦合,并强调了对业务能力的理解和重构。他指出必然耦合是业务的必要部分,而偶然耦合则是变化的部分。通过提取业务能力,可以将偶然耦合转化为必然耦合,从而简化对业务问题的理解。作者还提出了思考题,让读者从必然耦合和偶然耦合的角度思考领域模型的多层架构,以及识别偶然耦合的技巧。文章强调了对业务的深入理解和对耦合的合理处理对于软件设计的重要性。 文章通过对耦合概念的深入探讨,引发了读者对于软件设计中耦合问题的思考。强调了对业务能力的理解和重构,以及将偶然耦合转化为必然耦合的重要性。这些观点对于读者在软件设计和架构方面有着重要的指导意义。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何落地业务建模》,新⼈⾸单¥68
《如何落地业务建模》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(14)
- 最新
- 精选
- Jxin1.讨论松耦合的前提是想清楚,为什么我们要松耦合,或则说所谓的高耦合有什么坏处。 2.松耦合的目标是维持代码的稳定性,防止由于多种变化方向或者变法频率不一样的代码耦合在一起,导致牵一发动全身的窘境,使代码变得极不稳定,既存在风险又增加运维成本。 3.所以至少我们能得到一条线索。松耦合需要保证一个类或者一个函数下的代码,都是一个维度的东西。而一个维度的东西可以认为就是徐昊老师说的必然耦合的部分。 4.铺垫完,回到我们的问题。基础设施层,到底应该是偶然耦合,还是必然耦合呢?我的答案是这两块其实都有。 5.先说基础设施偶然耦合的部分,比如db存储。我们的目的是将数据持久化,对应到业务角度的模型就是所谓的仓储层接口,仓储层接口与聚合/领域服务是一个维度的东西,所以仓储层接口是必然耦合的部分。而仓储层接口的实现,这就属于偶然耦合的部分,选择什么存储方式,在业务模型的角度并不关心。同理的还有实现事件发布接口的mq框架。 6.接下来说基础设施必然耦合的部分,比如透传traceId/全局异常处理/打印中间件调用出入参等等。这些都是与业务无关,与系统技术维护相关,属于功能增强的部分。当然,这一部分也可以进一步抽象出必然部分和偶然部分,然后保证必然部分的文档和偶然部分的灵活替换。但是,大部分时候这些功能增强基本不变,且就算变了改动成本也很低,可以认为它们相对稳定了很多。那么再进一步区分它们的必然偶然就显得有点多此一举,毕竟它的风险和运维成本都很可控。所以我觉得这部分直接认为是必然部分也并无不可。(spring不是做了必然部分的抽象吗?我的答案是,基础框架和应用项目决策的优先级是不同的,它必须保证你的兼容性,哪怕这个兼容性永远不发挥效果) 7.综上所述,业务相关的耦合,因为维护成本大,需要区分必然与偶然部分,做抽象保证业务模型的稳定。业务无关的耦合,维护成本有限,做必然偶然部分的区分属于过度设计,我认为直接识别成必然部分不用抽象亦可。
作者回复: 必然耦合可以紧一点 偶然耦合弄松
2021-07-2026 - xxx能展开讲讲为啥CQRS是邪教吗?Event Sourcing呢?
作者回复: 要传播邪教吗
2021-07-2024 - 下弦の月基础设施属于是完成业务的必须,从业务上有必然耦合性;至于选啥实现,则是偶然耦合。 前面有提到过,对于基础设施层,可以通过封装借口提供能力解耦合。 作为小白,希望能够更多的看到如本章所讲的基础知识内容。对新手来说,这些内容在段时间能给我带来的价值是非常巨大。我感觉最欠缺的,就是这些基础的。
作者回复: 其实也不偶然。由市场人力结构决定
2021-07-203 - 陈凯杰必然耦合和偶然耦合不是绝对的,反而会相互转化,并且在不同时期,看问题的角度不同,必然和偶然也不同。所以做项目决策才会这么难
作者回复: 没有业务必然的都是偶然耦合
2021-07-202 - 冯基础设施层是偶然耦合,都是些具体实现。转换方法就是转换成实际的业务概念,这样从模型角度就屏蔽了细节,也就消除了偶然耦合。
作者回复: 也有一些消除不了的。不能硬拗
2021-07-202 - 支离书“这种盲目地对具体实现的恐惧,以及盲目地将所有具体实现都归结为偶然耦合的一刀切的做法,其实是我们行业的一大病,同时也是很多具有迷惑性的烂代码的来源。看起来整整齐齐,所有变化点都考虑到了,实则并没能简化问题,也没能降低理解难度,只是写的人自己爽了而已。” 文中支付的例子,开始说是对支付宝微信“必然耦合”,后面又通过抽象出“在线支付能力”变成了对支付宝微信的“偶然耦合”。感觉这就是盲目的将所有具体实现都归结为偶然耦合的一刀切的做法了吧。毕竟在线支付发展到今天微信支付宝占市场90%以上,不可能不支持他们了。
作者回复: 所以这不是技术决定。而是在业务环境内 判断耦合的合理性
2021-08-171 - 梦倚栏杆感觉这个抽象业务能力也是一个玄学,支付宝和微信支付可以抽象为在线支付,也可以抽象为支付,到底抽象到啥地步可能取决于一个人的长时间的工作积累。抽象的过粗和过细可能都不利于后续的维护
作者回复: 去问业务 那个能简化问题
2021-07-201 - 码农戏码老师,能力供应商模式是不是拟人化的防腐层,平时使用样式也差不多,在domain定义接口,在基础层实现,根据DIP,通过spring Ioc实现,看着的确很一样 “不要用解决方案去定义问题。而是问题定义解决方案”能不能再详细说说
作者回复: 下一课适合你
2021-07-22 - 樊野基础设施层实现的接口是必然耦合,这些接口在领域层中应该体现为业务能力而不是业务能力的具体实现。基础设施层本身是对接口(业务能力)的具体实现,是偶然耦合。
作者回复: 跳出技术来看 也不一定是偶然
2021-07-202 - 码农戏码太精彩了,现在的程序员对耦合还真是PTSD,但来源不同,一种是自己的确受到了伤害,一种是听人说会受伤害,想到了著名的“猴子实验”。这篇文章绝对是对面向接口编程以及ISP认知的重要基础 面向接口编程,在OO世界里这是上帝,放之四海皆准,所以看每个项目所有的service都有一个interface,一个impl,相当整齐,问为什么要这么做呢?面向接口编程,防止未来扩展性,但现实项目从始至终都不会有第二种实现,但不能不这么做,这是公约,谁都得这样,不然就变成那只被打的猴子 Martin Fowler有提出role interface和header interface的定义,技术还是得反馈到业务的本质,从业务上去寻找业务能力,得到必须耦合的能力,给调用方提供稳定依赖2021-08-0512
收起评论