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

 

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值