第一章·第一节·创世之旅——面向对象建模方法之一

面向对象(Object Oriented, OO),最初是一种软件建模方法,但随着该思想的发展,逐步扩展到各个领域。引用百度百科中的一句话:面向对象是一种对现实世界理解和抽象的建模方法,是计算机编程技术发展到一定阶段后的产物。

那么,接下来我们首先要了解的是,面向对象建模方法是如何描述世界的,其理论基础是什么。这里,我最欣赏的是《Thinking in Java》序言中的描述:

  • Everything is an object.
  • A program is a bunch of objects telling each other what to do by sending messages.
  • Each object has its own memory made up of other objects.
  • Every object has a type.
  • All objects of a particular type can receive the same messages.
接下来,让我们一起跟随面向对象之父(Alan Kay),体验一次创世之旅。Now, Clean Your Mind, Let's Feeling the Big Bang! Ready? Go!
Everything is an object.直译过来是说:任何事物都是对象。
        想象一下:在无尽虚空的宇宙当中,时间、空间,都还不存在,这里无法用任何言语来形容。有人说是“黑暗”的,不,这里连“黑暗”本身也不存在!只有大爆炸前的奇点在蠢蠢欲动。我们不知道它已经等待了多久。因为,时间在这里,也不存在。它一直静静的等待创世者的到来。它已经感受到了创世者的脚步,不安和躁动汹涌而至,只差创世者的顿悟。与此同时,在Alan Kay的脑海中,形成了第一个清晰的概念——对象(Object),真实世界中的一切,都是面向对象世界中的对象。
        一瞬间,创世爆炸发生了!时间和空间,瞬间充斥了整个宇宙。而最重要的是,在宇宙的每个角落,都闪烁着点点星光,那就是真实世界中的事物在面向对象世界中的投影——对象。这些对象是如此孤独,假如它们有思想的话,一定是非常寂寞的,它们无法感知到任何其他事物的存在!
