引言
软件工程中构建工程经常使用两种方法:结构化方法和面对对象方法。结构化方法由艾兹格.迪杰斯特拉在1967年发表《goto陈述有害论》时提出。面向对象方法在80年代起逐步形成。两种方法各有优点,相伴存在至今。下面我们就来分析、探讨结构化程序设计方法与面向对象的方法的区别,以及在现实应用中如何在两种方法中做出选择。
一、结构化方法
1. 基本思想
结构化方法程序设计的基本思想是:
a.自顶向下
b.采用模块化技术
c.分而治之
d.逐步求精地将信息系统按功能分解为若干模块进行分析与设计
应用子程序实现模块化, 模块内部由顺序结构、选择结构、循环结构等三大基本控制结构组成。即从代表目标系统整体功能的单个处理着手, 自顶向下不断地把复杂的处理分解为子处理, 这样一层一层地分解下去, 直到仅剩下若干个容易实现的子处理为止, 并写出对每个最低层处理的描述。
2. 分析步骤
结构化分析是一种面向数据流而基于功能分解的分析方法,在该阶段主要通过采用数据流程图、编制数据字典等工具,描述边界和数据处理过程的关系,力求寻找功能及功能之间的说明。
通常所说的“结构化分析”就是“数据流分析”。
数据流分析的核心特征是“分解”与“抽象”。“分解”和“抽象”是两个相互有机联系的概念,下层是上层的分解,上层是下层的抽象。例如,假设系统很复杂,为了理解它,将它分成了5个子系统, 如果子系统仍然比较复杂还可以再继续分解它, 如此下去, 直到每个子系统足够简单, 能清楚地被理解和表达为止。
典型的结构化分析方法可以描述为: 功能分解=功能+子功能+功能接口。问题域映射为功能和子功能, 规格说明间接反映问题域。分析的结果是系统、子系统、功能、子功能层次结构的建立。
3. 优点
1)执行效率高
2)易学易用
3)便于与用户沟通
4. 缺点
1)不能直接反映问题域: 结构化分析方法以数据流为中心, 强调数据的流动及每一个处理过程, 不是以问题域中的各事物为基础, 打破了各事物的界限, 分析结果不能直接反映问题域, 容易隐蔽一些对问题域的理解偏差。
2)数据和代码缺乏保护机制: 一个特定全程数据既可以被操作这些数据的过程访问, 也可以被其他过程访问, 这给程序设计带来了不安定因素, 一个不正常的数据修改或者过程调用可能会破坏正常的程序执行流程或结果。
3)开发过程复杂: 由于结构化方法将过程和数据分离为相互独立的实体, 程序员在编程时必须时刻考虑到所要处理的数据的格式。对于不同的数据格式做相同的处理或对于相同的数据格式做不同的处理都需要编写不同的程序。结构化程序的可重用性不好,修改扩充难度大。
4. 适应项目场合
综上,结构化设计方法的应用域为:
1)适合开发数据处理较多,对反应速度由要求的项目。
2)功能需求明确、规模较小、扩展性要求不高的系统。
3)高性能、大规模并发和嵌入式系统应用开发。
二、面对对象方法
1. 基本思想
面向对象方法的出发点是尽可能模拟人类习惯的思维方式, 使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程, 也就是使描述问题的问题空间与实现解法的求解空间在结构上尽可能一致。面向对象是一种运用对象、类、继承、封装、聚合、消息传递、多态性等概念来构造系统的软件开发方法。它打破了传统的代码、数据分离做法, 将一种数据结构和操作该数据结构的方法捆在一起, 封装在一个程序内, 实现了数据封装和信息隐藏, 通过“操作”作为接口实现信息传递。对外部来说, 只知道“它是做什么的”, 而不知道“它是如何做的”, 使得数据封装、信息隐藏、抽象代码共享等软件工程思想得到充分体现。
2. 重要特征
1)抽象: 从许多事物中舍弃个别的、非本质的特征, 抽取共同的、本质性的特征, 就叫作抽象。抽象是形成概念的必须手段。
2)类和对象: “类”是面向对象语言中的一种抽象数据类型。面向对象方法认为客观世界是由各种对象组成的, 复杂的对象可以由比较简单的对象以某种方式组合而成。每个对象都有自己的属性( 状态和特征) 和方法( 行为) 。
3)继承: 即特殊类的对象拥有其一般类的全部属性与服务。由于具有“继承”性这个特点, 使得程序员对共同的属性以及方法只说明一次, 并且在具体的情况下可以扩展细化或修改这些属性及方法。
4)封装: 表示对象状态的数据和实现各个操作的代码, 都被封装在对象里面, 它与外界的联系是通过对象的对外接口(方法)实现。外界不需要关心对象是如何进行各种细节处理。
5)多态: 指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。就如不同的对象, 收到同一消息可以产生不同的结果。
3. 分析步骤
(1) 分析确定在问题空间和解空间出现的全部对象及其属性;
(2) 确定应施加于每个对象的操作,即对象固有的处理能力;
(3) 分析对象间的联系,确定对象彼此间传递的消息;
(4) 设计对象的消息模式,消息模式和处理能力共同构成对象的外部特性;
(5) 分析各个对象的外部特性,将具有相同外部特性的对象归为一类,从而确定所需要的类;
(6) 确定类间的继承关系,将各对象的公共性质放在较上层的类中描述,通过继承来共享对公共性质的描述;
(7) 设计每个类关于对象外部特性的描述;
(8) 设计每个类的内部实现(数据结构和方法);
(9) 创建所需的对象(类的实例),实现对象间应有的联系(发消息)。
3. 优点
面向对象技术与传统的结构化方法相比有以下优点:
1)可重用性。可重用性是面向对象软件开发的一个核心思路。通过类的继承关系, 使公共的特性能够共享, 简化了对象、类的创建工作量, 增加了代码的可重性。另外, 重用经过测试的代码还可以使产生额外错误的可能性达到最小。
2)可扩展性。可扩展性是对现代应用软件提出的又一个重要要求。类的继承性使类能反映现实世界的层次结构, 多态性反映了现实世界的复杂多样。类的继承性和多态性使软件编码具有良好的可重用性和可扩展性。无需修改源代码就可以使软件功能容易扩充和修改。
3)数据保护。数据和操作数据的算法不再分离, 它们被封装在一起, 对象内部的行为实现细节被隐藏。封装防止了程序相互依赖性而带来的变动影响。
4)可管理性。面向对象的开发方法采用类作为构建系统的部件, 以对象作为系统的基本组成单元, 使整个项目的组织更加合理、方便, 因为归纳事物、划分成类符合人们在认识和管理客观世界的习惯思维方式。
4. 缺点
(1)面向对象方法中对象的确定有时会因客观边界模糊而难以确定,这样就很难保证软件描述的正确性;
(2)面向对象在描述问题域方面的不足。在问题域模型中,面向对象方法把具体或抽象的问题域现象直接表述为对象,同时把现象类型直接表述为类.大多数OOA方法支持多视角模型,即对同一问题域现象,不同的主体可以将它表述为同一对象或类型。但系统的描述者在应用面向对象方法进行建模时常遇到这样的困惑,描述者力图通过面向对象的表述对存在的问题域现象达成一致,然而,结果得到的对象或类并不很适合于某个描述者对对象的独自观察而得到的表述。
5. 适应项目场合
综上,面向对象方法适合对安全性要求较高、需要时常扩展更新、重在用户体验的项目。
三、如何选择开发方法
表1. 结构化与对象化方法的比较
结构化和面向对象是软件工程的程序设计方法中最本质的思想方法。结构化编程的基本思想就是把大的程序划分为若干个相对独立、功能简单的程序模块。它以过程为中心, 强调的是过程, 强调功能和模块化, 通过一系列过程的调用和处理完成相应的任务。面向对象编程以对象为中心, 是对一系列相关对象的操纵, 发送消息给对象, 由对象执行相应的操作并返回结果, 强调的是对象。理论上, 面向对象的程序设计方法将产生更好的模块内聚和耦合特性, 使得软件更易于重用与维护。但在实践中程序设计方法关注软件生命周期的各个环节, 从需求分析、总体设计到编码、测试和维护。
从应用的范围看结构化方法适用于数据少而操作多的问题。实践证明对于像操作系统这样的以功能为主的系统结构化方法比较适应它。面向对象方法正好相反,对于数据库信息管理等以数据为主的而操作较少的系统,用面向对象方法描述要好于结构化方法。
笔者认为,在选择开发方法时,不光要考虑项目本身适合什么方法,还要综合考虑一些现实因素。
软件开发的目标是以最小的代价开发出满足用户需求的软件,为此根据系统的实际需求可以针对具体情况选择采用不同的设计方法,充分发挥面向对象与结构化方法各自的优势。目前在大多数软件系统的分析设计过程中,这两种方法都兼而有之。笔者以为,开发者在开发实践中从实际出发考虑执行效率、开发者的技术水平、系统规模、是否为需求易变化的系统等因素,尽量利用它们各自的优点,尽可能地避免他们的缺点。
如对于开发一些小型嵌入式实时监控系统或同等稳定小系统可用结构化方法;对于开发入门者使用结构化方法和面向对象方法相结合;对于大型系统或者需求易变系统使用面向对象方法;开发的大型软件系统通常是混合型系统,即需要处理实时信息,又需要数据库的支持,同时还涉及大量的事务性操作请求,在这种情况下,在选用面向对象方法的同时在局部处理上可以结合使用结构化方法。总之,根据实际出发,选取合适的软件开发方法,达到最佳的开发效益。
[参考文献]
[1]喻梅.结构化程序设计方法与面向对象程序设计方法之比较[J].科技信息,2009,14:453-454.
[2]符于江.程序设计中结构化方法和面向对象方法的比较[J].电脑知识与技术,2008,21:451-452+456.
[3]张莉,裘国永.结构化方法与面向对象方法的比较分析[J].陕西师范大学学报(自然科学版),2001,02:29-32.
[4]曹昊,许玲,谢赞福,马云云.结构化较面向对象方法优势应用域的研究[J].微计算机信息,2010,21:194-196+78.