手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

10|代码实现(上):要“贫血”还是要“充血”?

你好,我是钟敬。
上节课我们根据 DDD 的分层架构,建立了程序的“骨架”,今天开始,我们来编写具体的逻辑,给骨架上“添肉”。其实仅仅从完成功能的角度来说,这些程序你也会写,但关键是怎么按照 DDD 的要求来写
按照 DDD 的要求,我们首先要考虑的问题是,怎么使代码和模型保持一致?这还可以细化成几个子问题,比如怎么实现业务规则、怎么表示对象间的关联、怎么区分领域逻辑和应用逻辑等等。
其次,我们还要考虑一些通用的编程问题,比如说是采用贫血模型还是充血模型、怎么减少重复、怎样实现模块化,等等。
所以接下来三节课,咱们先选取几个比较简单的功能,用不太完善的方法把程序写出来,再一步一步地重构,达到我们希望的样子。在这个过程中,我们也会学到 DDD 在实现层面的几个模式。
今天,我们会首先讨论面向对象和面向过程间的权衡,然后在代码层面重点解决层间依赖问题。
开始之前要先说明一下,下面例子中的代码是用 Java 和 Spring 来写的,不过我们的重点是普遍原理而不是语言和框架的细节,所以对于其他语言来说,道理也是一样的。

“面向对象”还是“面向过程”?