这里引入了面向对象世界的第一个概念——对象(Object)。在面向对象建模方法当中,把真实世界中的所有事物,都定义为”对象“。苹果,是对象;人,是对象;国贸大厦,是对象;原子,也是对象;泰山是对象;北京城,也是对象……但值得注意的是, 在实际建模当中,我们并不需要把所有的事物,都描述成对象 ,仅仅选取与我们要建模的业务相关的事物进行建模即可。至于什么是相关的事物,则需要在我们接下来的不断分析中,形成自己的分析原则了。
A program is a bunch of objects telling each other what to do by sending messages. 直译过来是说:一个程序,是一堆对象的集合,对象和对象之间,通过发送消息告诉彼此,该做什么。这句话中提到了“程序”的概念,这是因为这本书重点针对程序设计而言的。由于现在面向对象建模已经越来越广泛的运用于各个领域,因此,我认为这句话做如下调整,会更合适一些: An Object Oriented Model is a bunch of objects telling each other what to do by sending messages. 
继续我们的创世之旅:Alan Kay也意识到了这一点,对象们之间是需要交流的。经过一夜的沉思之后,我们的创世者终于发话了:那就赋予它们发送消息(Sending Messages)的能力吧!这下好了,宇宙一下热闹起来,对象们都争相的想表达自己的观点。
但是,很快,它们就意识到了新的问题——语言不通。多么尴尬的事情……所有的对象都在互相倾诉着,但是它们却始终无法理解彼此在说的是什么。这次,Alan Kay并没有思考多久:所有的对象,都具备接收消息的能力(Receiving Messages)。这次对象之间是真的可以交流了。
不过,新的问题又产生了——每个对象都接收了来自所有其他对象发出的所有消息,很快,每个对象都被信息的海洋淹没了。交流再次中断……
再次找到解决办法,已经是数天之后的事情了,Alan Kay也被这无数信息的海洋搞的很崩溃。不过,毕竟是我们的创世大神,并没有在困难面前低头,他挣扎着从消息的海洋当中爬出来,发布了最新的规则:每个对象只能接收它声明可以接收的消息。终于,世界再次安静下来,原来充斥在世界中的喊声平息了……
这里引入了第二个重要的概念——消息(Message)。 在越来越多的对象被创造出来之后,交流变成了一个非常迫切的需求。于是,消息的概念应运而生。在《Thinking in Java》的第二句话中,讲到了对象与对象之间可以通过发送消息的方式进行交流。更深层次的概念是,消息发送需要有发送方和接收方。接收方必须首先声明自己能够接收的消息的类型,随后,由发送方按照接受方的要求进行消息的发送。
在这个过程中,又需要引入两个新的概念——行为(Action)和访问(Access)。 行为,接受方声明的能够接收的消息类型。同时也是消息接受方具备的能力,接收方可以在接受到不同消息的时候,执行不同的动作(及行为);访问,发送方发送消息的动作,发送方需要根据接收方的要求,组织相应类型的消息(Message)。
创世之旅再次起航:Alan Kay长舒一口气,他开始仔细观察自己设计的宇宙,这时候,一个个对象都在踊跃的发送着消息,也在接收着别的对象发来的消息。一丝不经意的微笑泛上嘴角,多日以来的苦思冥想,终于有所成就。但,这微笑瞬间就消失了!有一个新的难题——所有的对象(Object)从外部开来,都是一样的,没有任何特征。
很快,Alan想到了办法:每个对象都应该有自己的属性。对,就是这样!不过,属性是什么?该为对象定义什么样的属性呢?定义多少才能够满足日常的需要呢?那些用不到的属性又该怎么办?……不,Alan Kay对思绪及时叫停了,“我陷进去了,我创造的世界一定要足够简单,不能轻易引入新的概念!”。
又是数日的思索,不过,大神终究是大神,Alan Kay还是想到了极简的原则:属性也是一种对象,对象的属性,就是其它的对象。OO世界当中,会有不可再细分的基础对象,就像真实世界中的原子;其它的对象,则都是由这些最基本的对象构成的。太奇妙了,OO的世界一下子丰富多彩起来。一个个小的对象凑在一起,形成一个大的对象,大的对象,又互相组合成更大的对象……于此同时,一种类似生命的特征也被创造出来——Memory。这与真实世界是多么相似,造物主的魅力就在于此吧!
        这一次,我们再引入一个基本概念——属性(Property)。而前面提到的Memory,就是一种属性;也可以认为,所有的属性,都是一种Memory。不过,现在通用的说法都会采用属性(Property)这个概念。Memory则仅仅用在对于面向对象思想进行纯理论研究当中。
通过前面三个基本原则的规范,世界已经初步具备了对真实世界的一对一建模能力。不过,这样的建模太过繁琐,工作量极大,缺少可操作性。因此,接下来的几个概念,就是用来解决这个问题了。
继续我们的创世故事:随着对象的不断组合,一个新的特征显现出来——很多组合后的对象,是比较相似的。于是乎,Alan Kay决定用一个专有名词来描述——类型(Type),让OO世界中的对象,从随意的聚合,变为有选择的分组,世界进一步清晰了。更进一步的,Alan Kay对这种具有相同类型的对象的另外一个特写进行了描述:具有相同类型的对象,可以接收相同类型的消息。至此,我们的创世之旅就结束了。一个抽象的OO世界就此诞生,它带给计算机行业带来了天翻地覆的变化,并且经久不衰。
最后,我们要引入OO思想最核心的概念——类(Class、Type)。Type这个词,也多用于纯理论研究当中,而在实际的应用环境当中,通常采用的名词为Class。Class的引入,为什么如此重要呢?让我们来思考这个问题:在OO的世界当中,如何产生一个属性相同或者相似的对象?如果需要一万个相似的“大”对象,那么将会有多少重复的工作要做呢?虽然大自然就是选择了最简单和笨拙的方式,老老实实的一个一个做下去(必须感叹造物主的神奇智慧)。但是,做为OO世界的创立初衷,不仅要模拟,更要有所突破,更好的服务于使用者,这是OO思想的灵魂所在。
以上就是关于前面引用的5句话的个人理解与全面阐述,这几句话是指引设计师的终极法则,需要不断的理解和运用这几句话,相信,不同阶段的你,一定会对这几句话有不同层次的认识与收获。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值