《Java面向对象》"花为诗"(一)面向对象和面向过程的区别

想学好Java编程语言,就要理解“面向对象的编程思想”。今天我们就用目前软件开发领域中的另一种主流的设计方式“结构化程序设计”来与面向对象程序设计进行对比,来帮助大家理解这种编程思想。

结构化编程语言代表有:C、Basic、Pascal。随着软件开发技术的发展,人们发现面向对象可以提供更好的可重用性,可扩展性可维护性,于是出现了大量的面向对象的编程语言,代表有:C++,Java,C#,Ruby。

一、结构化程序设计

1、简介

结构化程序设计,也叫面向过程程序设计,首先采用结构化分析(Structured Analysis,SA)方法对系统进行需求分析,然后使用结构化设计(Structured Design,SD)方法对系统进行概要设计,详细设计,最后采用结构化编程(Structured Programming,SP)方法来实现系统。使用何种SA,SD,SP的方式可以较好的保证软件系统的开发进度和质量。

结构化程序设计,主张以功能(过程)/步骤为中心,将软件系统进行逐步细分。每个功能都负责对一些数据进行处理:每一个功能都会接收一些数据,然后也会输出一些数据。其设计思想可概括为:自顶而下,逐步精分,模块化。

2、函数

结构化程序设计里最小的程序单元为函数,每个函数都负责一个功能。用于接受一些数据,进行处理,然后输出一些数据。整个软件系统都是由一个个函数组成。其中作为启动程序的函数,我们称之为主函数,主函数里会调用普通函数,普通函数之间依次调用,从而完成整个软件系统的功能。

由于采用自顶而下的设计方法,因此在设计阶段就需要考虑每个模块应该分解成哪些子模块,每个子模块又分解成哪些更小的模块…….依次类推,直到将模块细化成一个一个函数。

每个函数都是具有输入和输出的子系统。函数的输入数据包含函数的形参,全局变量,和常量等等;函数的输出数据包含函数的返回值及传出参数等。

3、局限性

(1)设计不够直观,与人类的习惯思维不一致,开发者需要将客观世界模型分解成一个个功能,用以完成一定的数据处理

(2)适应性差,可扩展性不强。当客户的需求发生变化时,需要自顶而下的修改各个模块,维护成本高

我们简单了解了结构化程序设计,有了对比,我们就可以更好的理解下面的面向对象程序设计思想了~

二、面向对象程序设计

1、简介

面向对象(Object Oriented)是一种更加优秀的程序设计方法。它由面向对象分析(OOA),面向对象设计(OOD),面向对象编程(OOP)三部分组成。它的基本思想是使用类,对象,继承,封装,消息等进行程序设计。它从现实世界中客观存在的事物出发来构造软件系统,在系统构造中尽可能的运用人类的自然思维方式,强调直接以显示世界中的事物为中心来思考问题,认识问题。并根据这些事物的本质特点,把他们抽象地表示为系统中的类,作为系统的基本构成单元,使得软件系统的组件可以直接映射现实世界,并保持客观世界事务及其相互关系的本来面貌。

2、类的设计

面向对象程序设计中,其最小的程序单元是类,类可以生成系统中的多个对象。而这些对象直接映射成客观世界的各种事物(各个实例)。

从图中我们可以看到软件系统是由多个类组成,类代表了客观世界中具有某种特征的一类事物,这类事物往往有一些内部的状态数据,比如人,有姓名,身高,体重,性别,年龄,爱好等各种状态数据。(PS:当然程序没有必要记录该事物的所有的状态数据,程序只需记录业务关心的状态数据)

状态数据,就是指图中的Field1,Field2,......,我们称之为成员变量,有些资料将之翻译为字段,也有些资料将之翻译成属性,但是这个说法不太正确,因为Java中的属性有专门的英文单词Property.

面向对象的语言中除了使用类来封装一类事物的状态数据,而且还提供了操作这些状态数据的方法,为这类事物的行为特征提供实现,即方法Method,因此可以得到以下基本等式:

状态数据+方法 =类定义

从这个等式我们可以看出,面向对象比面向过程的编程粒度要大:面向对象的单位是类,面向过程的程序单位是函数,因此面向对象比面向过程要简单、易用。

我们就拿组装电脑这件事来说:用主板,cpu,内存条,硬盘这样的大件组装和用一堆二极管,三极管,集成电路等小件组装,哪个方便,一清二楚了吧。

三、两者之间的案例比较

案例1:猪八戒吃西瓜

面向对象与人类习惯的思维方式有较好的一致性。假如我们来完成“猪八戒吃西瓜”这样的一个设计:

面向过程,因以函数为中心,因此我们可以表达成:吃(猪八戒,西瓜)。
而面向对象,是以对象为中心,我们就可以表达成:猪八戒.吃(西瓜)。

对比这两句,不难发现,面向对象的语句更接近人类的语言:主谓宾一目了然,十分直观。

案例2:学生早晨起来去学校。

面向过程,以功能/步骤为中心,采用从上往下步步求精,模块化的思想方法。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织起来。此案例采用面向过程程序设计可以粗略的拟成:

1、起床
2、穿衣
3、洗脸刷牙
4、去学校

而这4步就是一步一步地完成,它的顺序很重要,只需要一个一个地实现就行了。

而如果是使用面向对象的话(面向对象的方式主要是把事物给类化,然后再对象化,对象包括状态数据与操作状态数据的方法),我们就需要抽象出一个学生的类型,并在类中定义这四个方法,这个时候就不需要关心方法的顺序了。

public class Student{
    void getUp(){}
    void dress(){}
    void wash(){}
    void goToSchool(){}
}

说的大白话一点,开发者想直接模拟客观世界。定义一个类,对应客观世界的一种事物;业务需要关心这个事物的哪些状态数据,就定义为成员变量;业务需要关心这个事物的哪些行为,程序就可以定义为方法。

案例3: 围棋游戏

结构化程序设计以函数为基本单位,开发者设计的是问题的解决步骤:

1.游戏开始,2.黑棋执行,3.绘制图片,4.判断输赢,5.白棋执行,6.绘制图片,7.判断输赢,8.返回2, 9.游戏结束

而面向对象秉承着“everything is object ”的思想,我们再使用面向对象来设计围棋游戏:

这个时候我们只需要从现实世界中,考虑设计棋子类型(颜色、行为),棋盘类型(大小样式,添加,移除行为),输赢规则等等。

PS:面向对象不是完全脱离面向过程的另外一种编程思想,面向对象中的Method逻辑设计其实体现的仍旧是面向过程的思想。可以说面向过程是面向对象的基础思想。

我们可以发现,面向过程和面向对象的本质都是为了解决问题。只不过,面向过程要关注的是解决问题的一系列步骤,而面向对象就显得方便些,只需要关注这个问题中涉及到的对象(类)和方法即可。当然,方法内部还是会实现“面向过程”的功能的,区别在于思维方式不同。

再举个例子,比如我要乘车去天上人间小区:面向过程需要关注的是,上车,司机启动车子,告诉司机如何走,在哪转弯等等一系列过程。而面向对象只需要说:司机大哥,我要去天上人间小区即可,至于细节就是对象自己的行为(方法)了。

到这里,应该理解面向过程与面向对象的区别了吧!那么,针对于“到家后,我要吃地三鲜”这样的案例,面向过程和面向对象是如何实现的,大家应该可以想到解决方式了吧,欢迎留言

------------------------------如有疑问,敬请留言--------------------------------------------


 

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/86612480