提到编码,我们常常说起的一个问题就是:应该采用贫血模型还是充血模型?
一些人主张,DDD 应该采用充血模型, 但是实践中,多数小伙伴,虽然也觉得充血模型更高大上一点,但用的还是贫血模型。今天咱们就先掰扯一下这个话题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了软件开发中贫血模型和充血模型的选择,以及面向对象和面向过程之间的权衡。作者指出贫血模型违背了面向对象的原则,而充血模型则包含数据和行为。在分析面向对象和面向过程的区别后,作者强调了在编程中要找到平衡点,并提出了尽量面向对象的原则。此外,文章介绍了敏捷开发中的实践和重要性,并强调了在代码编写阶段发现模型问题时要及时修改模型,保持代码和模型的一致。文章还讨论了面向对象的特征以及领域逻辑在代码中的体现。总的来说,本文对软件开发人员具有一定的指导意义,帮助他们更好地理解和应用贫血模型和充血模型,以及面向对象和面向过程的权衡。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手教你落地 DDD》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • 子衿
    老师这个地方有一个问题,我们通常为了方便微服务调用,会让Controller实现一个XxxApi接口,然后将XxxApi单独打包,这样下游可以将这XxxApi这个接口,通过maven引入到自己项目,然后直接通过XxxApi就可以完成远程调用,我们通常叫XxxApi所在的包为二方库,但如果将DTO放到了应用层,那么DTO和XxxApi就不在一层了,也就是XxxApi在适配器层,而DTO在应用层,如果强行将DTO也对外发布出去,会导致相关应用服务也被发布,这个应用服务对下游来说是没用的,这种有什么好的实践方式吗

    作者回复: 你们用的是RPC方式是吧。可以把DTO作为单独一个包,让API接口和应用服务都依赖这个DTO包,这样就不违反层间依赖了。

    2023-01-29归属地:上海
    3
    11
  • Geek_1cb6f4
    这里有个疑问,开发中发现dto的属性命名实际是要与外部调用者的命名一致的,比如页面请求或者第三方接口。于是就存在同一个dto的多个版本。那么dto不就应该属于适配器层么?搬至应用层后就感觉不那么合适了。

    作者回复: 可以在应用层保存一个一致的dto,在适配器有另外多个不同版本的dto作为适配

    2022-12-29归属地:广东
    4
    7
  • Jxin
    内容: 1.权衡问题,个人认为dto不该移动到应用层。就像要不要追加get set方法,原则上破坏封装性不要,实际上框架依赖只能要。java的rpc框架需要dto。如果你为交付负责,我觉得保守点,先追求框架红利,因为你算不准个中成本差异。 2.仓储的入参具象了(干没了加一层带来的扩展性),直接用聚合根实体就好。仓储是聚合的仓储。 课后题: 1.封装多态继承。可以,早期带团队面向对象落地难,用dci的思路带团队干过,效果能做出来,就是多了挺多概念,后期不好沟通。 2.add那块应用层里面。 说不上合不合理。核心逻辑是检验,检验我的观点是跟着领域对象走。但你说dto或则其他内部类加点检验可不可以,可以,不放内里面行不行,挺好,我就只抓领域层内部,其他的不放类里面指不定还是好事。(富客户端 api传递依赖 都是麻烦)(对象转换可以用框架,干净些)

    作者回复: 两个问题回答都不错。 关于DTO是否一定要放到应用层的问题,是不一定的。DDD最强调的是领域层要整明白,其他层都好商量。Eric Evans在自己的github例子里就是把DTO放在展现层的。不过还是不建议违反层间依赖原则。这个课程里把DTO放到应用层,是更强调六边形架构的思路。

    2023-01-09归属地:湖北
    3
    3
  • gitqh
    关于将dto移动到application层解决外层依赖内层的问题,我在项目中会用另外一种方式,dto依然在adapter层,adapter层在调用application层的方法时,将参数转换为domain层的对象,这种方式也没有破坏外层依赖内层的规则。 关于这两种方式的对比,想听听老师的观点

    作者回复: 这样也可以,其实Evans本人写的代码例子就是这么做的(在Github上搜 dddsample)。我们的课程里之所以这么做,是参考了六边形架构,在六边形架构中,适配器主要适配输入输出的技术关注点,而DTO和领域对象的转换已经不是这个意义上的技术关注点了。所以如果追求纯粹一点的六边形架构,那么就按课程里的,否则,你们现在的做法也可以。

    2022-12-31归属地:广东
    3
    3
  • 依赖倒置那个 有2个问题需要请教下老师: 1. 适配器层中 仓库的实现类,什么时候注入 到 Service 中,这里肯定不能在 Service 中初始化 否则还是会依赖 2. 适配层依赖 领域层,这里不是跨层依赖了吗?

    作者回复: 1,用@repository @autowired spring自动会注入 2,分层架构一般只规定方向对就可以了,没说不能跨层

    2022-12-28归属地:广东
    3
  • 磐石
    看高潮了,爽文,继续更新,不要停

    作者回复: 继续努力

    2022-12-30归属地:广东
    2
    2
  • Faddei
    老师请教下,repository 查出来的对象就是 domain对象了吗?还是需要再封装一个DO类,再将DO转换成domain

    作者回复: repository 查出来的就是领域对象了,不需要再封装。某些情况下要用DO的话,也是 repository 内部的实现,外面是看不到的。

    2023-08-30归属地:浙江
    1
  • NoSuchMethodError
    有个问题想问下,我看到有说法说app层只负责业务流程的编排,那业务流程是不是指的是业务用例或者系统用例?

    作者回复: 如果关注的是整个企业的人和系统的交互,就是业务用例;如果关注的是人和单个系统的交互,就是系统用例。和app层直接相关的是系统用例。不过“app层只负责业务流程的编排”这句话本身过于笼统,含义不明。准确的说,app向外部提供的一个API对应与用例中的一个步骤。

    2023-04-23归属地:江苏
    1
  • Ramanujan
    老师,你这个实现是贫血还是充血

    作者回复: 简单回答:偏面向过程(我用“面向过程”代替“贫血”的说法)。详细回答:在领域对象不直接或间接访问数据库的情况下,尽量面向对象(我用“面向对象”代替“贫血”的说法),在纯粹的面向对象和纯粹面向过程之间取得一个平衡。

    2023-03-15归属地:广东
    1
  • 6点无痛早起学习的和尚
    一些思考和问题 1. 如何保证模型永远是最新的,有时候只会改代码,不改模型,这里就是绝大部分程序员不能保证统一,很多时候文档迭代就会滞后。 2. 领域逻辑体现在应用层的OrgService里行为validate、buildOrgDto、buildOrg位置不对,应该把这些行为放到各自的领域对象里,比如validate、buildOrgDto放到OrgDto里,buildOrg放到Org里

    作者回复: 1 首先让模型轻量一点,其次要完善开发流程,在需求梳理,代码评审等环节检查 2 这些确实没放对,下节课聊

    2023-01-05归属地:广东
    2
    1
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部