专栏首页用户4352451的专栏DDD(领域驱动设计),你必须知道的贫血模型和充血模型

DDD(领域驱动设计),你必须知道的贫血模型和充血模型

背景

  • 最近公司开始推行DDD(领域驱动设计),基于充血模型的面向对象开发模式是DDD的特点之一,而在平时开发中我们都使用的是MVC 架构是基于贫血模型的面向过程开发风格,也许有同学就会问了,贫血模型和充血模型是的什么呢?

贫血模型和充血模型

简介

贫血模型

  • 定义对象的简单的属性值,没有业务逻辑上的方法(个人理解)没有找到官方解释

充血模型

  • 充血模型也就是我们在定义属性的同时也会定义方法,我们的属性是可以通过某些方式直接得到属性值,那我们也就可以在对象中嵌入方法直接创建出一个具有属性值的对象。也就是说这个对象不再需要我们在进行进一步的操作,这也就复合了OOP的三大特性之一的封装(个人理解)

关于DDD和充血模型的关系

我们在平时进行web开发的时候,就是定义DTO,定义数据库Model,BO等,对其进行get set方法,然后通过service 对Bo对象进行操作,最后通过copy属性持久化数据库和DTO传输。但是如果是充血模型的话,就不用在service进行属性赋值,而是在创建这个对象的时候,进行业务操作,赋予其属性值。这里也就是DDD的思想,这个对象也就是DDD所定义的Entity 或者 value 。Service也就是domianService,由多个Entity 和value 组成,构造最终的领域模型。

下图是作者本人对DDD的理解画的图,也希望能帮到大家理解:

回归正题还是看充血模型和贫血模型 说了这么多DDD思想中的充血模型到底优势在哪里呢?适用于哪些场景呢?而我们都在用贫血模型,但是我们在平时的开发中也没有什么问题呀?

为什么大家都在使用贫血模型?

  1. 使用贫血模型的传统开发模式,将数据与业务逻辑彻底分离,通过get set方法改变对象属性,对象属性可以随意被修改,这也就如上面所说违反了OOP的三大特性之封装特性。这样的编程方式也就是面向过程的编程方式,面向过程的编程方式是符合人类大脑逻辑的,不用使用太多的设计模式和过多的设计。还有就是在开发中大家经常说的一句及其不负责任的一句话:“怎么方便怎么来”,就一直在堆代码,完全不像以后的可拓展性。也就是说基于贫血模型的编程方式是面向过程编程,人类的思考逻辑方式很符合,在编程过程️也很方便,所以大家都很愿意接受这种编程方式。
  2. 综上所述:
  • 充血模型的设计要比贫血模型更加有难度
  • 大家一致使用基于贫血模型的面向过程编程已经成为习惯,比较难转换思想
  • 还有就是对代码不负责任的态度。(这是大数程序员的通病吧)

是所有的场景都适合使用充血模型吗?

  1. 使用充血模型也就是使用基于充血模型的DDD的开发模式,上文也一再强调,充血模型也是定义模式复杂,设计难等,代码开发量也许时其他模型的多,其主要原因还是设计起来难。那就是说如果我们设计一个很简单的业务逻辑,那我们还需要这么复杂的设计思想吗? 并且这个业务在后续的迭代也不变复杂,那我个人认为我们就使用我们的基于贫血模型的面向过程的编程思想。简单的东西何必复杂化呢。这里突然想到我同时讲的一个段子:
- 普通程序员写hello word 直接print 
- 高级程序员写hello word 各种设计模式各种可拓展最后输出hello word 
- 技术专家写hello word ,直接打印hello word
  1. 当然我们在进行一个复杂的业务场景,那就需要进行基于充血模型的DDD(领域驱动模型)开发模式了。其实DDD的开发模式也就是充分的遵循OOP发三大特性(或者四大特性,封装,继承,多态,(抽象)),如果是贫血模型的面向过程编程那到最后的结果就是点练成线,由线变成网,密密麻麻不可维护。所以说复杂业务逻辑基于充血模型的进行开发。但是也会是有问题的那就是类膨胀,一个类有很多代码。这个还是可以解决的,那就是通过设计模式,喝业务逻辑细分进行解决。

