浅谈面向对象与面向过程

浅谈面向对象与面向过程

本人阅历有限,本篇博客如有错误请不吝指出,也欢迎在下方发布你的看法。

面向对象(OO)

对象是什么

对象是什么这个问题曾经困惑了我许久,Rust的struct和Python的class都能够实现一个对象,有人说对象是一个属性和方法集的融合体,也有人说面向对象三大基本特征在于封装,继承,多态,多态和继承都是对于子类和父类关系来说,Rust里没有很好的方法来实现这2个特性,在现代编程中组合优于继承,所以我认为对象最基本的特征还是在于是否可实例化和封装。

封装

例如定义一个生物的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Living {
name: String, // 私有属性,不是pub name,用于封装name
}

impl Living {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string(),
}
}

pub fn get_name(&self) -> String {
return self.name.clone();
}

pub fn set_name(&mut self, name: &str) {
self.name = name.to_string();
}
}
1
2
3
4
5
6
7
8
9
10
11
class Living:
__name:str # 会把这个变量转化为 _Living__name,无法通过__name访问,实现封装

def __init__(self,name:str) -> None:
self.__name = name

def get_name(self) -> str:
return self.__name

def set_name(self,name:str) -> str:
self.__name = name

在上述2段代码中,我们都对name做了私有化处理,并且定义了2个方法get_nameset_name,这是很经典的封装,这两个方法叫做gettersetter,但很多情况下,我们也无需强制自己把所有成员属性私有化并且加上gettersetter,这是很死的做法。

实例化

实例化就是把一类东西转化为一种东西(这个东西是前面的东西的一个例子,例如humanLiving的一个例子),后者相比前者往往范围更小更精确,还是刚才那个Living,让我们实例化一种名为human的生物,在很多语言中new是作为实例化的关键字,Python的class有2个魔法方法,分别是__init____new__,通过字面意思理解,前者是初始化,后者是实例化,C++和Java都有构造函数且都是在new时被调用(不考虑C++的其他实例化方法)。

1
2
3
4
5
fn main(){
let human = Living::new("human"); // 人是有名字的生物的一种实例
human.set_name("human_i");
print!("{}",human.get_name())
}
1
2
3
human = Living("human")
human.set_name("human_i")
print(human.get_name())

上面2段运行结果都是输出human_i,我们可以看得出来Living的实例有能力为你保存一个name的属性,并且通过内置方法来控制。

面向过程

我接触的面向过程的语言不多,目前只有C,虽然说可以通过其他语言的多范式编程来实现面向过程,那未免有点不地道。

过程

有过程就必然有结果,下方是一个求字符串长度的例子

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
char x[] = "string";
printf("%i\n", (int) strlen(x));

return 0;
}

因为我们对x使用了strlenstrlen是一个求解过程,所以得到了6这个结果,这看起来远没有面向对象复杂。

面向对象的语言与面向过程的语言对比

还是求字符串长度的例子,Python是一门可以进行面向对象的语言,str是一类,str()/"string"都是str的实例,如果我们用面向对象的方法来求字符串长度那就是"string".__len__(),如果面向过程,那就是len("string"),在C里我们用的是后者这种写法,其中的不同,还是很明显的。


浅谈面向对象与面向过程
http://h2sxxa.github.io/2023/09/17/about_oo_and_po/
作者
H2Sxxa
发布于
2023年9月17日
许可协议