面向对象VS面向过程
定义
-
面向对象(OO,Object-Oriented)
: 程序=对象s + 消息;
对象=算法+数据结构;消息是对对象的控制;
每组数据有特定用途,针对每种操作。
以现实世界中的实物(即对象)为中心来思考,最小的程序单元是类,以对象为中心
-
面向过程(PO,Procedure-Oriented)
: 程序=算法+数据结构;
算法和数据结构分开设计;
所有数据公用
,一个函数可以使用任何一组数据,一组数据可被多个函数使用。
系统设计按照功能逐步细分,最小的程序单元是函数,以函数为中心。
面向对象和面向过程不是矛盾的,各有用途,互为补充。
使用环境
- 面向对象
针对对象的操作基本不变,而对象可能有很大变动 - 面向过程
对象基本不变,而针对对象的操作可能有很大变动,如编译器(源和中间语言基本不变,但是总是在添加新的功能进行改进和优化)
面向对象的设计语言
Java,C++,C#,Python,PHP,Ruby,Perl,Object Pascal,Objective-C,Dart,Swift,Scala,Common Lisp、Smalltalk
C和C++都可以进行面向过程和面向对象的编程
,不同的是C++对面向对象直接提供语言支持
,而C中只能通过传统方式手动操作对象来模拟对象行为
。
面向对象的产生原因
-
封装:
明确标识出允许外部使用的所有成员函数和数据项,以明确区分内外
。
对内:提高了私有数据安全性;
对外:修改封装内的东西而不影响外部调用者; -
继承+多态
继承和多态必须一起
说。一旦割裂,就说明理解上已经误入歧途了。
继承:子类继承基类的方法,并做出自己的改变和/或扩展- 实现代码重用[^footnote];
实践中,代码重用意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。[^footnote]: 代码重用:我们通常称为代码复用, 即把一个功能写成一个模块, 以便当再次需要相同功能的时候,可以直接使用,而不用重新开发。 - 子类可以重写、扩展基类(外部调用者可无需关注其差别,内部机制会自动把请求派发到合适的逻辑)。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
多态:基于对象引用所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
多态实质上是继承的实现细节; - 实现代码重用[^footnote];
面向对象的软件开发过程
- 面向对象分析(OOA,Object Oriented Analyze)
从宏观角度概括系统应该做什么(而不是怎么做),根据事物间关系归纳出对象间关系,将具有相同属性和行为的对象抽象成类,形成粗略的模型。 - 面向对象设计(OOD,Object Oriented Design)
根据分析阶段形成的模型,首先进行类(包括类的关系)的设计,然后以类为基础提出程序设计的思路和方法。 - 面向对象编程(OOP,Object Oriented Programming)
根据之前的设计结果,用一种带有面向对象机制的计算机语言(如c++,其包含面向对象程序设计的“类”)写成程序。 - 面向对象测试(OOT,Object Oriented Test)
以类作为测试的基本单元。 - 面向对象维护(OOSM,Object Oriented Soft Maintenance)
由于对象的封装性,修改一个对象对其他对象影响很小。
在如今的大型软件设计中,这5个阶段是由不同的人分别完成的,OOP只是面向对象开发过程中很小的一部分。
参考文献
[1]《C++面向对象程序设计》,谭浩强
[2] https://stackoverflow.com/questions/2078978/functional-programming-vs-object-oriented-programming
[3] https://www.zhihu.com/question/20275578
[4] https://www.cnblogs.com/1qaz/p/6492465.html