`

面向对象:我看所谓的充血模型和贫血模型

阅读更多

 

 

 
在网上看到这样一段关于对象设计的说法:
充血模型其实很简单,就是面向对象设计的本质:“一个对象是拥有状态和行为的”,比如说一个人,他眼睛什么样鼻子什么样这就是状态,人可以去打游戏或是写程序,这就是行为。为什么要有一个“人Manager”这样的东西存在去帮人“打游戏”呢?

举个简单的J2EE的例子,设计一个与用户(User)相关的功能,传统的设计一般是:
类:User+UserManager
保存用户调用:userManager.save(User user);
充血的设计则可能会是:
类:User
保存用户调用:user.save();
——User有一个行为是:保存它自己
 
 
User保存它自己,这是什么逻辑呢?我觉得非常奇怪。
 
用户用户可以保存自己,那么用户也可以删除自己了,这个和面向对象的最初思路就不一致了,因为在“用例”阶段,就没有用户“删除自己”的用例。
 
所以我的意见,就是一个“行为”到底放在哪里,肯定是要由用例决定的。
 
“人Manager”是一个不伦不类的概念,人自己“删除自己”更是荒谬。
 
我的理解:
 
“保存”和“删除”本身是系统提供的一个功能,它的宾语,或者说“作用对象”是User,而主语不是,面向对象的概念,封装、多态是手段,本质和神髓是用真实世界考虑问题的方法来分析来设计,那么,分清主语和宾语就是必须的。
 
一般来讲,方法调用应当是
 
主语.动作(宾语)
 
而不应当是
 
宾语.动作()
 
从实际实现上来讲,好像也不会有什么大问题,就行“人删除自己”这样的行为,但是,如果把代码和设计当成一个场景或故事的陈述,那么,每一个句子,都缺失了主语,拿宾语当成了主语,这是典型的逻辑不清楚。
 
所以,所谓的“充血模型”、“贫血模型”只是设计领域里的概念,而且是纯粹设计和实现层面的概念,实际上讨论这些的意义和价值都很低的。面向对象分析,首先应当确定一个动作的发起者或者叫“源”是什么,被操作对象是什么。
 
我是一个比较质朴的程序员和设计师,有些偏执和执拗,但是我一般不会屈从于任何权威和流行的东西,我有我自己的方法论和价值取舍。我一向喜欢从事物的最最本质触发来分析问题,评判优劣取舍。所以,我的观点,可能很多人看了觉得怪怪的。其实我也是一家之言,一孔之见,写出来,希望能够整理自己设计方面的思路和心得、希望能给别人一些不同的观点和思路吧。
 
 
2
1
分享到:
评论
4 楼 windshome 2013-07-18  
vavi 写道
程序是对业务的抽象,之间肯定是有差距的;只能更加的DSL化,这是个趋势,也需要注意平衡;在ruby中,很容易做到dsl;在java中,则比较困难。

在很多书籍中,将object.behavior 描述为 “向object对象发送一条消息behavior ”。  程序语言设计这方面的书籍我目前看的很少,只能是自己的一些粗浅理解了。

TOP-DOWN适合一个对整体比较熟悉的人,BOTTOM-UP则比较适合对陌生的领域,需要自己做很多摸索,总结,然后再得出结论。然后给老板汇报时,再是TOP-DOWN。

我看不少地方提到DSL,但是不理解是什么意思,兄弟能够解释一下吗?近年来名词太多了,实在需要好好学习。

另外,我的理解:一条语句,应该是主语.动词(宾语)我觉得是一个正确的语言规范,可以没有宾语,但是不能在主语上模模糊糊啊。

3 楼 vavi 2013-07-18  
程序是对业务的抽象,之间肯定是有差距的;只能更加的DSL化,这是个趋势,也需要注意平衡;在ruby中,很容易做到dsl;在java中,则比较困难。

在很多书籍中,将object.behavior 描述为 “向object对象发送一条消息behavior ”。  程序语言设计这方面的书籍我目前看的很少,只能是自己的一些粗浅理解了。

TOP-DOWN适合一个对整体比较熟悉的人,BOTTOM-UP则比较适合对陌生的领域,需要自己做很多摸索,总结,然后再得出结论。然后给老板汇报时,再是TOP-DOWN。
2 楼 windshome 2013-07-18  
vavi 写道
借LZ宝地,说下自己的看法:

1.一直对那些名字(buzzword只有恨了)既爱又恨,恨是因为不知道它什么含义,郁闷..爱是因为一旦了解后,很容易明白它的内涵外延,交流的时候很方便.

2.充血模型的对象是行为比较多,贫血对象则反之.user.delete可以理解程序员命令该对象自.杀了;service.delete(user)可以理解为程序员命令service(杀手)杀.死user

3.在java世界中,还是贫血;在rails世界中,必须充血.

所谓的 程序员命令该对象自.杀 和 程序员命令service(杀手)杀.死user 从业务角度是不合适的,因为设计和代码是陈述业务的,是设计师和程序员我他们的语言描述业务。


其实从下往上看,很容易理解这些名字,我只是觉得设计师大多数情况下,应该自顶向下来设计来分析,这符合人类的思维方式和习惯。从自顶向下设计的角度看,应该对业务一层层分析,不应该用设计干扰业务。
1 楼 vavi 2013-07-18  
借LZ宝地,说下自己的看法:

1.一直对那些名字(buzzword只有恨了)既爱又恨,恨是因为不知道它什么含义,郁闷..爱是因为一旦了解后,很容易明白它的内涵外延,交流的时候很方便.

2.充血模型的对象是行为比较多,贫血对象则反之.user.delete可以理解程序员命令该对象自.杀了;service.delete(user)可以理解为程序员命令service(杀手)杀.死user

3.在java世界中,还是贫血;在rails世界中,必须充血.

相关推荐

    失血贫血充血胀血模型.docx

    贫血模型可以看作是失血模型的一种变体,也是将数据模型和业务逻辑分离,但领域对象可能会包含一些基本的数据验证逻辑。与失血模型相比,贫血模型的领域对象稍有"血色",但仍然缺乏复杂的行为。 优点: 1. 简单明了...

    对贫血和充血模型的理解

    特别是在面向对象编程中,贫血模型(Anemic Domain Model)和充血模型(Rich Domain Model)两种设计策略,一直被广泛讨论和应用。它们代表了不同的业务逻辑和数据关系处理方式,对系统的架构和后续维护工作有着深远...

    浅谈Asp.net中使用“充血模型”1

    在Asp.net开发中,"充血模型"是一种提倡领域对象拥有丰富行为和业务逻辑的设计模式,相对应于传统的"贫血模型"。"贫血模型"通常将数据模型、业务逻辑和数据访问分离,使得领域对象仅包含属性,而业务逻辑和数据操作...

    11丨实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?1

    这种设计简化了对象的复杂性,但因为模型对象缺乏行为,所以被称为"贫血",因为它违背了面向对象编程(OOP)的原则,OOP强调对象应该拥有数据和操作数据的方法。 另一方面,"充血模型"(也称为富域模型)则在领域...

    领域模型说明及范例代码.zip

    领域模型是一种面向对象的设计方法,它以业务领域的概念为基础,将业务规则和逻辑封装在模型对象中。在领域模型中,每个对象不仅包含数据,还包含了处理这些数据的方法,这样的设计使得模型更具有表达力和自解释性。...

    基于GO的六边形架构框架,可支撑充血的领域模型范式代码实现.rar

    在这个框架中,Go的面向对象特性可能被用来创建和组织领域模型,同时利用其强大的接口系统来实现六边形架构的端口和适配器。 具体到代码实现,我们可以期待看到以下几个关键部分: 1. **领域对象**:包含业务逻辑...

    领域模型驱动设计1553265830.pdf

    充血模型将业务逻辑和数据封装在一起,更符合面向对象设计的原则,有助于提高代码的内聚性和模块化。 3. 领域专家与技术专家 在领域驱动设计中,领域专家与技术专家的角色分配和合作至关重要。 - 领域专家更关注...

    领域驱动设计案例-盒马实践

    领域模型可以分为失血模型、贫血模型和充血模型三种类型。 失血模型 失血模型是基于数据库的领域设计方式,它指的是使用 POJO 数据对象来存储业务数据。在失血模型中,业务逻辑是分散的,分布在多个地方。 贫血...

    大白话领域驱动设计DDD视频教程

    视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 第1章 初步了解DDD 课程介绍 抛开杂念,看看传统三层CRUD编程方式 DDD领域驱动设计到底是...DDD面向对象分析方法、CQRS、六边形架构特点,BAT实战落地

    软件架构技术公司内部交流

    架构设计过程中,还会讨论不同的模型类型,如贫血模型、充血模型(领域驱动模型)和胀血模型。贫血模型中,业务逻辑主要集中在Service层,而DO(Data Object)仅包含数据;充血模型则将业务逻辑放在DO中,Service层...

    领域驱动设计学习总结(一)

    2. **领域建模**:构建能够反映业务逻辑的领域模型,避免贫血模型,提倡使用充血模型,即将业务逻辑封装在实体对象内部。 **四、DDD的实践** 1. **领域模型设计**:通常分为战略设计(宏观视角)和战术设计(微观...

    人事管理项目(java+mysql)源代码

    同时,为了保证代码的可维护性和扩展性,良好的设计原则和模式(如单一职责原则、工厂模式、贫血模型/充血模型等)应当被遵循。 此外,项目的源代码可能会包含Maven或Gradle等构建工具的配置,以自动化构建和依赖...

    文字稿(更新到第三十课时)1

    18. **贫血模型与充血模型**:对比两种不同设计模式的优缺点,探讨最佳实践。 19. **课程总结**:回顾整个课程,强调掌握QFramework System Design Architecture对架构设计的重要性。 课程通过实例教学,逐步揭示...

    支付场景微服务实战

    - **充血模型**: 与贫血模型相反,领域对象包含了丰富的业务逻辑和行为,更符合领域驱动设计的原则。 - **限界上下文**: 是 DDD 中的一个概念,用来明确地界定不同领域模型的作用范围,有助于解决模型冲突和复杂度...

    JAVA面试题(下).pdf

    16. 领域模型(Domain Model)和贫血模型(Anaemic Domain Model)与充血模型(Rich Domain Model)的区别在于,贫血模型将业务逻辑放在服务层,而充血模型则将业务逻辑放在领域模型的实体中。 17. 测试驱动开发...

    支付场景的微服务架构介绍.docx

    DDD最初是为了UML设计和领域建模,强调充血模型,即业务对象不仅包含数据,还包含行为。而在传统的J2EE模型中,通常采用贫血模型,数据与行为分离。微服务的兴起,尤其是在借鉴了DDD中的限界上下文、子域和领域事件...

    C#企业人事管理系统

    设计模式如工厂模式、单例模式、贫血模型或充血模型等可能被应用到各个层次,提高代码的可维护性和复用性。 6. 数据库设计:在SQL Server 2005中,需要设计合理的数据库表结构,包括员工表、部门表、职位表等,确保...

    s2sh网上购物项目

    在设计上,可能采用贫血模型或充血模型,根据业务需求选择合适的对象状态管理方式。 数据库设计是项目的关键部分,可能包括用户表、商品表、订单表、购物车表等,需要考虑到数据的一致性、安全性和性能。例如,用户...

    smbms:SSM教程超市

    此外,还能接触到常见的设计模式,如贫血模型和充血模型,以及如何进行事务管理和错误处理。 7. **数据库设计**:SMBMS系统可能包括商品表、用户表、订单表等多个数据库表,学习者可以借此机会了解数据库设计的基本...

Global site tag (gtag.js) - Google Analytics