2019/12/31疑惑之源面向过程与面向对象有何异同面向对象程序设计方法是否将取代面向过程寻根究底从概念上诠释从实际问题中剖析茅塞顿开两者之间相辅相成2019/12/32面向过程与面向对象有何异同你是否曾一直在苦苦纠结面向对象(object-oriented)与面向过程(procedure-oriented)的根本区别是什么?的确,在以前的学习过程中,我们首先接触到的是面向过程的编程语言,例如:C语言,之后我们相继开始了解面向对象的编程语言,例如:C++、JAVA。但是,我们时常会在学习了面向对象的编程语言后,而设计出面向过程的软件的局面,致使我们陷入迷茫。面向对象程序设计方法是否将取代面向过程2019/12/3320世纪80年代提出面向对象的程序设计方法之后,对于程序设计的面向对象和面向过程两种方法,大部分教材偏重于讨论他们的区别,产生两种方法是对立的,互无关联的的想法大有人在,似乎有了面向对象技术,就可以不用面向过程。实际上,面向对象的技术是在面向过程的基础上,为程序设计提供了更多的手段和方法,两种技术不是非彼即此的对立关系,不能说面向对象的技术取代了面向过程,如果用面向对象的技术就要把一个软件任务划分成两个层次,那么面向对象技术是解决第一个层次的问题,面向过程是解决第二个层次的问题,只有在两个层次上的任务都完成之后,才能说完成了整个程序设计任务。2019/12/34从概念上诠释何谓面向过程的程序设计?面向过程就是分析出解决问题所需要的步骤,然后用函数逐步调用就可以一步一步实现,即面向过程化程序设计是先确定算法,再确定数据结构。如图1所示图1结构化程序2019/12/35何谓面向对象的程序设计面向对象程序设计是面向问题中的各种独立个体,程序的分析设计过程就是将程序分解成不同对象之间的交互的过程。将数据(成员数据)及处理这些数据的相应函数(成员函数)封装到一个类(Class)中,而使用类的数据变量则称为对象(Object),如图2所示图2类与对象2019/12/36相比较,面向过程的程序上一步和下一步环环相扣,设计人员只考虑实现客户的需求不考虑以后扩展,一旦客户的需求有变化,那代码量要改变非常大,耗费的时间也相当多。从本质上说,面向过程基本上是一种状态机,不利于修改,当新状态出现的时候,甚至可能需要重设每一个状态解决实现。所以说面向过程是一种直接的编程方法,它是按照编程语言的思路考虑问题。以C语言为例,它就是通过顺序执行一组语句来实现一个功能,这些语句的执行过程就是整个程序。而面向对象的程序设计许多东西都是独立的,每个对象都可以重复使用。面向对象程序设计强调“封装”,“继承”和“多态”。数据和数据相关的操作被包装成对象(严格地说是“类”),每个对象是完全完整和独立的。对象可以有派生的类型,派生的类2019/12/37型可以覆盖(或重载)原有的操作。所有这些,是为了达到更好的内聚性,即一种对象做好一件事情,对象内部的细节外面世界不关心也看不到;同时不同种类的对象之间的依赖性降低,这将降低耦合性,而所有这些都有助于达成一个崇高的目标,就是可重用性。2019/12/38面向过程编程的程序员,习惯于建立数据结构存放数据并定义方法(函数)来操作数据;而面向对象编程的程序员则构造一个对象模型,将数据与方法组织在一起。以计算长方形的周长和面积为例面向过程的程序设计方式思考:1、确定长方形的周长和面积的算法;2、编写两个方法(函数)分别计算长方形的周长和面积;3、求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽。C语言中源代码示例如下:2019/12/39#includeiostream.hintmain(){voidPerimeter(doublex,doubley);voidArea(doublex,doubley);doublea,b,p,s;cina;cinb;p=Perimeter(a,b);s=Area(a,b);cout“长方形的周长是:”pendl;cout“长方形的面积是:”sendl;return0;}调用函数参数2019/12/310intPerimeter(intx,inty){return2*(x+y);}intArea(intx,inty){returnx*y;}被调函数的实现2019/12/311面向对象的程序设计方式思考:1、一个长方形可以看成一个长方形对象(类);2、一个长方形对象有两个属性(长和宽)和两个行为(求周长和求面积);3、将所有长方形的共性抽取出来,设计一个长方形的类;4、通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。C++中源代码示例如下:classRetangle{private:doublea,b;//数据成员,即对象的属性public:2019/12/312Retangle(doublex,doubley);doublePerimeter();doubleArea();};#includeiostreamusingnamespacestd;intmain(){Rectangleobj(1.0,2.0);coutobj.Perimeter()endl;coutobj.Area()endl;return0;}成员函数,即对对象的操作2019/12/313Retangle::Retangle(doublex,doubley){a=x;b=y;}doublePerimeter::Retangle(){return2*(a+b);}doubleArea::Retangle(){returna*b;}成员函数的具体实现2019/12/314两者之间相辅相成面向对象的技术是在面向过程的自顶向下逐步求精最终将软件分解成为具有三种控制结构的若干方法过程或函数基础之上,又提供了抽象、封装、继承、多态技术手段。面向对象的设计包含了面向过程,面向对象比面向过程站到了一个更高的层次上,主要进行总体结构模型设计(构建类),对数据和方法进行封装,面向过程主要是写函数或过程也就是确定类中的方法的实现。就像我们建一个居民小区,先把围墙建好,决定好里面要做什么,然后还是要在里面进行盖房子的过程一样。所以说用面向对象的设计技术软件时包含了面向过程。2019/12/3152019/12/316