面向对象程序设计比传统的面向过程程序设计有什么好处?

http://chenlq.net/dev/cpp-why/52-object-oriented-programming-than-the-traditional-process-oriented-program-design-what-are-the-benefits.html
Q:

这个问题,有点类似于知乎上的另外一个问题:

    面向对象编程的重要性在哪?
    对于OO我是菜鸟,目前也只是大致了解C sharp和Python的语法。至于C++、java没学过,我不是cs相关专业的。

    RT,起先看到知乎上很多人说OO的好处就是提高程序可维护性。后来又有人说OO抽象封装层数一多会导致难以修改和维护。

    百度百科是说【……更利于人理解的方式对于复杂系统的进行分析、设计与编程,来提高编程的效率】

    我现在的感觉是OO除了图形界面必须要用,貌似没有必要用到别的地方。

    OO的重要性到底体现在哪?

A:

这实际上是我们在学习C++,Java等面向对象程序设计语言时所遇到的一个非常普遍的问题,都在说面向对象好,那么到底好在哪里?
面对这个问题,知乎上的成增存老师根据他的经验和理解,做了这样的回答:

    从接触第一门语言到现在为止已经差不多10年时间了。说下个人的观点。
    一、编程到底是个什么事物?
    编程(程序设计)实际上是一个对现实世界中的事物抽象,并由计算机语言实现的过程。
    核心的步骤就包含三个:理解、抽象、实现。
    不同的理解思路,会导致完全不同的抽象结果;
    不同的抽象结果就会提供各不同的理解。
    最后根据理解和抽象,由特定的语言完成时间,但其结果要想完全理解还需要前两个步骤支撑。
    有点像建筑中的“房子是什么,房地产设计,盖房子”。(推荐《建筑的永恒之道》)

    二、编程的发展过程到底有哪些?
    程序设计的历史,记得以前知乎上有专门介绍编程的历史,具体地址忘记了。但可以参考百度百科中《计算机历史:http://baike.baidu.com/view/17139.htm#5》
    按照我的理解大致的几个主要阶段:
    1、计算机程序设计历史前阶段;主要是纸带、存储器等原始方式。
    2、计算机语言初级阶段;主要以汇编语言为主,面向的主要内容是“数据存储+指令集”;
    3、计算机广泛工业语言设计阶段;主要以C语言为主的大面积应用,此时由C语言更面向人易懂的方向发展。并且操作系统,编译器,数据库软件开始发展;面向的主要内容是“程序=算法+数据结构”。此时在计算机软件设计学科中主要运用的还是“面向过程”的设计思路。
    4、计算机语言高级发展阶段。主要是一些面向对象语言的出现。主要体现在C++语言的出现。主要面向的内容是“应用=对象+通讯”的方式。甚至很多语言开始“一切皆对象”的设计理念。面向对象的语言主要在该阶段得到了大力提倡。因为C++的复杂,Java的出现降低了复杂度,又充分利用了面向对象的特点。让面向对象的设计更是得到了大面积的推广和应用,尤其在企业级应用开发中。
    5、各类语言频繁出现的繁荣各阶段。各类变成设计语言如面向WEB变成,函数式语言,面向并发的语言,终端设备的编程语言等等;这个阶段不好做评论。

    三、编程的过程解决的问题有哪些?
    1、汇编语言:解决CPU指令集和存储系统的交互问题,提供“可编程”的能力
    2、面向过称语言:提供小面积的问题解决思路,一个系统的代码如果不多,通过面向过程思路将系统划分为多个过程(多个函数+各类数据结构)进行系统设计。提供了初级规模的系统设计问题。
    3、面向对象语言:当面向过程面对复杂的系统,复杂的世界时。如何“更好的理解和抽象”编程问题,变得更加重要。通过面向对象语言的特点“封装、继承、多态”,让程序分析和设计能容纳更大的编程范围和系统规模,也让程序设计人员更好的理解和抽象提供了非常重要的作用。
    4、面向**语言:面向WEB,面向高并发,面向切面,函数式语言,终端开发等是在现有程序设计语言基础上不断改进,并解决特定领域特定问题的发展衍生;

    四、面向对象编程思想的重要性体现是什么?
    大家都知道,面向对象的三大特性“封装、继承、多态”,但个人认为其中的“封装”是面向对象的最核心的特点。
    究其原因,主要是“封装”让一个人可以理解的系统范围可以变得更广,可以让我们“更好的理解和抽象”我们所看到的世界。
    之前一个老师提到面向对象时,提到的是“间接”,我想间接也可以认为是“封装”的升级版。
    而面向对象编程思想的作用,可以看看我们常见的编程原则《见:程序设计的18大原则http://hi.baidu.com/andida591/item/54f8d2dc5e2a9ce1795daafa》,面向对象的思想能更好的指导我们满足这些原则,从而带来“可维护性,可扩展性,可理解性”等让我们能在效率和水平上更加长进的东西。

    以上也是个人的一些总结,不用什么引经据典,但如果知友想更好的了解计算机程序设计这个行当,还是建议能把计算机的历史、程序设计的历史、以及C,C++,Java能学习一遍,更能体会到编程思想在几门语言中的侧重和发展演变原因。

面对这个问题,我也就我对面向对象的理解,谈了一点自己的认识

    这一点,也许可以从面向对象的诞生说起

    在面向对象出生之前,有一个面向过程的人,它将整个待解决的问题,抽象为描述事物的数据以及描述对数据进行处理的算法,或者说数据处理过程。当问题规模比较小,需求变化不大的时候,面向过程工作得很好。
    可是(任何事物都怕“可是”二字),让问题的规模越来越大越来越复杂,需求变化越来越快的时候,面向过程就显得力不从心了,想象一下,当你根据需求变化修改了某个结构体,你不得不修改与之相关的所有过程函数,而一个过程函数的修改,往往又会涉及到其他数据结构,在系统规模较小的时候,这还比较容易解决,可是当系统规模越来越大,涉及到多人协作开发的时候,这肯定是一场噩梦。这就是那场著名的软件危机。
    为了解决这场软件危机,面向对象应运而生了(有问题的出现,必然就有解决问题的方法的出现,英雄人物大都是这样诞生的)
    我们知道,面向对象的三板斧分别是封装,继承和多态,他用封装将问题中的数据和对数据进行处理的函数结合在了一起,形成了一个整体的对象的概念,这样更加符合人的思维习惯,更利于理解,自然在理解和抽象一些复杂系统的时候也更加容易。他用继承来因对系统的扩展,在原有系统的基础上,只要简单继承,就可以完成系统的扩展,而无需重起炉灶。他用多态来应对需求的变化,统一的借口,却可以有不同的实现。
    可以说,面向对象思想用他的三板斧,在一定程度上解决了软件危机,我想这是他重要性的根本体现。

当然,面向对象的思想如此博大精深,岂是我辈一两句话就能说清楚的?这里列出来,只是希望可以供大家参考,起一个抛砖引玉的作用,启发大家通过自己的实践去理解和运用面向对象思想。
当然,如果你对这个问题也有自己的认识和看法,也欢迎交流,这样可以启发更多人。真理,总是在交流的过程中诞生的。

你可能感兴趣的:(面向对象程序设计比传统的面向过程程序设计有什么好处?)