欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-15 16:01:39
...

 

 

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

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