总结

  1. 贫血模型和充血模型的简单解释
  2. 以及DDD开发模式和面向过程编程与充血和贫血模型的关系
  3. 对比了基于贫血模型的MVC层的面向过程编程范式和基于充血模型的面向对象编程范式的对比
  4. 两种模型分别适用于那种场景

参考

  • https://time.geekbang.org/column/article/169600 设计模式之美
  • https://zh.wikipedia.org/wiki/%E5%8F%8D%E9%9D%A2%E6%A8%A1%E5%BC%8F 反面模式
  • http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html DDD的基础理论喝

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DDD领域驱动设计-充血模型、贫血领域模型

    贫血领域模型是一个存在已久的反模式,目前仍有许多拥趸者。Martin Fowler曾经和Eric Evans聊天谈到它时,都觉得这个模型似乎越来越流行了。作为领...

    JavaEdge
  • DDD领域驱动设计 — 贫血模型与充血模型

    要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念——“贫血模型”、“充血模型”:

    架构师修炼
  • DDD 领域驱动设计:贫血模型、充血模型的深入解读!

    要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念——“贫血模型”、“充血模型”:

    孙玄@奈学教育
  • 业务开发常用的基于贫血模型的MVC架构违背OOP吗?

    我们学习了面向对象的一些理论知识,比如,面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格、基于接口而非实现编程和多用组合少用继承设计思想等等。接下来,...

    码农架构
  • 领域驱动设计(DDD)靠谱么?

    DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成...

    架构精进之路
  • 由参加领域驱动大会与自己所想的

    2017首届领域驱动技术大会一直是我非常期望的,要非常感谢右军赠送的门票能够让我领略大会风采。

    小程故事多
  • Golang领域模型开篇,当Go遇上DDD

    我本身就是一个不太会拒绝的人,这点和雷军相似。最近一周,有网友说要给我投稿,内容见本文。所以,本文是转载的一篇文章,有喜欢的可以深入学习!

    业余草
  • 面试官:谈一下你对DDD的理解?我:马什么梅?

    我们在日常开发中,经常针对一些功能点争论“这个功能不应该我改,应该是你那边改”,最终被妥协改了之后都改不明白为什么这个功能要在自己这边改。区别于传统的架构设计,...

    艾小仙
  • 多研究些架构,少谈些框架(2)-- 微服务和充血模型

    上篇我们聊了微服务的DDD之间的关系,很多人还是觉得很虚幻,DDD那么复杂的理论,聚合根、值对象、事件溯源,到底我们该怎么入手呢? 实际上DDD和面向对象设计、...

    Java高级架构
  • 由Spring应用的瑕疵谈谈DDD的概念与应用(二)

    在上一篇文章中,通过Spring Web应用的瑕疵引出改善的措施,我们讲解了领域驱动开发的相关概念和设计策略。本文主要讲解领域模型的几种类型和DDD的简单实践案...

    aoho求索
  • 设计概念的统一语言

    有必要为领域驱动设计的设计概念定义“统一语言”,通过理解的一致保证交流的畅通,确保架构和设计方案的统一性。。

    张逸
  • 领域驱动设计之基本概念

    企业级业务系统开发我们略过需求的采集、分析,直接进入设计。 领域驱动设计(DDD)是近10年流行、比较成熟、比较成功的软件设计方法、理论。我们早期常见的软件开发...

    用户1910585
  • 多研究些架构,少谈些框架——一名阿里架构师的笔记

    微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为...

    Java架构
  • 微服务架构详谈

    微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系...

    慕容千语
  • 多研究些架构,少谈些框架

    微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系...

    物流IT圈
  • 公司终于决定放弃传统微服务,全面拥抱 DDD!

    前段时间,参加了一场闭门技术交流会,讨论的热点是微服务,话题集中在微服务架构拆分到底应该拆多细。

    Guide哥
  • [半翻] 设计面向DDD的微服务

    许多技术概念和模式,例如充血模型(对应我们常写贫血模型)、值对象、聚合和聚合根规则。

    有态度的马甲
  • EF Core中避免贫血模型的三种行之有效的方法

    圣杰
  • 领域驱动模型(DDD)

    2004年Eric Evans 发表《领域驱动设计——软件核心复杂性应对之道》(Domain-Driven Design –Tackling Complexit...

    高广超

扫码关注云+社区

领取腾讯云代金券