OO(Object Oriented),可以叫做面向对象,按照纯字面意思上的理解,也可以说出“针对个体”。
实际上,在现实世界,一切都是以个体(对象)存在的。宇宙中的一切都可以视作个体。人类本来就是把一切视作个体的。个体的名字可以区分不同的个体,同时蕴含着这个个体的属性和规律。那些属性和规律,已经被人类文明封装(Encapsulate)好了。
举个简单的例子。“海洋”就是一个个体,这个名词的背后就有宽广,咸味这样的属性,也有洋流,生物分布,水运路线这样的规律。而抽象(Abstraction)的程度并不取决于海洋这个个体本身,而是取决于你的认知。你在不知道洋流这个东西的情况下学习了洋流,就意味着你对“海洋”的抽象加深了。对海洋的抽象被称为类(Class)。
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
那么回到海洋这个个体。这个时候再引入一个新的个体“太平洋”。“太平洋”在这里是一个特殊的个体。对太平洋的抽象既是对海洋的抽象的具体化,又是对海洋的抽象的部分化。具体是把海洋看做概念个体,部分是把海洋看做事物个体。这不是重点。重点是,“海洋”和“太平洋”的类有某种关系。他们具有共性,而“海洋”充当了比较“大”的个体。在这两个个体之间,“海洋”就成了父类(SuperClass),“太平洋”就成了子类(Subclass)。
一个巴掌是拍不响的,但当他们凑在一起,这种关系继承(Inheritance)便出现了。“太平洋”有着“海洋”的属性,还有自己的特点。这个从字面理解就已经很轻松了。
当个体的某种行为被激发了,不管是动态的行为,还是静态的行为。我们管这个个体的行为叫做方法(Method)。这个理解起来可能会有些怪异的感觉,为什么针对个体的行为叫做方法呢?实际上,方法是有所有者的,“海洋”把大量的睡推向陆地,这就是“海洋”这个个体激发“海啸”这个行为的方法。然而方法脱离了个体,就仅仅是一个函数(Function)了。函数表示行为,当方法失去个体,那么这个方法就仅仅是一个函数了。把大量的水推向陆地的的确确是一个函数,但很明显,它的生动性大打折扣了。原因是失去了主体,就失去了其抽象,我们每一次单纯地使用“把大量的水推向陆地”时,都要说明水量,力度,角度。而使用方法“太平洋”的“海啸”时,结果就不一样了,“太平洋”这个个体已经包含了许多抽象,执行方法时只需要选择需要的抽象就好了。
当这平常的一切到了计算机上,会变成什么样呢?
我们姑且把大家的程序分为小型程序和大型程序两类,小型程序十多行,而大型程序上万行。小型程序的开发者往往会选择面向过程的开发方式,放上要执行的函数和执行函数的参数,生成命令让计算机去执行。大型程序的开发者可能要模拟更真实的环境,比如树长高,树枯萎,树抽枝,车发动,车转向,车制动……他们都需要执行函数,都携带着一些参数……方法瞬间伟岸了。假使有上万个个体,我只要说明它是树,他是车,它们便掌握了它们这类个体所带有的一切抽象。只需要告诉它们执行什么方法就OK。
如果你仅仅是一个小型程序开发者,却因为技术要求尝试去理解面相对象的优越性要怎么做呢?打开PS,试想一下,没有任何工具按钮,有的只是一系列操作,你每次都要说明哪个参数是指什么,它可能是宽度,字号,分辨率,图册,颜色成千上万种可能还要选择一系列函数包括选择,移动,上色。每执行一次,就要重复上述操作……
你会崩溃的。
0 条评论