程序员人生 网站导航

九种不够面向对象的对象

栏目:综合技术时间:2014-04-01 15:31:08

  本文列出了我在平时发现和积累的在面向对象编程中一些常见的“不够面向对象”的情况。

  需要指出两点:

  1.我们虽然列出了这九种情况,但并不是说出现了下面的情况就一定有问题了;我们希望读者这可以将其作为一种信号——仔细考虑一下是不是有更好的设计。

  2.我们这里所说的面向对象的对象特指领域对象,即对象中包含领域数据和业务逻辑。

  要确定不够面向对象的对象,首先要了解什么样的对象算是面向对象的,或者说好的面向对象的对象。关于面向对象设计的原则从不同的角度有很多种说法,我们这里采用一种比较简单的说法,即高内聚低耦合。所谓高内聚是指对象内的数据和方法是紧密相关的;所谓低耦合是指对象之间的依赖应当比较小,一个对象发生改变时不应当对不相关的对象产生影响。

  一. 低内聚对象

  我们把低内聚对象分为两种:一种是应该属于该对象的行为和数据分散到了其他对象中;另一种是该对象内部的行为和数据关系不够紧密。下面的1、2是属于前一种情况,3、4、5则是属于后一种情况。

  1.贫血对象(Anemic Object)

  瞧,那条贫血的狗!

  故事的发生是这样的...

  你养了一条宠物狗,在学习了面向对象编程之后,你打算为这条狗设计一个面向对象的系统。于是,根据你在C语言编程时的开发经验,结合你对“封装”二字的理解,你设计了这样一条狗:)这条狗由四部分组成:头、身子、腿和尾巴。

  clip_image002

  图 1

  隔壁住着一位面向对象大师——法号鉴摩,你拿着设计图给他看。鉴摩大师只扫了一眼便说:

  没有行为的对象不是好对象。

  你似懂非懂地点了点头,正要往下说,大师挥了挥手说:“你明天再来罢。”

  如果一个对象只有数据没有行为,它就是一个贫血对象,它只能被别人操作,或者作为某个操作的结果。对于简单的getter和setter,我们一般不将其归为领域行为。所以,上面这个对象就是一个贫血对象。这条狗还不会叫、不会跑,甚至还不会摇尾巴讨好你,真不知道你养这样一条狗干啥。

  处理贫血对象时可以考虑把操作对象数据的行为移动到这个对象里面。对数据的封装只是面向对象中“封装”这个概念的一部分,我们的对象中除了封装数据还应当封装行为。

  对于跟物理世界一一对应的对象,一般来说,我们不容易犯这样的错误。我们不妨来看一个实际工作中遇到的例子。在某个商店收银系统中,有一个对象叫做Product,它被设计成这样:

  clip_image004

  图 2

  这个Product就是一个贫血类。单纯看这个类,是没有什么问题的。我们需要结合其他的类来观察。由于不同类型的产品打印方式不同,计税规则也不同,所以我们还有一个处理Product的类: 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