这几天看python,python支持面向对象编程也支持面向过程编程,就像C++一样。其实我不是很喜欢提供太多编程范式的语言,因为灵活性往往带来相应的复杂性,C++就是一个典型的例子。

对于一个提供了面向过程和面向对象编程范式的语言,很有必要知道两者的区别。

面向过程编程

使用面向过程编程,我们一般将完成同一个大功能的所有函数放在一个文件中,如一个命名为file的文件,这个文件提供所有对文件的操作。然后我们会发现该文件中的所有函数基本都含有fileId这个参数,因为所有文件操作,除了打开文件(open),都需要这个文件标识符以知道它要操作的文件。

如果某些函数我们只是内部使用,在C中我们使用static修饰符,将其作用域局限在该文件中。

面向对象编程

如果使用面向对象编程,我们就会将完成同一个大功能的所有函数放在一个类中,如一个File的类,这个类提供对文件的操作。fileId在每个接口中都会被调用到,所以他们应该作为类的状态来维护(实例变量)。

如果某些方法,只是该类内部使用(似有方法),那么我们使用private修饰符,将其作用域局限在该类中。

如果某些方法,不需要用到类的状态,也就是说调用该方法不需要实例化一个类对象,那么我们可以将该方法做成类的静态方法(类方法),这样外部用户就可以直接访问了,就像面向过程调用一样。

我们会发现接口之间其实往往有依赖关系,比如文件操作,你必须指定你要操作的文件描述符,这个文件描述符是通过调用open(path, mode)返回的。这意味着open往往是其他函数的先决条件。这种情况很常见,特别是网络操作,如smtp,pop,数据库操作,etc. 都是需要先连接到服务器才能进行后续操作。与文件处理类似,在操作系统中,socket也抽像为一个文件描述符。所以其他接口检查一下文件描述符是否合法来决定是否能够进行操作。

这种现象很常见,主要是因为函数其实往往就是“对某种对象进行某种操作”,这个某种对象,可能是文件对象(用文件描述符标识)、网络协议相关对象(smtp、http、数据库,用socket标识)。