《解构领域驱动设计》- 软件复杂度解析

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

更多内容关注微信公众号:fullstack888

15061dc4eaed92ec2ae241e6851ce945.jpeg

复杂度定义

复杂系统是由大量相互作用的部分组成的系统。与整个系统比起来,这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性的通信,并且组成部分的相互作用导致了复杂行为。

在软件系统中,函数、类、模块、组件和服务等都可以视为组成部分,他们之间的相互作用最终导致了软件系统的复杂行为。

复杂度成因分析

8b1d30ed97aa23441b3eb2d174ea9324.png

下面通过如下示例来更直观的感受下理解能力和预测能力两个维度对复杂度的描述:

a446b8a75b24eb25dbfacfcd2012df29.png

  • 内衣:原理简单,功能单一

  • 手表:结构复杂,功能明确可预测

  • 三人团队:需要通过简单的沟通和协作,做到团队成员间的角色和职责清晰可控

  • 城市:城市建设的空间结构、人员结构都比较复杂,需要人花较多时间才能熟悉,城市的规划也随时间存在不确定性风险,比较难以预测结果

  • 双摆:结构简单,但是对初始设置具有高度敏感性,其行为不可预测

  • 股市:影响因素多且复杂,不可控,不可预测,是个典型的混沌模型

软件系统的复杂度分析

软件系统属于“复杂难解”+“复杂难测”,跟城市建设属于同一复杂度。下面从理解能力和预测能力两方面对软件系统的复杂度进行分析。

理解能力

规模分析

系统规模的扩张,不仅取决于需求的数量,还取决于需求功能点之间的关系,评估软件系统规模的元素包括但不限于以下几个

  • 代码行数

  • 包、类、方法的数量

  • 继承的层次

  • 方法的调用数

  • 圈复杂度

开发过程中有很多的问题会导致软件系统规模的无序扩张,比较典型的有下面几个,资深程序员应该都遇到过

  • 函数存在副作用。调用时可能对函数的结果做了隐含的假设

  • 类的职责繁多,导致开发人员不敢轻易修改,因为不清楚其影响范围

  • 热点代码被频繁变更,职责被包裹了一层又一层,没有清晰的业务边界

  • 隐藏的 bug,在某些个不为人知的诱发条件具备时,就会让整个调用链路崩溃

  • 不同业务场景的不同例外场景,其处理方式各不相同

  • 同步与异步代码混合在一起,不可预知的调用链路顺序

结构分析

结构之所以变得复杂,多数情况下是由系统的质量属性决定的。软件系统从最初的单体系统到现在的分布式微服务体系,整个发展历程一直是不断拆分的微型化过程。软件系统的复杂同时也会加剧人员组织结构的复杂度。康威定律指出,任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。

无论是优雅的设计还是拙劣的设计都会给系统带来复杂度的增加,不同的是,优雅的设计是主动控制结构的复杂度,拙劣的设计带来的复杂度是偶发的,无序的,是技术债。

无序设计的几个典型表现:

  • 代码没有显而易见的进入系统的入口

  • 不存在一致性,不存在风格,也没有将不同的部分组织在一起的统一概念

  • 系统中的控制流让人觉得不舒服,无法预测

  • 系统中有太多“坏味道”

  • 数据很少放在他被使用的地方,滥用缓存,视图让数据停留在更方便的地方

预测能力

影响预测能力的关键要素在于变化,而我们无法预知未来,也就无法预测未来可能发生的变化,这就带来了软件系统的不可预测性。对变化的应对不妥,就会导致软件系统的过度设计或设计不足。

过度设计的表现

  • 引入不必要的抽象来保证产品的可扩展性

设计不足的表现

  • 没有明确识别出未来确认会发生的变化,或者对需求变化发展的方向缺乏前瞻

如何控制软件复杂度

控制规模

领域驱动设计对软件复杂度的控制之道就是竭力改变设计的质量,然后在解空间中通过“分而治之”的方法将庞大的系统拆分为一个个小的软件元素来解决问题空间中的一个个细粒度的问题。拆分手段就是限界上下文和上下文映射,它们是战略设计阶段的核心。

清晰结构

为避免业务逻辑的复杂度与技术实现的复杂度混杂在一起,就需要确定业务逻辑与技术实现的边界,从而隔离各自的复杂度。这种隔离也符合关注点分离的设计原则。为此,领域驱动设计引入了分层架构,分层架构将业务逻辑封装到领域层,支撑业务逻辑的技术实现放到基础设施层,应用层既扮演了领域层的外观,又解决了业务逻辑跟技术实现的协作问题。

