zoukankan      html  css  js  c++  java
  • 当我们在谈论面向对象时,我们在谈论什么

    摘要

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

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

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

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

    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
    

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

  • 相关阅读:
    Redis常用操作命令
    redis-sentinel.conf配置项详解
    Kafka常用命令
    go modules的使用姿势
    GO语言密码加解密(bcrypt)
    ssh-copy-id 秘钥分发报错
    k8s 命令提示
    算法与数据结构(持续更新)
    【spring】 @PostConstruct注解
    Spring Boot 整合Redis
  • 原文地址:https://www.cnblogs.com/zhangshoulei/p/13275697.html
Copyright © 2011-2022 走看看