结构化方法与面向对象方法的介绍与对比

结构化和面向对象,这两个概念在计算机领域的中应用十分广泛。在软件工程中,结构化和面向对象的思想也占有重要地位,产生了结构化方法和面向对象方法,用来指导软件生产。

一、结构化方法

结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化方法强调开发方法的结构合理性以及所开发软件的结构合理性。针对软件生存周期各个不同阶段,可以分为结构化分析(SA)、结构化设计(SD)、结构化程序设计(SP)等方法。

1.1结构化分析方法

结构化分析方法是面向数据流的分析方法,是70年代由Yourdon、Constaintine及DeMarco 等人提出和发展,并得到广泛的应用,其基本思想为分解和抽象。

结构化分析方法的设计原则有:

1)使每个模块尽量只执行一个功能(坚持功能性内聚);

2)每个模块用过程语句(或函数方式等)调用其他模块;

3)模块间传送的参数作数据用;

4)模块间共用的信息(如参数等)尽量少。

在结构化分析方法中,常用的工具有:

数据流图

数据流图(Data Flow Diagram,简称DFD)是描述系统中数据流程的图形工具,它标识了一个系统的逻辑输入和逻辑输出,以及把逻辑输入转换逻辑输出所需的加工处理。通常,一个系统的DFD图会进行分层设计,使数据处理过程更加有层次,逻辑更加清晰。DFD图的设计原则为:数据守恒与数据封闭原则、加工分解的原则、子图与父图的平衡、合理使用文件。

数据字典

分层数据流图只是表达了系统的“分解”,为了完整地描述这个系统,还需借助“数据词典”(data dictionary)对图中的每个数据和加工给出解释。对数据流图中包含的所有元素的定义的集合构成了数据词典。它有四类条目:数据流、数据项、文件及基本加工。在定义数据流或文件时,使用下表给出的符号,将这些条目按照一定的规则组织起来,构成数据词典。

 

在以上工具的辅助下,我们可以进行完整的结构化分析,一个典型的结构化分析过程为:

①分析当前的情况,做出反映当前物理模型的DFD;

②推导出等价的逻辑模型的DFD;

③设计新的逻辑系统,生成数据字典和基元描述;

④建立人机接口,提出可供选择的目标系统物理模型的DFD;

⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;

⑥选择一种方案;

⑦建立完整的需求规约。

 

1.2结构化设计方法

结构化设计(Structured Design, SD)方法是使用最广的一种设计方法,该方法适合于软件系统的总体设计和详细设计,特别是将一个复杂的系统转换成模块化结构系统,该方法具有它的优势。结构化设计方法具有以下特点:

相对独立、功能单一的模块结构

结构化设计的基本思想是将系统设计成由多个相对独立、功能单一的模块组成的结构。由于模块之间相对独立,每一模块就可以单独地被理解、编写、测试、排错和修改,从而有效地防止错误在模块之间扩散蔓延,提高了系统的质量(可维护性、可靠性等)。因此,大大简化了系统研制开发的工作。

“块内联系大、块间联系小”的模块性能标准

“模块内部联系要大,模块之间联系要小”,这是结构化设计中衡量模块“相对独立”性能的标准。事实上,块内联系和块间联系是同一件事的两个方面。系统中各组成成分之间是有联系的,若把联系密切的成分组织在同一模块中,块内联系高了,块间联系自然就少了。反之,若把密切相关的一些组成成分分散在各个模块中,势必造成很高的块间联系,这将影响系统的可维护性。所以,在系统设计过程中一定要以结构化设计的模块性能标准为指导。

采用模块结构图的描述方式

结构化设计方法使用的描述方式是控制结构图(模块结构图)。

结构化设计常用的工具有:

程序流程图

程序流程图是一种传统的、应用广泛的软件过程设计表示,通常也称程序框图。构成程序流程图的最基本图符有:

按照结构化程序设计要求,程序流程图构成的任何程序可用5种控制结构来描述,分别是:

1)顺序型:几个连续的加工步骤依次排列构成。

2)选择型:由某个逻辑判断式的取值决定选择两个加工中的一个。

3)先判定型循环:先判断循环控制条件是否成立,成立则执行循环体语句。

4)后判定型循环:重复执行某些特定的加工,直到控制条件成立。

5)多分支选择型:列举多种加工情况,根据控制变量的取值,选择执行其中之一

 

盒图(N-S图)

1973年,美国学者I.Nassi 和 B.Shneiderman提出了一种在流程图中完全去掉流程线,全部算法写在一个矩形阵内,在框内还可以包含其他框的流程图形式。盒图有三种基本的控制结构表示,与程序流程图相对应。

顺序结构

分支结构

循环结构 当型循环

循环结构 直到型循环

 

二、面向对象方法

面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。

2.1基本原则

1)抽象

抽象是处理现实世界复杂性的最基本方式在OO方法中它强调一个对象和其他对象相区别的本质特性对于一个给定的域确定合理的抽象集是面向对象建模的关键问题之一

2)封装

封装是对抽象元素的划分过程抽象由结构和行为组成封装用来分离抽象的原始接口和它的执行。封装也称为信息隐藏Information Hiding它将一个对象的外部特征和内部的执行细节分割开来并将后者对其他对象隐藏起来。

3)模块化

模块化是已经被分为一系列聚集的和耦合的模块的系统特性对于一个给定的问题确定正确的模块集几乎与确定正确的抽象集一样困难通常每个模块应该足够简单以便能够被完整地理解。

4)层次

抽象集通常形成一个层次,层次是对抽象的归类和排序。在复杂的现实世界中有两种非常重要的层次一个是类型层次另一个是结构性层次 。确定抽象的层次是基于对象的继承,它有助于在对象的继承中发现抽象间的关系,搞清问题的所在理解问题的本质。

2.2特点

1)强调系统开发的整体性和全局性

2)侧重于数据转换的过程而不是数据本身

3)系统的开发周期长

4)封装性 

对象的概念突破了传统数据与操作分离的模式。对象作为独立存在的实体,将自由数据和操作封闭在一起,使自身的状态、行为局部化。

5)继承性 

  继承是面向对象特有的,亦是最有力的机制。通过类继承可以弥补由封装对象而带来的诸如数据或操作冗余的问题,通过继承支持重用,实现软件资源共享、演化以及增强扩充。

6)多态性 

  同一消息发送至不同类或对象可引起不同的操作,使软件开发设计更便利,编码更灵活。

7)易维护性

面向对象的抽象封装使对象信息隐藏在局部。当对象进行修改,或对象自身产生错误的时候,由此带来的影响仅仅局限在对象内部而不会波及其他对象乃至整个系统环境,这极大方便了软件设计、构造和运行过程中的检错、修改。

 

三、对二者的对比与思考

我认为,结构化方法主要针对的是一件一件事情,这也是结构化方法与面向对象方法的主要区别,因为面向对象方法针对的是一个一个的对象和类。这体现了两种不同的思考问题的方式。前者似乎体现了一种精密、严谨的逻辑思维,后者则更多是贴近自然的分析。结构化方法比较容易上手,各种模块使用起来比较方便快捷;而面向对象方法前期分析设计相对于前者来讲更麻烦。所以对于小型的项目,我们最好的选择是结构化方法。当项目的规模成长起来时,结构化方法中各模块灵活独立的特点导致它们难于管理,相反面向对象方法中特别重视对功能方法的管理,而且这种管理使用了是贴近人类自然思维的方式,所以使用起来更加方便。因此,在较大的项目中,结构化方法就不如面向对象了。