@
acctv2 首先,什么是面向对象的本质?我认为面向对象的本质绝对不是什么“封装、继承、多态”这些。“封装”是广泛存在的,不是面向对象专有的特性。“继承”也并非面向对象语言的特色。“多态”就是一个从继承衍生出来的一个特性,但这个特性并没有什么了不得的大作用。
那么,面向对象的本质到底是什么?我认为面向对象的本质是:将方法和与其相关的数据,封装在一个对象里面,实现了“高内聚、低耦合”的目的。这样,数据和功能就成了一个统一的、内聚的、不可分割的原子。当一个系统由这样的一个个原子构成的时候,非但在程序的设计上,能够实现高度封装。也因为数据和功能的统一,他们也就有着相同的生命周期。这对于运行时的内存管理而言,也是具有非常大的优势的。这才是面向对象的真正先进的地方。
那么,为什么我们写代码,哪怕是用 Java 这种面向对象的编程语言,写出来的代码还是面向过程的呢?其实,原因就在于我们的直觉就是 I/O 模型。使用一个程序,就像使用计算器,输入数值和操作符,就能给出结果。既然是这么使用的,那么自然也就这么去实现了。而且,任何一个方法,不都是这样的吗?调用的时候要给入参,方法返回结果。这逻辑,难道不是面向过程的逻辑吗?所以,只要不是刻意去设计,任何人编程都会用面向过程的思维去写代码。
最后,什么样的代码是面向过程的代码? C 这种不面向对象的语言自然不用说。如 C 艹、Java 这种面向对象的编程语言,如果数据和功能分离,也就是数据通过贫血实体类承载或包装的话,就是面向过程的思维方式的最直观体现了。