首页 > 代码库 > 结构化方法与面向对象方法的比较
结构化方法与面向对象方法的比较
一. 引言
结构化方法与面向对象方法是当今世界两种主流的程序设计理念,其中结构化设计思想出现的时间较早,是在上世纪60年代为了解决goto语句带来的程序结构紊乱的问题时被提出的。而随着软件规模的逐步扩大,面向过程的结构化方法慢慢地显露出很多开发上的弊端,因此更适合大型软件开发的面向对象设计理念应运而生。下面将从几个不同的方面分别对结构化方法与面向对象方法进行剖析,并比较两者的异同。
二. 结构化方法
1. 什么是结构化方法
结构化方法的精髓在于将一个复杂的问题划分为多个易于解决的小问题,通过对各个小问题逐个击破来实现对原问题的求解。它由结构化分析、结构化设计和结构化程序设计三部分有机组合而成。
其基本要点是自顶向下、逐步求精、模块化设计、结构化编码,下面将分别解释:
自顶向下:在进行程序设计的时候,开发人员首先应该站在一个更高的角度来审视整体的结构,而不应该刚开始就拘泥于一些小的细节,从最上层开始设计,逐步使得问题具体化。
逐步求精:由于复杂的问题被分成了很多小的部分,因此如果我们只通过检验程序的最终成果会使得效率低下,也失去了结构化设计的意义。因此我们应该为每一个小的部分规定一个过渡性质的目标,当所有过渡目标完成了的时候,总的问题便也就迎刃而解。
模块化设计:这又回到了刚才所说的结构化方法出现的背景上,即如何尽量减少goto语句的使用,进而提升程序的结构化程度。在goto语句是否应该被禁用的问题上,各家各执一词,但总的趋势是,只在能够帮助程序结构更清晰的情况下使用goto语句才是最好的选择。
结构化编码:将通过结构化方法设计好的各部分算法通过计算机语言的形式表现出来。
2. 怎样进行结构化分析
结构化分析方法分析的步骤如下:
①分析当前的情况,做出反映当前物理模型的DFD;
②推导出等价的逻辑模型的DFD;
③设计新的逻辑系统,生成数据字典和基元描述;
④建立人机接口,提出可供选择的目标系统物理模型的DFD;
⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
⑥选择一种方案;
⑦建立完整的需求规约。
使用的手段主要有数据流图、数据字典、结构化语言、判定表和判定树等:
数据流图:从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。
数据字典:是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明,使用数据字典为简单的建模项目。
结构化语言:将自然语言加上程序设计语言的控制结构就成了结构化语言,专门用来描述加工逻辑。所以,它既有自然语言灵活性强、表达丰富的特点,又有结构化程序的清晰易读和逻辑严密的特点。
判定表:判定表是一个表格,分为四个部分,其左部是条件或数组元素的名称,右上部是所有条件的组合,左下部是处理中活动的名称,右下部标明条件组合和相应的活动的对应关系。
判定树:一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
3. 结构化方法的优缺点
结构化设计使得每个分解出来的模块内部,只有一个入口和一个出口,这使得程序易于阅读、理解和维护,并且能够比较准确地定位错误出现的位置。在自顶向下的分析过程之中,开发者能从全局和部分两个角度审视设计的完整性和有效性,目标明确,提升了系统开发的总体管理和控制功能,因此能够最大限度地保证系统的正确性和稳定性。
然而,世界上没有绝对完美的事物,结构化设计虽然能够使得程序结构更加清晰,但是却也付出了更多的人员和时间的代价,相比之前的工程周期有了明显的增幅。同时,由于设计阶段先于开发阶段进行,因此用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。同时,由于为每个部分都规划了过渡性质的目标,因此当在开发过程中如果遇到需求发生变化的情况,很难进行调整。
三. 面向对象方法
1. 什么是面向对象方法
面向对象方法主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能够映射问题域,也就是说,系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。
面向对象方法被誉为“研究高技术的好方法”,并被期望能够对当今计算机学界,带来像70年代的结构化分析出现时的那种影响力。面向对象方法有三大特征,分别是封装、继承、多态,下面结合自己的体会对这三点进行说明。
封装:将某个部分封装起来,不向使用者提供细节,而只提供有限的接口,这样能够保护对象内部的属性不被使用者修改,减少错误发生的可能性。并且封装同时也为对不同的使用者提供不同权限提供了可能性。
继承:继承能够促进代码的重用,减少代码篇幅,并且能够使实体之间的关系更加清晰。例如,某个工厂在生产一个型号的笔记本电脑的时候,会首先确定一个标准,即确定一个设计样例。如果之后对这个产品进行升级,没有必要从零开始重新设计,而只需要对改进的地方进行修改即可。继承的特性便满足了这样的期望,大大提升了编程效率。
多态:多态是指程序中允许出现重名的情况。对于同名但参数不同的方法而言,这能够使得程序的抽象化程度变高,并且能够减少用户在为方法起名时的其他考虑。
2. 怎样进行面向对象分析
面向对象分析有五个阶段:标识对象、标识结构、标识主题、定义属性、定义服务,即分五个层次建立面向对象分析的模型.面向对象分析的优点是使功能分析与数据分析使用统一的概念和方法,克服了结构化分析中两者之间的不一致性和不协调性。下面分条以更生活化的方式进行解读。
2.1 找出最关键的一些业务场景。一般通过动词来寻找,例如一个学生参加某个考试,那么考试就是一个业务场景;如果一个学生去图书馆借书,那么借书就是一个业务场景。
2.2 分析 每个业务场景中有哪些参与者,并确定哪些参与者以服务的形式参与,哪些参与者以对象的形式参与,服务在系统中一般只有一个实例,而对象我们会关心到底是哪一个。
2.3 分析每一个场景参与者对象的基本状态。基本状态是对象与生俱来的状态特征,像是一个人的身高体重,在出生的时候,就已经有这两个状态了,即使这两个状态会随着人的成长而逐渐变化。相比较而言,一个人拥有某个证书,证书这个特性如果说放在刚才的环境中,就不能说是这个人与生俱来的状态,因此不能算作基本状态。
2.4 分析每个场景的参与者对象分别扮演什么角色参与场景,整个场景的完整交互过程是怎样的,对象在参与场景的过程中执行了哪些交互行为。
2.5 分析交互过程结束后,每个场景的参与者对象的基本状态会发生哪些改变。例如两年后,一个儿童的身高比之前更高了,身高这个状态在两年的成长中发生了改变。
2.6 分析和记录这一个交互行为,并记录这次交互行为会产生哪些额外的信息。
3. 面向对象方法的优缺点
面向对象的分析方法由于是模拟的现实世界的对象以及对象之间的联系,因此在设计的时候易于对程序各部分进行更为准确的划分。同时,它还有稳定性好、可重用性好、较易开发大型软件产品、可维护性好等优点。
面向对象也有很多领域并不适用,例如在数学运算等对象化很弱的编程领域中。另外,面向对象造成了一定的性能损失。
四. 结构化方法与面向对象方法的异同
结构化方法是将系统看成是过程的集合,过程与数据实体之间交互,过程接受输入并产生输出。面向对象方法则不再把程序看成工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合。
1、从概念方面看,结构化软件是功能的集合,通过模块以及模块和模块之间的分层调用关系实现;面向对象软件是事物对象的集合,通过对象以及对象和对象之间的通讯联系实现;
2、从构成方面看,结构化软件是过程和数据的集合,以过程为中心;面向对象软件是数据和相应操作的封装,以对象为中心;
3、从运行控制方面看,结构化软件采用顺序处理方式,由过程驱动控制;面向对象软件采用交互式、并行处理方式,由消息驱动控制;
4、从开发方面看,结构化方法的工作重点是设计;面向对象方法的工作重点是分析;但是,在结构化方法中,分析阶段和设计阶段采用了不相吻合的表达方式,需要把在分析阶段采用的具有网络特征的数据流图转换为设计阶段采用的具有分层特征的软件结构图,在面向对象方法中设计阶段的内容是分析阶段成果的细化,则不存在这一转换问题;
5、从应用方面看,相对而言,结构化方法更加适合数据类型比较简单的数值计算和数据统计管理软件的开发;面向对象方法更加适合大型复杂的人机交互软件的开发。
五. 总结与感想
结构化方法与面向对象方法无绝对好坏之分,只能在遇到实际问题的时候,衡量各自的利弊,找出一种最适合解决该问题的方法。其实说是找出一种,也不尽然。对于小规模的程序来说,我们可能会有“选结构化”或者“选面向对象”的说辞,但是对于绝大多数的大型软件来说,结构化方法与面向对象方法是共同存在的。例如,我想要模拟一个电梯的运行过程,如果从宏观上来分析,那么我用面向对象的方法,用类来模拟现实电梯的功能实体模块,并通过代码产生模块之间的动作,是更加推荐的一种方式。但是如果细化到很多的细节,像是进行一些基层的循环操作的时候,我用结构化方法显然更能够达到省时省力的目的。因此,我们应该充分运用两者各自擅长的领域,并将它们有机地融合在一起,这样能够使我们地开发过程更加顺利。
六. 引用
- 百度百科:结构化分析方法、面向对象分析方法。
- 维基百科:如何进行结构化分析。
- 博客园“汤雪华的博客”:面向对象分析方法http://www.cnblogs.com/netfocus/archive/2011/09/18/2180656.html
结构化方法与面向对象方法的比较