面向对象闲话(一)——什么是对象
如果你要把一只猫卖给一个计算机专家,千万不要说它有多聪明多可爱,而要说,这是一只面向对象的猫。这是程序员对程序员的揶揄。
面向对象渗透到软件的各个领域,既然找不到银弹,这颗铜子弹成了我们对抗人狼的最佳武器。
在这样的世界里,你有没有想过,什么是面向对象呢?
如果你习惯性地说:继承、封装和多态,那么请你继续读完这篇随笔吧,它会带你认识一个真实的OO
我想提及面向对象之前,应该先搞明白什么是对象。《面向对象分析与设计》(Grandy Booch)中提到,对象是一个朴素的概念,约一岁以后,人会培养出一种对象概念的能力。从人类的认知角度来说,对象应是以下之一
- 可触摸或可见的东西
- 可被理性理解的东西
- 可进行想像或施加动作的东西
在英文中Object是一个应用广泛的词,它的出现早于程序语言出现之前,我想用中文中一个最适合的词来翻译,应该是"东西"而非"对象",当然有点太口语化了。Grandy Booch接下来还提到,现实生活中的对象不是软件开发中唯一感兴趣的对象,另一些重要的对象是设计过程的产物。最后的总结是:对象具有状态、行为、和标识。
对象具有状态、行为、和标识这三点是非常重要的,这是面向对象大师Grandy Booch对朴素对象概念的非常精确的概括。
《面向对象编程导论》(Ian Graham)中对面向对象有这样描述:一些作者已经强调了面向对象程序设计和面向数值程序设计的区别。MacLenna(1982)指出,值(例如数字17)是应用式的和只读的,他们总是抽象的。对象(例如实例)在一定范围内存在,可以被创造、撤销、共享和更新。数值是引用透明的,引用它的一切事情将使用同样的数值。
从这一段我们可以看出,与"对象"相对的并非"过程",而是"值"。值和对象最显著的区别正是Booch总结的3点,状态、行为、和标识。举一个例子,3是一个值,苹果是一个对象。苹果具有状态,它可能已经烂了,或者还没熟;苹果也有行为,它可以被削皮,可以被咬一口,也可以变烂;标识保证了,苹果是唯一的,你无法在世界上找到任何一个其它苹果,使得它跟这个苹果是“同一个苹果”。而对值来说并非如此,3就是3,是没有状态的;3也是不可改变的,你只能由3得到一个新的值4,却没法把任何一个3变成4;值是不需要标识的,世上所有3都是相同的,没有任何区别。
在这种朴素地认识下,我想可以分析一下C++对象模型的设计:用内存中连续的一段存储一个对象的状态,这样可以将它们的地址作为标识,将对象分类并将他们的行为以成员函数的形式体现
(未完待续)