面向对象和面向过程的区别-文章摘录

上一篇 / 下一篇  2017-03-04 10:36:39 / 个人分类:软件开发测试思想

”所谓面向过程就是以要解决的问题为思考的出发点和核心,并使用计算机逻辑描述要解决的问题和解决问题的方法。针对这两个核心目标,面向过程的程序设计语言注重高质量的数据结构和算法,研究用什么样的数据结构来描述问题,以及采用什么样的算法来高效地解决问题。

在20世界70,80年代,大多数流行的高级语言都是面向过程的程序设计语言,如Basic,ForTan,Pasale and C等。这类语言面向求解问题的过程,而不依赖于计算机硬件,可移植性相对较好,在计算机要解决的问题还不是非常复杂,使用的范围还不是非常广泛的条件下,是非常有效的解决问题方法。但面向过程的程序设计语言有一个致命的缺点,它极度面向过程,即使需要解决的问题发生微笑的变化也会对程序本身产生很大的影响,也就是说需要程序员对程序做较大的改动。而且,在不同的问题需要不同的程序解决,问题与解决几乎是一对一的,以往的成果很难直接利用。因此,其维护性和可重用性都比较差。随着计算机应用范围的迅速扩大,这种语言的缺点就更明显地暴露出来。而解决这些问题的最有效方法就是另外一种面向对象的思维模式。”

“面向对象和面向过程的不同之处

在面向对象设计中,属性和行为都包括在一个对象中,然而在面向过程编程或结构设计中,属性和行为是分开的,这是面向对象和面向过程编程之间最大的不同。

自青铜器时代以来,面向过程编程已经成为主流,因此,为什么还要改变呢?首先,在面向过程编程中数据和过程是分开的,有时数据是全局的,因此很容易超出你的范围修改掉数据,这意味着对数据的访问是不能控制的,也是不能预测的,如多个函数访问相同的全局数据,第二,因为你不能控制谁可以访问数据,测试和调试变得非常困难,通过使用对象将数据和行为集成在一起就可以解决掉这些问题。

无全局数据

当设计优良时,可以保证在面向对象模型下不会存在全局数据,这个事实在面向对象系统中提供了大量的数据集成。

对象比原始数据类型如整数和字符串更多,对象包括了实体如整数和字符串,它代表属性,还包括了方法,它代表行为。在一个对象中,你使用方法操作数据,或许更重要的是,你可以控制对象中成员的访问(包括属性和方法),这意味着其中一些成员,如数据类型和方法,对其它对象可以隐藏起来”


“面向对象是为了解决系统的可维护性,可扩展性,可重用性,我们再进一步思考,面向对象为什么能解决系统的可维护性,可扩展性,可重用性? 

面向对象产生的历史原因有下面两点: 

1、 计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。

2、 结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路。 

    可见结构化设计在设计系统的时候,无法解决重用、维护、扩展的问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路,习惯,步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。 

    与此同时,人们发现,在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,这种客体具有属性和行为,而客体是稳定的,行为不稳定的,同时客体之间具有各种联系,因此面向客体编程,比面向行为编程,系统会更稳定,在面对频繁的需求更改时,改变的往往是行为,而客体一般不需要改变,所以我们就把行为封装起来,这样改变时候只需要改变行为即可,主架构则保持了稳定。 

于是面向对象就产生了。 

然而人们追求的系统可维护性,可扩展性,可重用性又是怎么在面向对象中体现出来的呢? 

首先看看面向对象的三大特征: 

封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 

继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。 

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

    因此面向对象能实现人们追求的系统可维护性,可扩展性,可重用性。面向对象是一种编程思想,起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,但面向对象的思想已经涉及到软件开发的各个方面,比如现在细分为了面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)”


“面向过程的程序设计,是自顶向下,集中式开发,即从大问题分解为小问题 一层一层的解决问题,复用、可维护性、可扩展性比较差。

面向对象程序设计是一种方法学,以抽象数据类型为核心,程序应该由对象组成,出发点不是系统干什么,对什么对象进行干(如登录需要对用户进行做操作)(正好与面向过程设计方法反着)。

面向对象程序设计是自底向上,分散式开发,由对象组合而成,从而好复用、好扩展、好维护。”


TAG: 面向对象 摘录

 

评分:0

我来说两句

Open Toolbar