面向对象编程的一些思考

这段时间一直都在学习python,主要目的还是打算学习一门互联网的编程语言,为后续的职业生涯做一些规划,毕竟java在互联网除了电商领域有叫广泛的使用场景之外,在互联网其他领域还不是很普及,并且java太重量级了。而python在相对来说轻量级并且易于使用,很适合互联网产品快速迭代开发方式。

个人之前接触的唯一一个纯面向对象编程语言就是java,以至于很长一段时间内,我都以为面向对象编程的模型应该都是以java这样为基础的,直到看了javasript和python等以函数式编程为主,支持面向对象编程的语言,才更深的了解面向对象的编程本质。

什么是对象,对于对象的理解,我感觉就是具有某些特性的物质,比如说狗。而面向对象编程最大的特点就是 把 对象的属性和它相关的行为进行封装,比如狗的品种就是狗的属性,但是狗叫就是狗的行为。我们把这两个特性封装到一个具体的对象里面,就构成了面向对象的编程的基础。如果把对象的属性称作数据,对象的行为成为函数,那么数据就构成了对象的状态,同一个对象中的数据可以有很多不同的版本,数据是变化的,函数是不变的,只不过这个函数就是属于这个对象的。

但是对象的行为一定非要和对象绑定吗?是不是可以脱离对象而独立存在了。比如我们说狗叫,那么叫这个动作,一定非要和狗绑定吗,是不是也可以和人绑定的?还有就是比较两个数的大小,这个行为的对象是谁 ? 通过这些思考我们发现,很多时候行为和可以独立对象独立存在的,这些独立存在的行为不属于任何对象,或者我们并不需要关心他属于谁,只需要关注他的目的是什么即可。

以上两个问题在java里面都反映的比较明显,static关键字用来表明这个行为不和任何对象绑定,比如public static void main ,这个main方法就不属于定义它的class所对应的对象。还有java里面的Math类,这个类里面的方法都是public static的,说明这些方法都不属于任何对象。而java是纯面向对象的,只能把这些不属于任何具体对象的定义为static,而其对应的class类,感觉给他定义了一个命名空间而已。

python中的面向对象的设计感觉比java要复杂,但是通过和java面向对象的设计相比,能够让你更深入的了解面向对象编程的核心。python中 class如果定义对对象的行为,第一个参数比如为self。当初自己对这个设计理解很不理解,为什么弄的这么复杂,后来想想面向对象思想是什么,突然就明白了,这个self就是数据,方法就是行为,这个行为要和某个对象绑定,只不过java里面帮助我们省去了这个过程,通过创建对象的语法new XXXClass 自动进行绑定。java是静态的,一旦方法和数据进行绑定,这个绑定关系就不会发生改变,但是python绑定关系就可以进行改变。如果方法参数中没有self,那么这个方法就和java里面的static方法类似,表示这个方法属于某一个类,不属于某个对象。

而javascript面向对象设计就是更有意思了,构造函数本身就是一个function,通过function.apply方法和具体的对象进行绑定,在javascript中用this来表示function所绑定的对象。

而在scala中,对象的方法和class 对应的static方法就完全分开了。更确切的说,class对应的static方法,就不属于这个class,所以scala定义了object 这个概念。所有class中定义的方法都属于对象的行为,而之前java中所有class static方法,都属于object。两者在语法上都已经明确区分了。个人感觉这个明显比java,python,javascript  对static方法的支持简洁明了的多。

对于面向对象的设计,不同的语言虽然不同,但是其核心思想还是相似的。但是由于编程语言所支持的编程范式不一样,实现方式差别还是比较大的。通过学习多范式编程语言,能够加深对这种编程范式的理解。