顾哥谈面向过程与面向对象的编程

前言

五一节就不发毕设相关的内容了,随便总结一些大学里面所学内容的感想,比如这篇我们来谈谈面向过程与面向对象的编程开发。

这篇文章只表达我自己的理解,试图将一个较抽象的概念说得具体一点,也许对比了官方概念后会发现我说的部分并不恰当。

正文

面向对象编程是什么?对于这个问题其实网上有非常多很官方的回答,然而那些回答至少我看起来还是非常空洞泛泛的。然而面向过程与面向对象具体地表现有何区别呢。

肯定有人会说pascal,C之类的语言就是面向过程,java,C++之类的就是面向对象。也肯定有人会说写成类(class)的编程就是面向对象,否则就是面向过程。其实我觉得这些说法都对,但是感觉又缺了点什么。

我们先通过一个简单的例子来感性认识一下面向对象与面向过程:

加入我们要将一个数(int)插入到一个链表(List)中,我们先不考虑这个List是什么,也不考虑相关函数怎么实现,我们先只看看有哪些可能的调用方案。

如果我们用面向过程的方法来写也许我们会写成

List *l=new List;
int x=100;
list_PushBack(l,x);

而我们如果用面向对象的方法来写会写成什么样呢

List *l=new List;
int x=100;
l->pushBack(x);

如果我这么说我想大部分人是会赞同的。

很明显在第一段代码里面,对List的操作是围绕函数展开的。每次需要操作List时,调用相关函数,将List的具体对象作为参数传递进函数中。


而在第二段代码中,List的操作时围绕它自己的成员函数展开的。当需要操作List时,调用List自己的成员函数,对该List操作。


那么问题来了,这里完全没有说List是如何实现的。如果第一段代码跑在了C++下,而第二段代码却跑在了C下,你认为哪个是面向过程哪个是面向对象呢。


接着请允许我做一件比较辣眼睛的事情,会使List实现的代码看起来充满了违和感


struct Node
{
        int value;
        Node* next;
};
class List
{
    public:
       List();
       ~List();
       Node* head;
};


List::List()
{
}

List::~List()
{
}

void list_Init(List *l)
{
     l->head = NULL;
}

void list_DeleteAll(List *l)
{
    while(l->head != NULL)
    {
        Node *p = l->head;
        l->head = l->head->next;
        delete p;
    }
}

void list_PushBack(List *l,int x)
{
    Node *p = new Node;
    p->value = x;
    p->next = NULL;
    Node *tail = l->head;
    while(tail->next != NULL) tail=tail->next;
    tail->next=p;
}

尽管其中用到了class,也只能在C++下编译,你依旧认为这是一个面向对象的编程吗?


List *l=new List;
int x=100;
l->pushBack(x);

回到这段代码,尽管C语言无法实现其功能,也无法对struct中的成员有像C++中class中private成员一样保护,但是通过函数指针和添加参数,也能勉勉强强封装得像一个类一样。

到这里其实我想说的结论已经浮出水面了,面向对象与面向过程的区别并不在于语言,也不在于其中是否用到了类,其核心区别还是在于开发理念。面向对象工程中最基本的单位是类,而面向过程工程中基本单位就是函数。其实从工程的结构图中我们就能知道这个是面向对象还是面向过程,面向对象的工程往往通过类图来表达整个工程的结构,而面向过程的工程往往通过函数调用关系图来表达整个工程的结构。其实面向对象语言可以写得像面向过程一样,面向过程的语言也可以借鉴面向对象的开发思想。只是面向对象语言更适用于面向对象的开发罢了。


最后

当我最早看到C++标准算法库中的堆这个数据结构时我是非常不适应的,感觉和其他的容器完全不一样(比如vector)

它并没有写成·一个Heap这样的类,而是通过make_heap(),push_heap(),pop_heap()等函数,然后将需要建堆的数据通过参数传递进去,其实就是一个比较典型在面向对象语言中的用面向过程思想开发的例子。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值