领域驱动设计通过限界上下文隔离了业务能力的边界,通过分层架构隔离了业务逻辑与技术实现,如此,保证了整个系统具有了清晰的结构,实现了有序设计。

响应变化

应对变化最好的方式就是将变化锁进笼子里,通过模式等抽象方法将不同维度、不同粒度的变化限定在一个可控的范围内,当变化来临时能及时感知,并作出最小的适应性改动。

通过领域建模可以将看似分散的事务抽象成一个统一的领域模型,将复杂的业务通过可视化的方式表达出来。当需求发生变化时,通过比对抽象出来的业务模型,即可敏锐的发现增量变化的部分,从而以最小的代价响应新增的需求。

- END -

往期回顾

从传统数据库痛点看分布式数据库选型问题

日志的艺术

更人性化的无阈值监控不再为无效告警烦恼

SQL查找是否"存在",别再count了!

最大连接数65535,服务器是如何应对百万千万的并发的?

5 分钟搞懂 Web3 架构

一支不足百人的团队创造了 ChatGPT :90 后挑大梁,应届生 11 人,华人抢眼

JVM碰到问题,这几个工具不能少

cfa77aeddded80ff1aea4a24cf0f2f1e.png

技术交流,请加微信: jiagou6688 ,备注:Java,拉你进架构群

分布式架构原理与实践+解构领域驱动设计 为了完成上面的订单业务流程,将分布式系统分为了四层。客户端:这是用户与系统之间的接口。了提升用户体验,会利用 HTTP 缓存手段将部分静态资源缓存下来,同时也可以将这部分静态资源缓存到 CDN 中,因为 CDN 服务器通常会让用户从比较近的网络节点获取静态数据。负载均衡器(以下称接入层):负载均衡器可以通过用户 IP 将用户的请求路由到不同的服务器集群。另外,在负载均衡这一层,还可以进行流量控制和身份验证等操作。 阅读详情

相关推荐

业务代码与技术代码

当程序员大多都有一个共同的经历:当你在改一段复杂的代码时,你一边吐槽是哪个小可爱写的这段像一坨*一样的代码时,一边打开了提交记录,赫然发现竟然是自己3个月前写的! 明明看起来很简单的业务,但写出来的软件代码为什么会这么复杂呢?这是所有程序员都可能会思考的问题。 “领域驱动设计”号称是一种能够应对软件复杂性的解决方案,它的核心思路是从业务视角出发,去设计软件,并试图把技术复杂性和业务复杂性分离开来。但领域驱动设计是20年前就提出来的,那时候的软件面临的技术挑战和技术复杂性和现在不可同日而语,有些规则可

m0_64262620的博客 359

最新领域驱动设计(DDD)资料合集(23份).zip

最新领域驱动设计(DDD)资料合集,共23份。 金融支付系统的改造之路 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的模版和工具实践 基于FP的DDD实践 架构分层模型适配 可视化的遗留系统微服务改造 领域建模的易与难 领域驱动架构透析与架构解耦 领域驱动设计在系统重构中的应用实践 如何让DDD落地 淘宝应用架构升级——反应式架构的探索与实践 微服务的容器化实践 物联网平台的反应式设计 演进式架构的平台化落地 以DDD思想为基础的轻量级业务中台开发框架 用状态机封装领域逻辑 在一个实际复杂业务中落地DDD方法与相关架构 DDD促进传统架构微服务转型 DDD的为与不为 DDD实践中的那些坑 DDD在旅游电商架构演进中的实践 Every Entity as A Microservice Praise for Implementing Domain-Driven Design

如何让代码评审真正有效:动态建模、角色解构与文化重塑

代码评审(Code Review)是保障软件质量的关键人工防线,其本质远超语法检查或Bug发现,而是知识传递、风险预演与标准对齐的协同过程。基于静态清单的评审易流于形式,而结合模块风险热力图、上下文快照与历史债务追踪的动态建模,可显著提升高危问题拦截率。同时,将评审者细分为架构守门员、业务翻译官等四类角色,匹配差异化能力要求,并辅以延迟评审、双盲初筛等反直觉机制,能系统性降低认知偏差与防御失效。这些实践共同指向一个目标:让每一次评审都产生真实可度量的质量防御价值。

weixin_30254435的博客 436

实现领域驱动设计(完整PDF版)

