作为目前两个最常用的两个框架,我们来看一下他们的区别,或者说,我们来看一下ddd相比较于mvc的优势
MVC
概念
尽管说mvc框架在很多情况下已经不再使用或者废弃,但是对于一些老的项目,或者说是单体项目而言,他仍然很适合
MVC 是一种非常常见且常用的分层架构,主要包括;
M - mode 对象层,封装到 domain 里。
V - view 展示层,但因为目前都是前后端分离的项目,几乎不会在后端项目里写 JSP 文件了。
C - Controller 控制层,对外提供接口实现类。DAO 算是单独拿出来用户处理数据库操作的层。
你会发现mvc的框架架构极为简单,model层一般就是domain领域层,包含了DAO,VO ,PO等对象,而在mvc框架下执行一段逻辑也是比较简单的,例如一个简单的请求
view前端处理 --> control --> 调用service --> 查询dao --> 封装vo --> 返回
例如·

那为什么我们不用简单的mvc而去学习更为复杂的ddd框架呢
MVC的优势在于简单、易上手、快速开发,对于业务规则简单、生命周期短的单体应用非常有效。
然而,随着业务复杂度的指数级增长和系统规模的扩大,基于"贫血模型"的MVC架构会暴露出以下几个根本性痛点:
MVC的缺陷
贫血的领域模型与业务逻辑碎片化
这是MVC最核心的问题。Model对象(如UserPO)仅包含数据字段和getter/setter,没有任何业务行为。所有业务逻辑都堆积在Service类中,形成庞大的"事务脚本"。
等到业务逻辑越来越多,库表数据越来越多,臃肿的代码结构难以维护
以技术维度划分,导致业务语义模糊
MVC天然地按技术层次(Controller、Service、DAO)组织代码包结构。当系统庞大后,所有业务的Service都放在service包下,所有DAO都放在dao包下。
开发者无法从一个包名理解系统提供了哪些核心业务能力。修改一个涉及"订单"的功能,可能需要横跨controller、service、dao、model等多个包,严重破坏了业务的内聚性,增加了理解和修改成本。
领域知识无法沉淀,沟通成本高
由于业务逻辑深陷在复杂的Service方法链和数据库操作中,系统的核心领域(如电商中的订单、库存、支付)没有明确的载体。业务专家(产品经理)和开发人员之间、甚至不同开发人员之间,对同一业务概念的理解可能存在偏差。
代码不能清晰表达业务意图,设计无法与业务演进同步,导致软件最终与现实业务脱节。
我觉得最后一点才是mvc架构被抛弃的原因,在当前ai编程时代,我们还需要为aiagent编写规则和法律,让ai记忆去沉淀领域知识,mvc框架无法担当当前的责任
DDD
首先毋庸置疑的是,ddd的学习成本要比mvc高很多,当前文章只会简单说一下ddd是什么,之后会单独写一篇文章去介绍ddd的相关名词并且在项目当中一般来说代表的是什么
DDD(领域驱动设计)是什么?
它不是一种具体的技术框架,而是一套方法论 和设计思想 。也就是说,DDD是一种思想,他的技术框架在项目中并不唯一,但是思想都是一样的,它的核心目标,是让软件系统的设计核心 与业务的核心领域对齐。说白了,就是让代码结构直接反映业务现实,用代码语言把业务规则和知识说清楚、固定下来。
为什么转向DDD?
就是为了正面怼MVC的那些缺陷:
-
治"贫血"和"碎片化" :DDD强调"富领域模型"。业务逻辑不再散落在各种Service里,而是归属于它真正该在的地方------领域对象(如
Order订单对象自己负责计算金额、判断状态流转)。模型自己会"行动",有"行为",而不仅仅是躺在那的一堆数据(getter/setter)。 -
治"技术划分导致业务失焦" :DDD按业务领域(如订单、支付、风控)来划分代码模块(限界上下文)。所有相关的Controller、Service、DAO、Model都内聚在同一个业务模块下。改一个功能,基本就在一个包里完成,业务内聚性极高,一看包名就知道这个系统是干啥的。
-
治"领域知识无法沉淀" :这是DDD的大杀器。它强调"通用语言"------业务、产品、开发、测试都用同一套词汇(直接对应代码里的类名、方法名)来沟通和描述业务。这套语言和最终的领域模型,就是系统最核心、最准确的"知识沉淀"。在AI时代,这套清晰、结构化的领域知识,正是喂养和约束AI Agent(比如帮你写业务代码、做业务分析的AI)的完美"规则书"和"法律条文"。AI能直接"理解"你的业务核心,而不是在一团混乱的Service方法里瞎猜。
ok我们来看几个ddd中最核心的几个几个名词
充血模型
认为是对抗mvc最有用的地方,实际上是将service进行收拢,让对象自己有一些方法,
-
贫血模型(MVC) :
OrderService里有一个calculateTotal()方法,它从数据库取出Order和一堆OrderItem,然后吭哧吭哧算总价。 -
充血模型(DDD) :
Order对象自己有一个calculateTotal()方法。调用order.calculateTotal(),它自己遍历内部的OrderItem列表并算出结果。业务逻辑住在它该住的地方。
领域
你的软件要解决的核心业务问题以及其相关的知识范围。它不是一个技术概念,而是业务概念。
例子 :你要开发一个"电商系统",那么"电商"就是你的核心领域。在这个大领域下,可以拆解出"商品"、"订单"、"支付"、"库存"、"物流"等子领域。
也就是说,领域并没有一个单独的点,而是一个特定的属于当前业务的服务
通用语言
同一个限界上下文 内,业务专家(产品、运营)和开发人员(前端、后端、测试)共同使用的、精确的、无歧义的语言 。这套语言中的关键名词和动词,会直接体现为代码中的类名、方法名和属性名。
例子 :业务上说"用户下单",技术讨论和代码中就叫 placeOrder,而不是 createTransaction或 submitRequest。业务上说"订单已发货",代码中对应的状态就是 OrderStatus.SHIPPED。
限界上下文
这是DDD在战术设计和工程落地中最关键、最核心的概念,没有之一。
-
是什么 :一个语义和概念的边界 。在这个边界内,一套特定的"通用语言"和"领域模型"是精确且一致的。简单理解,就是一个高内聚、低耦合的独立业务模块。
-
核心洞察:同一个词(如"产品"),在不同上下文里含义完全不同。
-
在 "商品销售"上下文 中,"产品"指可售卖的商品,有价格、库存、描述。
-
在 "物流运输"上下文 中,"产品"可能只是一个需要运输的"包裹",有重量、体积、易碎标识。
-
也就是说,在微服务架构中,一个限界上下文通常就对应一个微服务 。在单体应用中,它对应一个独立的代码模块/包 (如 order-context, payment-context)。