当前位置:C++技术网 > 资讯 > 面向对象,你真理解了吗:2 面向对象发展的前奏

面向对象,你真理解了吗:2 面向对象发展的前奏

更新时间:2015-06-23 17:27:00浏览次数:1+次

    每一种事物和思想的出现都是有其原因的,存在就是合理的,可能局部性合理,或者全局性合理。从C语言到C++语言的发展,正是看到思想的转变。这是与我们的社会的物质生活息息相关的,而不能将其发展与现实生活抽离开。
    C预言时代是面向过程的时代,思考问题的方式也是面向过程的。什么是过程?过程就是一个流程,从头到尾。很早的时候,那时候主要是单进程单线程程序,程序的走向是一个线性的,跟走流水线一样的。只要走完一个过程,功能就实现了。为了提高编码效率,进而引入了模块化编程。以函数体为单位,将各个功能进行封装,这样就可以很好的移植,只要将整个函数复制到其他地方就可以使用了。因为这个函数与其他函数没有关联,耦合度为0。耦合度就是与其他模块的关联度,比如,一个函数内部的变量是全局的变量直接操作,而不是对参数进行操作,这样就有很大的关联,一旦函数移植到其他程序,那全局变量就无法使用,函数就不能正常工作了。所以,编写函数时要降低耦合度,函数只处理参数传进来的变量,这样移植性就很好。还有,函数间的相互调用,也是大大提高了耦合度,一旦离开了被调的函数,这个函数就无法正常工作了。这是面向过程的模块化的很重要的两点。如果函数与函数之间关联很大,千丝万缕,那就是“牵一发而动全身”,后来再修改时,自己都不敢随意修改,这样的代码的维护,是要很高的心理素质的。就是为了提高可维护性,才引入模块化编程。不过,不管怎么样,始终脱离不了面向过程的本质,也就是说,尽管是模块化了,一个功能的执行,还是用过程的形式来的。只不过,将各个子功能写成小函数,使用时将它们重组而已。结果还是组成一个流水线,前一个函数的执行结果会对后面的结果造成影响,后面函数的参数是前面函数处理后的变量。顺序不能颠倒,否则就破坏了这个过程,那结果就达不到预期效果了。这是在编码实现功能时的一个现象。
    而在抽象的思维层次里,面向过程的概念比编码中的实现更加高度总结些。面向过程中,函数是最重要的载体。函数是一个功能体,是一个功能实现者。一个函数就实现一个特定的操作,操作的对象就是参数。也就是说,函数的功能是固定的,你放进来合适的变量,我就可以处理,处理完就返回结果。函数就可以看做一个加工厂,原料进来,产品出去,工厂里不存在自己的数据东西,唯有一组过程来实现加工。就好像函数是一个通用的无私奉献者,没有隐私,没有私心。或许这样说你还不是很清楚,但是等看到下一篇的对象对象的解说时,你对比一下,就很清楚了。面向过程强调的是过程,强调的是功能点,而面向对象强调的是个体,强调的是数据点。对象对象的下一篇详细解说。现在继续说面向过程的。既然是一个过程,就是一组动作,这一组动作只为完成一个特定的功能,完成后就结束。就像你伸手打一拳空气,打完就结束,然后这一个过程每次都可以使用,不会影响到后一次的使用。虽然说函数中有变量,但是是局部变量,函数执行完后,一切又回到了初始状态,它根本就不知道以前是否执行过。不过,不要使用静态变量和全局变量,这样破坏了函数作为一个独立的功能体的特性,这也不是这里讨论的范围。
    函数是个万用功能体,它处理的目标是外部的,而内部的变量则是辅助处理外部目标而存在的。这也是和面向对象完全不一样的思想。这个区别在两种的对比中详细讨论。目标是外部的,那就是说,核心是函数方法,也就是函数内的过程。
    不过,随着社会发展的日益高速化,面向过程虽然有模块化,一定程度上提高了开发速度,但是在重组功能时,重组时还是比较耗费时间,并且引用以前的代码也很不方便,都限制了开发的效率。可以说,模块化的出现,在面向过程编程中基本走到了很高的水平,以至于不能提高多少效率了。因而大师们为了适应社会的需求,提出了完全不一样的思想,那就是面向对象的思想。不过,面向过程的思想,必然是面向对象的一部分,因为面向对象的方法的实现,还是基于面向过程的。而模块化思想在面向对象中也是很有用处的。而面向对象的应用则是将模块化应用在了类了,以类为单位而已。
    思想是不受语言限制的,也不受实现方法限制的,甚至思想与思想之间可以融合。模块化思想照样可以应用在面向对象中一样,并且面向对象思想仍然要以过程作为基础。所以不要误以为面向过程是过时的,过时的只是一种实现形式,思想永远都不会过时,并且什么地方都可以适用,只要看你有没有想到。正如第一个篇的几重境界的放之四海而皆准一样,万用的东西就是思想。而C++的发展,从面向过程到面向对象,最后又到达泛型编程。而泛型编程里的算法,就是面向过程的思想,将通用算法作为功能体。所以说,思想都是可以杂糅在一起的,好与不好就看你怎么用了。