结构化方法和面向对象方法之比较
我们都知道,结构化方法和面向对象方法是当前程序设计中主流的两大设计方法,编写程序的时候,我们根据所编写的程序来选择适当的方法进行开发,来获得最大的效率。本文就结构化方法和面向对象方法的特点和过程,分析比较了该两种方法的优劣。
一、结构化方法
结构化方法按生命周期划分由结构化分析(SA)、结构化设计(AD)、结构化程序设计(SP)三部分组成。系统按功能需求分解成若干个子功能模块,子模块再继续进行分解,如此循环直至模块功能变得非常具体,由综合变得单一。这种分解自顶向下,逐层分解,使得每个阶段处理的过程都是用户能够理解和处理的。
1. 结构化分析(Structured Analysis)
结构化分析从80年代起开始广泛使用,这种分析方法将抽象的系统概念转化为用数据及控制表示,即转换为数据流图(DFD),用DFD来描述边界和数据处理 过程的关系。
结构化分析步骤如下:
①分析当前的情况,做出当前物理模型的DFD。
②推导出等价的逻辑模型的DFD。
③设计新的逻辑系统,生成数据字典和基元描述。
④建立人机接口,确定目标系统物理模型的DFD。
1.1 DFD
数据流图是描述系统数据流程的工具,它将数据独立抽象出来,通过图形方式描述信息的流程。
数据流图有4个主要元素:数据流、数据源、对数据的加工和数据存储。在封层DFD中,除顶层数据流图外,中层和底层数据流图都从0开始编号。分层DFD的结构如下图所示:
1.2 DD
数据字典是一种用户可以访问的记录数据库和应用程序元数据的目录。是分析阶段的重要工具,提供对人们不了解的数据的解释。在结构化分析中,数据字典给数据流图上的每个成分加以定义和说明。一个实体一般包括以下内容:
名字、别名、用途、内容描述、备注信息。
2. 结构化设计 (Structured Design)
在结构化设计中,根据结构化分析得到的数据流图,对程序结构、数据结构、过程细节和接口细节进行细化,得到程序结构的设计描述,这个设计描述以系统结构图(SC)的形式呈现。设计过程中,利用模块结构图表述模块之间的关系。对于生成模块结构图,原则是模块内部联系越紧密越好,而模块之间则是越分离越好。
主要步骤入下:
①评审和细化数据流图。
②确定数据流图的类型。
③把数据流图映射到软件结构模块,设计出上层结构。
④基于数据流图逐步分解高层模块,设计中下模块。
⑤对模块结构进行优化,得到更为合理的软件结构。
⑥描述模块接口。
二、面向对象方法
面向对象方法的基本思想是:将对象作为一个基本单位,对象可以定义其属性和操作。可以说,面向对象方法是从人类思维角度考虑问题的,使得软件开发过程变得更加具体,更加容易理解。面向对象方法有三大特征:封装性、继承性和多态性。
在面向对象中,每一个类都相当于一个模板,用这个模板制作出来的实物就是一个一个的对象,当然在制作过程中进行适当的修改也是可以的,当然最后实物的拥有的基本属性和用途都是基本类似的。这样的开发更加利于理解,比如我们可以将一个实物的属性和功能抽象出来,生成一个类的属性和方法,对外部暴露接口,当外部实例化一个对象并调用接口时,就可以说一个什么东西实现了什么功能,符合普通人的思维方式。
1. 面向对象分析(OOA)
使用用例图,从用户角度描述系统功能和各系统功能的操作者,再根据需求建立系统的静态模型来构造系统的结构。最后根据系统执行时的时序状态或交互关系描述系统的行为,从而构造系统的动态模型。其具体过程如下:
①确定问题域
②区分类和对象
③区分整体对象以及组成部分确定类的关系以及结构
④定义属性和服务
⑤确定附加的系统约束
1.1用例图(Usecase图)
用例图是由参与者和用例以及它们之间的关系建立起来的描述系统功能的视图,主要用于对系统、子系统或类的功能行为进行建模。
1.2时序图
时序图描述一个动态过程,通过描述对象之间发消息的时间顺序显示多个对象之间的动态协作。时序图中的每一条消息对应一个类操作或引起状态变化的出发事件。
1.3类图
类图显示了类、接口以及它们之间的静态结构和关系;它用于描述系统的结构化设计。其最基本的元素是类或接口。
2. 面向对象设计(OOD)
面向对象设计的最终目标是建立起系统内部各个模块之间的联系,这种联系通常通过接口实现。各个模块通过接口建立起来依赖,可以大大提高模块的重用性,如果要用到某模块的功能,实现接口即可。具体过程如下:
①改进和完善系统分析的结构
②设计交互过程和用户接口
③设计任务管理以及子系统和任务之间的协调方式
④设计全局资源,确定任务或子系统的资源分配
⑤对象设计
三. 两种方法的比较
由于结构化设计是面向过程的,因此在设计过程中整体思路会比较清晰,目标明确。在设计过程中,系统功能被分解成很多的子模块,阶段性很强,因此更加便于开发和维护,提高软件的质量。反观面向对象方法,在开发的系统比较复杂的情况下,各类之间的交互多了之后可能会比较难以分析。在模块重用性方面,结构化设计面向过程,因此基本谈不上重用,当需求改变或有新的需求后,往往需要修改很多相关代码,从而可能引起结构的改变,而面向对象方法,得益于三大特点,面对新的需求仅仅需要修改相关类即可,系统的结构不会有大的改变。在协作开发时,结构化开发往往不利于开发人员之间的交流,因为每一部分之间的逻辑性非常强,但比较抽象,而类是非常具体的,所以开发人员之间的交流也能更加流畅。