面向对象编程思想(OOP)的由来与本质,软件架构师必读
大千世界,万事万物,映射到我们的大脑中,形成了色彩斑斓、奇幻玄妙的思想世界。当我们想把这种思想用软件的方式表达出来时,我们面临着很多中选择:是面向对象、面向过程、面向函数还是面向方面(Aspect oriented Programming)?
由于当前的编程语言都是英文的,外国程序员编程不就是在说母语么?我们国家软件技术发展得晚,还没有按照中文词汇和语法的编程方法和工具,也只能跟着说英语。但中文和英文在词汇和语法方面存在不小的差异,所以程序员理解起来也会存在一些问题,久而久之,就把这种编程思路和方法弄得有些玄乎其神了。
面向过程存在的问题
企业信息处理程序最早是面向过程的程序,因为软件是模拟人的思维过程,所以利用面向过程的思路来处理程序顺理成章。由于最开始还是打孔纸带式的计算机,程序量也很小,所以效率还比较高。但随着软件变得越来越庞大,面向过程思想逐渐变得难以驾驭,工程化难度很大。面向过程的软件结构像一个复杂的迷宫,其间到处遍布goto语句,这些跳转语句就像游戏中神秘的传送门一样,你永远不知道下一站在哪里。
复杂过程能描述的清楚么
面向过程往往使程序员不用系统地思考完整的需求,但在程序中完整地复现了人类思维过程的杂乱无章,其中代码被无节制地复制和更改,重复的代码量大大增加,原来自己编写的程序读懂难度都很大。
面向对象的历史
面向对象在西方有着非常深刻的哲学基础,也是西方近代科学产生的重要原因,内容也比较多,我们以后再详细分析。
针对面向对象产生的问题,1972年美国计算机学家艾伦.凯(Alan Key)发明了面向对象的软件开发架构。艾伦的本科读的是生物学,博士导师是被称为'计算机图形学之父”的David Cannon Evans和Ivan Sutherland两位大神,后者的博士导师是大名鼎鼎的香农。在计算机领域,经常看到这样学术传承,一缕一大串,都是图灵奖都是熟人。从这也看出了咱们国家要想在计算机方面立足,还有很长的路要走。
面向对象是艾伦.凯(Alan Key)发明的
这是一种由生物细胞领域概念启发而形成的架构方法,艾伦发现了在细胞领域中存在一些有趣的规律:首先,所有个体细胞都会遵从细胞这个类别元素的共同的行为模式;其次,每一个细胞都是一个独立的个体,细胞之间通过传递化学物质信号和电信号能够进行通信,根据所收到的信息调整自身的行为和策略;第三,细胞会进行分化,从原来的一个细胞分化成不同类别的细胞,进而形成各种器官。受到这些细胞特性的启发,艾伦发明了面向对象的分析和设计方法。
生物是如何封装和传递消息的
结合这些特点,艾伦发明了Smalltalk ,这种语言被设计为一个完全动态的系统,其中可以动态地创建和修改类。
面向对象的本质
面向对象与其说是一种设计方法,更像是一种理解世界的角度。类别、属性、联系和是三个重要方面。联系和组成的概念更为复杂一些,例如SQL和知识图谱就是致力于研究事物之间的关联,我们有机会再另外详细说,今天我们重点来讲讲类别和属性。
面向对象的本质是本体论
面向对象的核心是本体论。本体类的核心就是分类,也就是我们词语所指之“物”。当我们说杯子的时候,我们说的其实不是哪一个具体的杯子。我们说的是脱离了时间和空间之外的那个杯子,这种本体论古希腊人都搞明白了,可惜中国古代没有这种本体思想。
比如我们说今天很热,我们翻译过来肯定是想说Today is hot。但是这里我们就错误地把今天作为主语了,其实今天应该是时间副词。英语会翻译成It is hot today这里的It指的是天气,也就是热的主体。
中英文用法上差异增加了我们理解的难度
本体(Ontology)、分类(Class)、概念(Conception)、集合(Set)和名词(Noun)其实是一回事,都指的是你脑海中的那个概念。这是人类理解世界的根本,就从哲学观点上来看,这是我们认识世界的方式。
我们的生物需要分类,就是门、纲、目、科、属、种;法律需要分类,轻度伤害、重度伤害量刑不同;社会管理要分类例如不同企业上不同的税;产品需要分类,不同的产品有不同的参数.......我们思想和语言交流的基础就是分类。
事实上我们说的每一个名词都是一个分类,当加上编号或者定冠词就变成实例了。那我们我和当我们区分实例的话,不特指的时候直接用复数或者要加上不定冠词“a”表示这分类,特指实例的时候要加上“the”。
分类是我们认识世界的基础