阿里实习生电面问到这个问题,在此叙述一下自己的认知
面向过程 | 面向对象 |
---|---|
我要充话费 -> 用支付宝 | 女朋友要充话费 -> 给我打电话 |
我饿了 -> 用美团外卖 | 女朋友饿了 -> 给我打电话 |
引例
动作:撰写一篇博客,发布博客到网站
对于面向过程 撰写、发布是两个事件,形成函数并依次调用
对于面向对象 博客可以抽象为一种文章,不关心具体实现(实例化),只关心这个抽象概念的一系列行为
本质
相对来说,面向过程是分析出解决问题所需的步骤
对于面向对象,是描述其在整个解决问题的步骤中的行为,而不在于完成某个步骤
面向对象的核心,我认为就是多态,把不同对象以同一特性来归组,统一处理
从程序构成的角度说
- 程序 = 算法 + 数据结构
用面向对象的思想改造后
- 程序 = 基于对象操作的算法 + 以对象为最小单位的数据结构
数据结构上的封装导致了数据数据的减少,即减少了问题求解的复杂度
同时由于类的抽象、分层,事件的完成逻辑更加清晰、容易实现
容器与STL的出现,更体现了数据抽象的这一概念
最后,面向对象所提倡的「高内聚、低耦合」更是大大提高了程序的可维护性。
高内聚:是指一个软件模块是由相关性很强的代码组成,只负责一项任务
低耦合:一个完整的系统,模块与模块之间,尽可能的使其独立存(减少相互依赖)
此外,陈皓老师提到:
对于:OOP 的本质就是——对数据和与之关联的行为进行编程,是不完全准确的
因为
Sometimes data is just data and functions are just functions.
陈皓老师认为,面向对象最注重的是
- 数据和其行为的打包封装
- 程序的接口和实现的解耦。
我认为陈皓老师指的也是上文所述
关于面向对象中多态的底层原理,请参考另一篇博文 C++ 多态对象模型/虚继承对象模型