结构化编程与面向对象编程

在程序设计的早期,程序用流程图和自顶向下的方法设计。采用这种设计方法,程序员会将一个大的问题分解成更小的任务,然后为每个更小的任务编写一个过程(或函数)。最后,程序员会编写一个主过程来启动程序流程,随后根据程序流程走向,调用想要的其它过程。这种类型的程序设计被称为结构化编程。现在有很多结构化编程语言被广泛使用,最突出的就是C语言。

在结构化编程中,程序围绕着要解决的任务来设计。编写程序就是编写执行特定任务的过程,过程中需要用到的数据通过过程参数传递到过程中。过程可以查看以及改变传递进来的数据,并可以将值返回给调用它的过程。

20世纪70年代以后,面向对象编程(Object Oriented Programming,简称OOP)开始流行。OOP采用了一种完全不同的方法来开发计算机应用程序。在这种方法中,程序不是围绕着要解决的任务来设计,而是围绕着要解决的问题中的对象来设计。对于每个对象,我们会编写一个类来描述对象的属性和行为。类是对象的描述。同样,对象是类的实例。对象由属性和行为组成。属性是对象所具有的特征,而行为是对象可以做的动作。对象的每个属性被表示为类中的一个成员变量。对象的每个行为成为类中的一个方法。

为演示结构化编程和面向对象编程的区别,我们用一个简单发工资程序来做示例,以帮助理解。

假如某个公司想让我们编写一个发工资的程序。该公司的员工是每周发一次工资,但是员工薪酬体制有所不同:有些员工的工资按照日薪制,根据每周工作时间来计算报酬;某些员工的工资是固定的年薪。此外,还要计算工资中要扣除的社保、医保以及所得税。

如果我们用结构化编程方式来编写程序,那么程序中就要为发工资的任务编写很多过程。例如,我们可以编写一个称为computePay()的过程,来输入一个员工的薪资数据,并返回其工资。还可以编写称为computeMedicareTax()、computeSSTax()的过程计算医疗保险、社保等等。每个过程需要员工的数据传递进来。例如,如果想调用computePay()过程,我们需要将员工的报酬信息(例如工作时间、时薪)传递进来。数据在过程之间传递,这是结构化编程中经常发生的。过程更改传递进来的数据,返回数据给调用它的过程。

随着员工发工资程序的发展,为了让每项工作顺利开展,我们将会发现需要添加和更改过程。例如,开始编写computePay()过程时,我们会发现有两种不同类型的员工:拿时薪的员工和拿年薪的员工。在这种情况下,我们需要写两个computePay()过程,一个针对拿时薪的员工,另一个针对拿年薪的员工。

现在,我们再从另外一个角度来看为员工发工资的程序。这次,我们不将问题看作是需要执行的小任务,而是从判断问题域中的对象开始,也就是采用面向对象编程的方式来编写程序。

对象可以是问题域中出现的任何人、事物或者实体,简单点说就是“东西”。在发工资示例中,我们要给员工发工资,所以员工(Employee)就是对象。员工为公司工作,所以公司是另一个对象。在更深入地分析后,我们也许会发现发工资的部门也是一个对象。在开始编写程序后,我们会发现在初始设计中不太明显的其它对象。

在已经找到问题域中的对象后,我们就要编写一个类来描述每个对象的属性和行为。例如,我们将需要一个Employee类来容纳一个员工的属性和行为。

一个Employee对象的属性是指员工有什么,例如,姓名、地址、雇员号、社保号等等。每个属性将用Employee类中的一个成员变量来代表。

一个Employee对象的行为是员工对象可以做什么,或者我们想这些对象做什么。员工可以做很多事情,但是对于发工资程序来说,我们只需要能计算他们的报酬,然后每周给他们邮寄一个发薪水的支票。这些想要的行为就成为Employee类中的方法。

对于公司中的每个员工,我们实例化一个Employee对象。如果有50个员工,就需要50个Employee对象。在内存中,就有50个姓名、地址、薪水等等。每个员工可以通过一个引用类型的变量来区分,这样我们就需要50个引用变量。在后面,我们将看到如何实例化一个对象,并将一个引用赋值给它。

注意:面向对象编程与结构化编程一样,都是通过方法之间的调用来传递数据,但是二者之间有相当大的区别。

如果结构化程序中的过程需要数据来执行一项任务,所需要的数据是传递给过程。在面向对象编程中,对象为我们执行任务,方法可以访问所需的数据,而不需要将数据传递到方法中。

例如,如果要计算一个员工的报酬,我们不需要将相关的Employee对象传递给computepay()方法,只需要在代表该员工的Employee对象上调用computePay()方法即可。因为computePay()方法是Employee对象的一部分,所以它可以访问Employee对象中的所有成员变量,包括Employee对象的每小时报酬、薪水和其它所需数据。

猜你喜欢

转载自blog.csdn.net/qq_45097560/article/details/90757039
今日推荐