摘要
本文简单的说一下就我理解的面相对象和面向过程。以及什么是数据及其数据类型。并且这两种编程范式有什么不同。重点是闲扯,算是自己学习过程的一点胡思乱想。
光的本质是什么?是粒子?是波?本质是什么或许不重要,也许重要的是他有什么样的性质。
也许观察本身就是一种错误。观察在什么粒度上才算是客观的。
互联网时代究竟有无真相可言。
ox00:面相对象vs面向过程
相信大部分人的第一门编程语言大多是C语言,我们编程的时候多多少少还是受其影响的。C是标准的命令式编程,或者说是数据和操作解耦的面向过程。也就是说我们明确规定的对于数据进行怎样的操作。在编写程序时,我们大多采用自顶向下的方法,将一个大的模块拆分成小的模块,这其中在操作小的模块时,我们根据需要又抽象了相对应的数据。也就是说数据和过程是完全解耦的,数据只是单纯的数据而已,通过这样的方法,我们可以将一个个小的模块聚合成大的模块。而面相对象的编程范式呢,我们通过采用一个个的对象来完成我们的操作,我们丝毫不关心对象内部的实现方式,我们只关心他能提供给我们什么样的服务。
0x01:类型是什么
这要看在什么样的语义下,我们怎样去定义数据或者类型,在c语言眼里,我们可以自定义数据结构,也就是使用typedef struct
这样的语句来定义我们想要的新的数据类型。我们不妨想想什么情况下我们需要定义新的类型。实际上是为了过程抽象。假如说我们想要实现复数运算的包(或者说库、模块)。如果我们不使用数据抽象,那么无论是对于包的使用者还是创建者,都带来了非常多的麻烦,对于开发者来说,实现对于外界就不是透明的了,而对于使用者来说,必须仔细阅读设计文档,并且了解其实现过程才能进行包的使用。而且由于未进行抽象,我们再使用该包进行二次开发时会更加麻烦,比如实现代数运算系统。我们不能站在复数这样层度上进行思考,而只能时刻思考着他是如何组成的。因此,为了过程抽象,我们只能先进行数据(类型抽象),面相过程和面相对象采用了两种不同的思路,面相过程其实也很直接,我们直接抽象新的数据类型,将数据进行聚合就可以了么,然后再设计与之对应的操作(过程)即可。
下面用伪代码进行说明:
typedef struct{
double x;
double y;
} complex;
complex add(complex a,complex b);
complex sub(complex a,complex b);
complex time(complex a, complex b);
complex div(complex a, complex b);
面相对象则更进一步,既然数据和操作如此重要,那么我们直接将其聚合到一起,也就是将操作完全向数据靠拢,下面用伪代码进行说明:
class complex{
double x;
double y;
complex(x:double,y:double){
this.x = x;
this.y = y;
}
complex add(complex other);
complex sub(complex other);
complex time(complex other);
complex div(complex other);
}
可以看出,将操作完全向数据靠拢,实际上若这样看待面向对象和面相过程也还是有点隔靴搔痒的感觉。不妨我们这样假设,我们要设计一套代数系统,里面有有理数,无理数,实数,复数。整数,复数,整数,自然数。尽管现实中,这些类型实际上有从属关系。采用纯面向过程的编程范式,我们只能定义每一种数据类型,然后为每一种数据类型设计与之对应的操作。
但是采用面相对象的设计,我们可以设计良好的继承关系,并且实现方法上的多态,下面用伪代码进行描述:
abstract class Number {
Number add(Number n);
Number sub(Number n);
Number time(Number n);
Number div(Number n);
}
class complex extents Number{
double x;
double y;
complex(x:double,y:double){
this.x = x;
this.y = y;
}
complex add(complex other);
complex sub(complex other);
complex time(complex other);
complex div(complex other);
}
//RealNumber,Integer same as above
这里就可以看出,当我们在谈论数据,谈论类型时,一定与操作与之相对应。为了将数据和操作严格耦合,我们引入了面相对象的方法。当我们不定义任何操作时,纯数据是意义不大的。因为我们可以采用不同的方法来解释这些数据,从而形成新的类型。