浅谈面向对象与面向过程
浅谈面向对象与面向过程
本人阅历有限,本篇博客如有错误请不吝指出,也欢迎在下方发布你的看法。
面向对象(OO)
对象是什么
对象是什么这个问题曾经困惑了我许久,Rust的struct
和Python的class
都能够实现一个对象,有人说对象是一个属性和方法集的融合体,也有人说面向对象三大基本特征在于封装,继承,多态,多态和继承都是对于子类和父类关系来说,Rust里没有很好的方法来实现这2个特性,在现代编程中组合优于继承,所以我认为对象最基本的特征还是在于是否可实例化和封装。
封装
例如定义一个生物的类
1 |
|
1 |
|
在上述2段代码中,我们都对name
做了私有化处理,并且定义了2个方法get_name
和set_name
,这是很经典的封装,这两个方法叫做getter
和setter
,但很多情况下,我们也无需强制自己把所有成员属性私有化并且加上getter
和setter
,这是很死的做法。
实例化
实例化就是把一类东西转化为一种东西(这个东西是前面的东西的一个例子,例如human
是Living
的一个例子),后者相比前者往往范围更小更精确,还是刚才那个Living
,让我们实例化一种名为human
的生物,在很多语言中new
是作为实例化的关键字,Python的class
有2个魔法方法,分别是__init__
和__new__
,通过字面意思理解,前者是初始化,后者是实例化,C++和Java都有构造函数且都是在new
时被调用(不考虑C++的其他实例化方法)。
1 |
|
1 |
|
上面2段运行结果都是输出human_i
,我们可以看得出来Living
的实例有能力为你保存一个name
的属性,并且通过内置方法来控制。
面向过程
我接触的面向过程的语言不多,目前只有C,虽然说可以通过其他语言的多范式编程来实现面向过程,那未免有点不地道。
过程
有过程就必然有结果,下方是一个求字符串长度的例子
1 |
|
因为我们对x
使用了strlen
,strlen
是一个求解过程,所以得到了6
这个结果,这看起来远没有面向对象复杂。
面向对象的语言与面向过程的语言对比
还是求字符串长度的例子,Python是一门可以进行面向对象的语言,str
是一类,str()
/"string"
都是str
的实例,如果我们用面向对象的方法来求字符串长度那就是"string".__len__()
,如果面向过程,那就是len("string")
,在C里我们用的是后者这种写法,其中的不同,还是很明显的。