当我们在谈论面向对象时,我们在谈论什么

摘要

本文简单的说一下就我理解的面相对象和面向过程。以及什么是数据及其数据类型。并且这两种编程范式有什么不同。重点是闲扯,算是自己学习过程的一点胡思乱想。

光的本质是什么?是粒子?是波?本质是什么或许不重要,也许重要的是他有什么样的性质。

也许观察本身就是一种错误。观察在什么粒度上才算是客观的。

互联网时代究竟有无真相可言。

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

这里就可以看出,当我们在谈论数据,谈论类型时,一定与操作与之相对应。为了将数据和操作严格耦合,我们引入了面相对象的方法。当我们不定义任何操作时,纯数据是意义不大的。因为我们可以采用不同的方法来解释这些数据,从而形成新的类型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章