结构化方法和面向对象方法的比较
一、结构化方法起源和发展
1.1 结构化方法概述
结构化方法起源于结构化程序设计,具有面向功能、结构清晰、支持逐步求精等特点,使软件易于维护。在运用结构化开发方法时,设计人员首先需要运用抽象(Abstraction)方法在最高层次上描述问题的解决方案,之后,设计人员在进行逐步求精(Refinement),即通过逐步细化结构最终得出问题的解决方案,在此过程中各个结构内部的信息对外部是不可见的,即信息隐藏(Information Hiding)性。
1.2 结构化方法演变
结构化开发方法主要经历了以下几个演变过程。
① 1967年,Edsger W. Dijkstra提出Go To Statement Considered Harmful,人们开始意识到Go To语句的危害,并寻求一种新的方法,来代替Go To语句在程序中的作用。
② 1971年,Niklaus Emil Wirth提出逐步设计(Step wise design),为结构化设计奠定基础。
③ 1972年,Ben Shneiderman提出N-S图(Nassi-Shneiderman图)。
④ 1974年,提出Warnier/Orr图以及HIPO由IBM的层次化输入-处理-输出图。
⑤ 1975年,由赖瑞·康斯坦丁、爱德华·尤登等提出结构化方法。
至此,结构化设计方法已经基本形成。结构化方法发展到如今主要包括三部分,即结构化分析、结构化设计以及结构化程序设计。
二、结构化方法相关概念
2.1 数据字典DD(Data Dictionary)
数据字典主要包括数据项、数据结构、数据流、数据存储以及处理过程等几个部分,具体定义如下:
① 数据项:数据流图中数据块的数据结构中的数据项说明数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系}
② 数据结构:数据流图中数据块的数据结构说明数据结构描述={数据结构名,含义说明,组成:{数据项或 数据结构}}
③ 数据流:数据流图中流线的说明数据流描述={数据流名,说明,数据流来源,数据流去向,组成:{数据结构},平均流量,高峰期流量}
④ 数据存储:数据流图中数据块的存储特性说明数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,组成:{数据结构},数据量,存取方式}
⑤ 处理过程:数据流图中功能块的说明处理过程描述={处理过程名,说明,输入:{数据流},输出: {数据流},处理:{简要说明}}
2.2 实体关系图 ERD
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
它是描述现实世界概念结构模型的有效方法。是表示概念模型的一种方式,用矩形表示实体型,矩形框内写明实体名;用椭圆表示实体的属性,并用无向边将其与相应的实体型连接起来;用菱形表示实体型之间的联系,在菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n或m:n)。
2.3 功能建模语言DFD(Data Flow Diagram)
构建DFD的具体过程如下(其中PSPEC表示处理规格说明Process Specification):
① 建模第0层DFD。将软件/系统描述为一个泡泡,将外部实体描述为一个方框, 从方框到泡泡的箭头描述实体产生系统所使用的信息,从泡 泡到方框的箭头描述实体使用系统产生的信息。
② 将第0层DFD扩展为第1层DFD。将第0层DFD的一个泡泡精化为第1层DFD。在第1层DFD中, 泡泡对应的是软件/系统的主要处理(或功能),箭头对应各 处理间的数据流。
③ DFD图细化为子DFD。精化过程持续进行,直到每一个泡泡都执行一个简单的操作 ,也就是说,直至每个泡泡所代表的处理都
2.4 状态转移图STD
状态—迁移图(STD)或状态—迁移表被用来描述系统或对象的状态,以及导致系统或对象的状态改变的事件,从而描述系统的行为。属于结构化分析方法使用工具五、面向对象方法。通过行为建模给出需求分析方法的所有操作原则。
在状态―迁移图中,由一个状态和一个事件所确定的下一状态可能会有多个。实际会迁移到哪一个状态,是由更详细的内部状态和更详细的事件信息来决定的,此时在状态―迁移图中可能需要使用加进判断框和处理框的记法。状态―迁移图的优点:第一,状态之间的关系能够直观地捕捉到,这样用眼睛就能看到是否所有可能的状态迁移都已纳入图中,是否存在不必要的状态等。第二,由于状态―迁移图的单纯性,能够机械地分析许多情况,可很容易地建立分析工具。
三、结构化分析和设计
3.1 结构化分析
①分析当前的情况,做出反映当前物理模型的DFD;
②推导出等价的逻辑模型的DFD;
③设计新的逻辑系统,生成数据字典和基元描述;
④建立人机接口,提出可供选择的目标系统物理模型的DFD;
⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
⑥选择一种方案;
⑦建立完整的需求规约。
3.2 结构化设计
①评审和细化数据流图;
②确定数据流图的类型;
③把数据流图映射到软件模块结构,设计出模块结构的上层;
④基于数据流图逐步分解高层模块,设计中下层模块;
⑤对模块结构进行优化,得到更为合理的软件结构;
⑥描述模块接口。
四、面向对象方法
4.1 面向对象的起源和发展
1967年挪威计算中心的Kisten Nygaard和Ole Johan Dahl开发了Si面向对象程序设计mula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言。
世纪70年代初,Palo Alto研究中心的Alan Kay所在的研究小组开发出Smalltalk语言,之后又开发出Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它对后来出现的面向对象语言,如Object-C,C++,Self,Eiffl都产生了深远的影响。随着面向对象语言的出现,面向对象程序设计也就应运而生且得到迅速发展。之后,面向对象不断向其他阶段渗透,1980年Grady Booch提出了面向对象设计的概念,之后面向对象分析开始。1985年,第一个商用面向对象数据库问世。1990年以来,面向对象分析、测试、度量和管理等研究都得到长足发展。
4.2 面向对象的分析方法(OOA)
Object-Oriented Analysis(面向对象分析方法)是确定需求或者业务的角度,按照面向对象的思想来分析业务。OOA只是对需求中描述的问题,进行模块化的处理,描述问题的本质,区别每个问题的不同点相同点,确定问题中的对象。在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:
①确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
②确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
③确定主题(subject)。主题是指事物的总体概貌和总体分析模型。
④确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
⑤确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。
4.3 面向对象的设计方法(OOD)
面向对象的设计方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。在OOD的设计过程中,要展开的主要有如下几项工作。
OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。
这种依赖关系的转换使得系统的各部分具有了可复用性。
OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域(problem domain)的实体,每个对象都有相应的状态和行为。
五、结构化设计和面向对象设计比较
5.1 结构化设计和面向对象设计的相同点
(1)二者在分解和抽象原则上存在联系。
在结构化设计方法中往往采用分解的思想,将一个复杂的问题化整为零,层层消化从而得到一个问题的解决方案。而在面向对象设计中通过抽象求出问题的形式表示,通过接口继承和多态来将抽象的问题转化为具体的问题,最终求出问题的解决方案。
(2)二者在重用性设计原则上一致
在结构化设计中,不希望软件一部份影响软件的其他部分使用,因此会需要利用局部化将代码和数据分隔化,以隔绝不必要的信息。而在面向对象设计中,通过数据以及代码的封装来实现代码和数据的重用,并且提高了安全性。
5.2 结构化设计和面向对象设计的不同点
(1)主要思想不同:结构化的程序设计的主要思想是功能分解并逐步求精。面向对象程序设计的本质是把数据和处理数据的过程当成一个整体——对象。
(2)处理问题的基本单位不同:结构化设计是将现实世界的问题自顶向下分解为若干小模型,小模型内部的控制方法为条件、分支和循环等,这些小模型就是过程。而在面向对象设计过程中,大多以类或对象为基本单位,对于提出的问题多采用封装、继承以及多态等方法,符合人们对日常生活的认知。
(3)数据的处理方式不同:结构化设计直接通过过程处理数据,处理结果能够立即显示。而面向对象的设计将代码和数据封装成一个整体即为类,不同类的对象之间不能直接相互修改各自的数据。
(4)安全性存在差异:面向对象方法支持多线程,当多个线程同时对数据进行操作时,如果控制不好就会导致数据修改的不确定性。而结构化设计方法,由于对数据的操作过程都是由相应的控制语句进行调控的,不支持多线程,这就保证了数据的安全性。