DDD的全称为Domain-driven Design,即领域驱动设计。下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,还有驱动是什么意思,什么驱动什么。领域驱动设计(DDD)是教我们如何做好软件的,同时也是教我们如何更好地使用面向对象技术的。它为我们提供了设计软件的全新视角,同时也给开发者留下了一大难题:如何将领域驱动设计付诸实践?Vaughn Vernon 的这本《实现领域驱动设计》为我们给出了全面的解答。, 《实现领域驱动设计》分别从战略和战术层面详尽地讨论了如何实现DDD,其中包含了大量的最佳实践、设计准则和对一些问题的折中性讨论。《实现领域驱动设计》共分为14 章,在DDD 战略部分,《实现领域驱动设计》向我们讲解了领域、限界上下文、上下文映射图和架构等内容,战术部分包括实体、值对象、领域服务、领域事件、聚合和资源库等内容。一个虚构的案例研究贯穿全书,这对于实例讲解DDD 实现来说非常有用。, 《实现领域驱动设计》在DDD 的思想和实现之间建立起了一座桥梁,架构师和程序员均可阅读,同时也可

设计之道 张逸

张逸 目 录设计,看上去很美设计,由你掌握重构初体验从企业的运行价值链说起使用极限编程改善项目的设计和灵活性从实例谈OOP、工厂模式和重构从实例谈Adapter 模式从Adapter模式到Decorator模式Visitor模式之可行与不可爱从容自若的CTOStrategy 模式的应用实践Factory Method 模式Composite 模式Iterator 模式

解构领域驱动设计- DDD 设计统一过程

领域驱动设计的核心是模型驱动设计,而模型驱动设计的核心又是领域模型,领域模型必须在统一语言的指导下获得。领域模型又可进一步细分为核心子领域、通用子领域和支撑子域。系统上下文、限界上下文、分层架构和聚合都属于领域驱动设计的边界控制手段,他们的区别在于对业务划分的粒度和维度不同。领域驱动设计统一过程“人类是通过在问题空间中寻找解决方案来解决问题的”同理,软件系统的构建实则是对问题空间的求解,以获得构成...

架构文摘 682

解构领域驱动设计--思维导图

小强快跑~~ 1545

三年磨一剑,领域驱动设计布道师出版了《解构领域驱动设计

解构领域驱动设计 作者:张逸 本书全面阐释了领域驱动设计(domain-driven design,DDD)的知识体系,内容覆盖领域驱动设计的主要模式与主流方法,并在此基础上提出“领域驱动设计统一过程”(domain-driven design unified process,DDDUP),将整个软件构建过程划分为全局分析、架构映射和领域建模3个阶段。除给出诸多案例来阐释领域驱动设计统一过程中的方法与模式之外,本书还通过一个真实而完整的案例全面展现了如何进行领域驱动设计统一过程的实施和落地。为了

人邮异步社区 1045

架构师面试必备:领域驱动设计(DDD)实战指南——如何用DDD思想解构复杂业务系统

在当今快速变化的技术环境中,领域驱动设计(DDD)已经从一种可选的设计方法,演变为评估架构师能力的关键指标。界限上下文是DDD中最关键的战略设计模式,它定义了特定模型的边界,在这个边界内,领域术语、业务规则和模型元素具有一致的含义。值对象的不可变性确保了其在领域模型中的安全性,当需要修改时,我们不是修改原有的值对象,而是创建一个新的实例。从业务需求分析到领域模型设计,从界限上下文划分到聚合实现,每一步都需要深入理解业务本质,运用DDD的核心概念和模式来构建清晰、可维护的系统架构。

zuiyuelong的博客 1121

有了这两本书,学习领域驱动设计会很容易

自2003年EricEvans的著作《领域驱动设计》面世以来, 领域驱动设计(DDD) 相关的实践书籍并不多,整体的理论发展速度并不快,以至于很长一段时间,开发团队的实践过程总是磕磕绊绊, 这让他们觉得领域驱动设计的门槛很高,甚至有人怀疑领域驱动设计是否是一种足够成熟与体系化的方法论。 学习领域驱动设计有这两本书,一切将不再是 1、解构领域驱动设计 所谓“解构”,就是解析与重构: 解析,就是要做到知其然更知其所以然; 重构,则要做到青出于蓝而胜于蓝。 本书不再满足于粗略地将内容划分为战略.

人邮异步社区 4500

DDD领域驱动设计深度解析

