结构化方法与面向对象化方法的比较
1、导语
编程思想之于软件开发,正如建筑结构之于一砖一瓦。不同的编程思想对于软件如何构在某些地方略有相似,在很多地方又有着显著的差异,而这些差异不仅仅在于语言的不同,而是编程开发思想的区别。本片文章将分别介绍结构化方法中的结构化设计和结构化分析,面向对象方法中的面向对象分析并分别总结优缺点。
2、结构化方法
上世纪60年代,由于计算机计算能力和处理的问题复杂度的急速增长,爆发了众所周知的软件危机。为了应对软件危机带来的危害,解决管理大型复杂软件的难题,学术界与工业界共同研究并提出了许多有效的软件开发方法。而其中影响最为深远的,分支最为庞大的方法就是结构化方法。目前,很多软件开发工作组对于结构化方法依旧情有独钟。结构化方法着重强调对现实世界的应用问题进行分解,面向过程设计问题空间的解域,强调自顶向下、逐步求精、模块化设计,这与传统软件开发模式在一定程度上有所契合。结构化分析由结构化分析、结构化设计以及结构化程序设计三部分有机组合而成,接下来笔者将对结构化分析和结构化设计进行介绍。
2·1、结构化分析
结构化分析(Structured Analysis)是软件工程中的一种方法,结构化分析和结构化设计可以分析软件需求,将软件设计和需求转换为规格文件,最后生成软件、硬件配置及相关的手册及程序。结构化分析以数据在不同模块中移动的观点来看待一个系统,系统的功能可以用转换数据流的程序来表示;其善用功能拆解(或由上到下设计)的信息隐藏特性,因此可以关注在重要的细节,而不会被无关的细节干扰。当细节的层级提高时,信息的广度也随之减少。结构化分析的结果是一组相关的图,程序描述以及数据定义,这些数据描述一个程序为符合机能性需求所需要的数据以及需进行的转换。
目前较为通用的结构化分析方法是由汤姆·狄马克于1978年在著作《结构化设计和系统规格》中提出,其中包括的内容为:
a) 系统关系图
b) 数据流程图
c) 数据字典
系统关系图是表示系统和外界环境之间的作用,系统关系图可以表示一个系统和外界相关系统的输入及输出。系统关系图将系统放在整个图的中心,不描述其内部结构,周围则是和其有关的系统、活动及环境,环境图的目的是专注在哪些会影响系统需求及限制的外部因素及事件。
数据流程图(DFD)是结构化分析方法中使用的工具,它反映了系统必须完成的逻辑功能,是一种功能模型,描述了程序中各个功能点的数据变化。在描述复杂的软件系统的信息流向时,通常使用分层DFD来对数据流进行描述。分层DFD分为顶层、中层和底层,从图中可以明显看出自顶向下的设计特点
数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明,使用数据字典为简单的建模项目。在结构化分析中,数据字典的作用是给数据流图上每个成分加以定义和说明,数据流图上所有的成分的定义和解释的文字集合就是数据字典,而且在数据字典中建立的一组严密一致的定义很有助于改进分析员和用户的通信。
2·2、结构化设计
结构化设计方法给出一组帮助设计人员在模块层次上区分设计质量的原理与技术。它通常与结构化分析方法衔接起来使用,以数据流图为基础得到软件的模块结构。SD方法尤其适用于变换型结构和事务型结构的目标系统。在设计过程中,它从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。结构化设计的步骤如下:
a) 评审和细化数据流图;
b) 确定数据流图的类型;
c) 把数据流图映射到软件模块结构,设计出模块结构的上层;
d) 基于数据流图逐步分解高层模块,设计中下层模块;
e) 对模块结构进行优化,得到更为合理的软件结构;
2·3、结构化设计的优缺点
结构化开发的优点在于着重开发过程的整体性和局部功能的局部性,在整体优化的条件下考虑具体的分析设计,同时强调各个开发过程的完整性和顺序性,严格的按照系统规格设计,及时总结反馈,这与传统的软件开发模式一致,也因此导致了结构化开发需要在早期开发中做好充足的数据调查,完备的规格设计,较为合理的管理以及对可能发生的问题具有一定的预见性,尽管自顶向下的设计模式符合大部分开发者的开发习惯,然而对于早期的准备要求相对苛刻,比较容易在开发过程中出现瑕疵而导致开发进度缓慢甚至推翻整个开发计划。
3、面向对象方法
面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。与结构化方法相比,面向对象方法提出的时间相对较晚,然而由于面向对象方法的特点让其在软件开发领域迅速被认可和接受。其特点为使用现实世界的概念抽象的思考问题,强调模拟现实中的概念而不是强调过程和算法。
3·1、面向对象分析
面向对象分析(object-oriented analysis)一种新的系统分析方法,它是采用面向对象的风格进行系统分析和需求定义的重要方法。面向对象分析的关键在于理解问题空间并将其模型化,通过分析模型的属性,进而对对象进行操作。由于面向对象程序设计课程给学生带来的冲击过于强烈深刻,在此不再多余赘述何为对象何为抽象,感兴趣的同学可以登录北航的mooc网站观看吴际老师的公开课。
面向对象分析的具体方法如下:
a) 认识对象及其属性
b) 认识对象的整体及其组成部分
c) 区分整体对象以及组成部分,确定类的关系以及内部结构
d) 对象的形成及类的区分
e) 确定附加的系统约束
f) 对问题空间进行理解并抽象成模型
3·2、面向对象设计
面向对象设计是一种软件设计方法,是一种工程化规范。面向对象设计的主要工作包括:
a) 确定需要的类
b) 给每个类提供一组完整的操作
c) 明确地使用继承来表现共同点
从面向对象分析到面向对象设计是一个逐步扩充模型的过程。面向对象分析以实际问题为中心,可以不考虑与软件实现相关的任何问题,主要考虑“做什么”的问题;面向对象设计则是面向软件实现的实际开发活动,主要考虑“怎么做”的问题。
面向对象设计的主要原则如下。
1.模块化
面向对象开发方法很自然地支持了把系统分解成模块的设计原则:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
2.抽象
面向对象方法不仅支持过程抽象,而且支持数据抽象。
3.信息隐藏
在面向对象方法中,信息隐藏通过对象的封装性来实现。
4.低耦合
在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其他部分的影响降到最低程度。
3·3、面向对象方法的优缺点
面向对象方法与结构化方法最大的不同点在于对问题分析的角度。面向对象方法更加倾向于从问题出发,分析所需的对象的实质特性并构建其结构,这样更加符合人的思维,同时面向对象的特点更加适合于不着眼于规格的增量型开发,因而更加受到敏捷性开发团队的青睐。同样,面向对象方法可以大大提高代码的复用率,减少开发的工作量,同时由于面向对象语言的特点保证了代码的安全性和可修改性。然而这种开发模式有一个较为明显的缺陷,由于对象的构建基于开发人员对于对象特点的认知而不是根据一定的规格,在代码整合的过程中会由于不同人的认知差异而导致代码合并的困难,降低开发效率。
4、总结
结构化开发和面向对象开发都是目前相对流行的开发方式,选择正确的开发方式将对整个开发计划有着至关重要的作用。正如上文所提到的,不同的开发模式可能有不同的方法选择,如何审慎的分析哪种开发方法更加适合自己的项目将是每一个开发团队终将直面的问题,而如何解决这个问题也会很大程度上影响整个开发计划的相率和软件的保障。
5、引用
1、Tom DeMarco (1978). Structured Analysis and System Specification. Yourdon Press, New York, 1978.
2、《Object Oriented Programming》[1],中科永联高级技术培训中心。
3、CN博客http://blog.csdn.net/dql1982/article/details/2048748
4、维基百科 面向对象方法、结构化方法