面向对象模型
有了自动推理机,可以将人们自己定义的语法转换成机器代码的语法规则。让我们有了方法、变量、条件、循环等这些概念,可以大大简化编程的心智负担。
面向过程的语言依然还是图灵模型解决问题的思路:有限的有序指令序列。只不过这里的指令从机器语言、汇编代码换成了容易理解的表达式而已,面向过程的编程语言和机器代码在认知上没有本质区别。
组织面向过程的程序,这部分工作的心智负担需要高水平的程序员来承受,将现实中的业务分解成有限的有序指令序列。分解任务成为指令序列的过程就是编程,它要求程序员既要像人一样思考现实又要像机器一样思考。像机器一样思考需要最聪明的人来完成才行,好的程序员可不好找。
能不能想办法利用推理机,再进一步,让程序员按照人类一样思考事物,写出符合人类语义的代码,然后再翻译成目标代码呢?回答这个问题就需要先回答另外一个问题,符合人类认知的思考方式的语言是怎么回事。
人类需要通过概念来进行交流,给一撮物质一个标签,这个标签就是概念。将一堆标签夹起来再打上标签,就是抽象概念。不同的语言、不同文化背景的人无法交流就是因为使用了不同的标签系统,甚至也有可能贴错了标签的情况,导致认知无法对齐。
理解面向对象需要到生活中去,观察玩泥巴的小孩。他们用泥巴创造出一个城堡前,泥土就好像计算机世界中的数据,将泥土组织成有清晰边界的物品就是对象。我们为了描述这类对象,就需要给它起个名字才能交流。类可以对应现实中的一个概念,很多面向对象的书籍并没有点破这一点。
可以把现实和面向对象中的元素对比一下,建立一个理解面向对象的模型。
一类物质
概念
标签
类
不存在的实物
抽象概念
一组标签的标签
抽象类
一个有清晰边界物体
实体
用陶土制作了一个杯子
对象的实例化
一个有行动的的人
人
拿起了这个杯子
调用了人这个对象拿起杯子
符合条件的人
契约
有手就能拿起杯子
接口
所以面向对象编程是建立在非常好的心智模型上的,只不过这个模型对于不熟悉西方哲学的人来说过于抽象。对象、实体、类、行为,这些面向对象中的内容和概念早已经被哲学家讨论过数千年,但是在中文的语境中并不新鲜。
人是通过语言思考的,我们不遗余力的使用自然语言描述事物,面向对象是计算机语言和自然语言的一座桥梁,这座桥梁由哲学链接。对象这个词在不同的领域都被用到,这并不是巧合:
哲学中的对象概念。 哲学中的对象概念。
数学(范畴学)中的对象概念。 数学(范畴学)中的对象概念。
语言中的宾语。 语言中的宾语。
维特根斯坦的《逻辑哲学论》中对对象、类的阐述和面向对象极为相似,不过这本书非常晦涩。通俗来说:
也就是说对象不是一成不变的,可以由"造物主"自由的设计和组合。当我们在开发一款 XXX 管理系统时,被管理的"物品"被模拟为一个静态的物品,就能看做一个对象。假设我们正在开发仓储管理系统,极端的面向对象者会告诉你将行为放到"货物"这类实体中,这样看起来更加像面向对象的风格,但是他们背离了面向对象的初衷。
虚拟的世界里,静态的对象需要由动态的对象处理,这构成了一组主客体关系。而对于"上帝"来说,它们都是对象。熟悉 Java 的程序员可以这样理解,Spring 中的 Bean 是一种对象,在应用启动时就被初始化了,就像上帝造出亚当开始干活儿。而从数据库中提取出来的实体,就像是从仓库中提取出来的"物品"。
如果开发一款游戏,对象貌似都是有生命的。但是对于普通的管理系统来说,真正需要设计的是"货物管理者","收银员"这类对象,而"货物"这类实体就应该让它们安安静静的躺在那里。
使用面向对象越久,越会下意识的使用面向对象思考现实,面向对象是程序员进入哲学世界的启蒙课。