​在软件开发中的领域指的是软件应用开发过程中涉及的知识和活动范围。在软件设计中更加通用的说法是领域层和领域逻辑,这两个概念更加常用的近义词则是业务层和业务逻辑。​对于领域驱动的基础和本质还是面向对象方法。我们首先要能够将业务逻辑涉及的概念合理拆解成对象。这是软件工程人员的基本功,如果连这一点还不能做好那其实就还没有入门现代软件设计思想。举个简单的业务场景。银行的一个储户要在银行的账户中取一笔钱,但是如果这笔钱的数额超过了他账户中的金额,那么系统需要阻止这笔交易,并发送提示或者视情况锁定账户一段时间。....

Rocky的技术博客 949

聚焦重新思考,DDDChina2021领域驱动设计峰会圆满落幕

12月2日-5日,由中关村智联软件服务业质量创新联盟主办的第五届DDDChina领域驱动设计峰会在线召开。会议以“DDD Revival”为主题,打造了全体大会,国际论坛,台湾论坛,四大主题论坛,三大工作坊5大板块,集结50+国内外业界知名业务设计、系统工程及各开发领域的架构师、专家,共同探讨如何构建适应于数字化时代的架构设计方法及实践,并分享一线实践经验和工具平台,开启对DDD的持续重新思考。 会议吸引了来自各个行业的资深业务/系统架构师、技术主管、产品经理、研发总监、项目经理、资深测试开发、质...

cover_se的博客 3

业务代码和技术代码

点击↑上方↑蓝色“编了个程”关注我~这是Yasin的第 56 篇原创文章程序员大多都有一个共同的经历:当你在改一段复杂的代码时,你一边吐槽是哪个小可爱写的这段像一坨*一样的代码时,一边打开...

yasinshaw的博客 1850

领域驱动设计实战:从通用语言到聚合设计的核心模式解析

在应对复杂业务系统的软件开发中,领域驱动设计(DDD)提供了一套核心的思维框架与设计原则。其原理在于通过建立统一的业务语义模型,将复杂的业务逻辑映射到清晰的软件结构中,从而提升系统的可维护性与扩展性。这一方法的技术价值在于,它能够有效管理软件核心复杂度,使代码结构随业务演进而保持清晰。其关键应用场景包括电商、金融等业务规则多变且核心逻辑复杂的系统。本文聚焦于DDD最核心的战术构建块,深入探讨了如何通过建立无歧义的通用语言来统一团队认知,并详细解析了作为一致性边界的聚合设计艺术,旨在为面临业务爆炸增长的工程团

weixin_34082789的博客 675

为什么这门技术如此重要?错过这次黄金期,就晚了!

老李一直怀疑自己是不是年纪大了,脑子跟不上了。作为十几年经验的资深 Java 工程师,维护这公司产品的核心代码的他,现在迭代产品的时候,经常出 Bug 。有时修复一个 Bug 时间,比开...

AI科技大本营 783

90% 程序员都吃亏在这门技术上了,你呢!

老李一直怀疑自己是不是年纪大了,脑子跟不上了。作为十几年经验的资深 Java 工程师,维护这公司产品的核心代码的他,现在迭代产品的时候,经常出 Bug 。有时修复一个 Bug 时间,比开...

CSDN云计算 693

探索Java17中Record类的革命性特性及其对现代软件开发的深远影响

这种设计不仅保证了数据的一致性和安全性(通过final字段和浅不可变性),还通过透明的数据建模降低了业务逻辑的复杂度。通过简洁的语法,开发者可以仅用一行代码就定义一个不可变的数据聚合,这极大地提升了开发效率并减少了人为错误的可能性,标志着Java语言在现代化进程中迈出了关键一步。从工程实践角度看,Record显著减少了代码量并提高了代码的可读性。其显式化的设计使数据结构的意图一目了然,方便新成员快速理解系统,同时减少了因手动实现数据方法不一致而导致的潜在bug,从而提高了软件的长期可维护性。

lawczj的博客 355

肝货!万字长文助你上手DDD

限界上下文是语义和语境的边界。在问题空间,统一语言形成了团队对领域概念的统一表达,子领域形成了领域概念之间的边界。而在解空间,限界上下文可以看做是统一语言+子领域的融合体,统一语言需要在限界上下文内才具有明确的业务含义。以电商购物场景为例。在进行商品下单后,系统会生成一个订单;在用户付款完成后,系统也会生成一个订单;到了物流派送流程,系统还会生成一个订单。

bjmsb79的博客 251
上一篇: 从传统数据库痛点看分布式数据库选型问题
下一篇: BitMap到底牛逼在哪?
qianshanding0708
博客等级 码龄11年 397粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值