结构化和面向对象之应用比较
---恢复内容开始---
结构化和面向对象之应用比较
在无数程序设计人员的不断实践和理论改进中,软件工程程序设计中极其重要的指导性思路一直在发生着变革。在相对较长的时间里,不断有新的软件工程中的程序设计思路涌现,其中在生产实践中得到了十分广泛的应用的,当属结构化和面向对象的方法。
结构化程序设计在结构上将软件系统划分为若干功能模块或实体,分别采用模块化程序设计语言编程实现,再由各模块联结,组合成相应结构的软件系统。
而在面向对象的程序设计中,所谓对象是指具有一定结构、属性和功能的实体,采用对象和对象类,以及对象之间的相互通信的消息,描述客观世界中的各种事物及其相互关系,建立面向对象和消息的具有层次结构的世界模型。
1. 结构化程序设计
1.1. 概念综述
所谓结构化设计(structured design, SD),主要属于一种面向数据流或面向过程的设计方式,可以与结构化分析(structured analysis, SA)方法,结构化程序设计方法前后呼应,形成统一完整的系列化方法。具体来看,结构化设计是基于模块化、自顶而下细化、结构化程序设计等基础的一种设计方法,其最为基础的思想是把系统设计成为功能单一、相对独立的模块组成结构。
在结构化软件设计过程中,从技术角度来看,程序的设计过程中主要包括数据设计、接口设计、体系结构设计以及过程设计等工作。其中数据设计主要是将实体关系转化为文件系统结构以及数据库表结构。至于体系结构设计主要是对软件模块之间的关系进行定义。而接口设计则是以数据流图对系统内部中的各种关系及交互机制进行定义。最后,过程设计则是对软件各组成部分的算法以及内部数据结构确定下来,并采取某种形式对算法进行描述。
1.2 建模技术
1.2.1数据流及数据流图
数据流图(data flow diagram, DFD)产生于需求分析阶段。DFD中从系统的输入数据流到系统的输出数据流的一连串连续变换形成了一条信息流。根据数据流类型的不同,可分为变换型和事物型两大类。
变换型数据流中,信息沿着输入通路进入系统,同时由外部形式变换成内部形式进入系统的信息,通过变换中心经加工处理,以后再沿着输出通路变换成外部形式离开系统。变换型数据流的DFD可明显地分为三大部分:逻辑输入、变换中心(主加工)、逻辑输出。变换型数据流结构。
在事物型数据流模型中,信息在沿着输入通路进入系统,由外部形成内部形式后到达事务中心。通常事务中心位于几条处理路径的起点,从数据流程图上很容易标识出来,因为事务处理中心一般会有“发射中心”的特征。因为事务流有明显的事务中心,所以各式各样活动流都以事务中心为起点呈辐射状流出。
而数据流图是结构化系统分析的基本工具。一个数据流图确定了系统的转化过程、系统所操纵的数据或物质的收集(存储),还有过程、存储、外部世界之间的数据流或物质流。从我们画了那么多数据流图来理解,数据流图就是用图形化的方法显示整个现实世界中实际存在的数据流向转化为图表的形式,并最终转化为表,转化为计算机能够接受的形式,所以数据流图是我们做需求分析过程中必不可少的,通过对数据流图的理解,我们会对项目的整个过程有一个深刻的理解
1.2.2结构图
SD方法采用了结构图来描述程序的结构。需求分析阶段用SA产生的数据流图通过结构化设计可以被方便地转换为软件结构图。
结构图主要描述软件结构中模块之间的调用关系和信息传递问题。基本成分有模块、调用和数据。在通常情况下会在结构图中用箭头注释表示模块在调用过程中信息的来回传递。
1.2.3 数据字典
数据字典是结构化的核心。一个定义应用程序中使用的所有数据元素和结构的含义、类型、数据大小、格式、度量单位、精度以及允许取值范围的共享仓库。数据字典的维护独立于软件需求规格说明,并且在产品的开发和维护的任何阶段,各个风险承担者都可以访问数据字典。它定义了原数据元素、组成结构体的复杂数据元素、重复的数据项、一个数据项的枚举值以及可选的数据项。
1.2.4 E-R图
ER图(ERD)是为了把用户的数据要求清楚准确地描述起来而建立的一个概念性的数据模型。其中主要有以下几个要素:用矩形表示的实体型,矩形框内写明实体名;用椭圆形或圆角矩形表示的属性,用无向边将其与相应的实体连接起来,多值属性由双线连接,主属性名称下加下划线;用菱形表示的联系,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型。
1.2.5 状态转换图
通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为.此外状态转换图还指明了作为特定事件的结果系统将做那些动作(例如,处理数据).因此状态转换图提供了行为建模机制
在状态转换图中,每一个节点代表一个状态,其中双圈是终结状态。
1.3 结构化设计的流程
第一,对数据流图进行研究、分析及市查,这主要可以帮助我们从软件需求规格说明中掌握数据流加工过程。
第二,以数据流图为依据对数据处理的类型进行确定,需要注意,针对事物型以及变换型,设计人员要注意对其进行分别分析和处理。
第三,通过数据流图对系统初始结构图进行推导。
第四,采取启发式原则对系统初始结构图进行改进,直到结构图满足我们的要求为止。
第五,利用数据字典以及分析模型E-R图对数据进行设计,包括数据文件的设计和数据库的设计。
第六,以状态转换图、加工规格说明为依据,进行过程设计。
1.4 结构化设计的优缺点
优点:结构化方法是强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法。结构化方法的本质是功能分解,从代表目标系统整体功能的单个处理着手,自顶向下不断地把复杂的处理分解为子处理,这样一层一层地分解下去,直到仅剩下的若干个容易实现的子处理为止。当所分解的子处理十分简单时,就可写出各个最低层处理的处理描述。
缺点:首先,结构化方法是围绕实现处理功能的过程来构造系统的,然而,用户需求的变化大部分是针对功能的,因此,用结构化方法设计出的系统结构常常是不稳定的。其次,结构化方法定义了目标系统的边界,且开出发的系统结构依赖于对系统边界的定义,因此,很难把系统扩展到新的边界,系统较难修改和扩充。再者,结构化方法设计系统时,几乎每开发一个新的软件系统,都要针对具体系统作大量重复和繁琐的工作,思维成果的可重性差。
2. 面向对象程序设计
2.1 概念综述
面向对象技术自八十年代初问世以来,由于它的模块性、封装性、继承性、多态性和动态束定能满足软件工程要求的局部化、易维护、可重用、易扩充以及当今多媒体和分布式计算的诸多要求,一时成为计算机各领域争相采用的新技术焦点。所谓对象是指具有一定结构、属性和功能的实体,采用对象和对象类,以及对象之间的相互通信的消息,描述客观世界中的各种事物及其相互关系,建立面向对象和消息的具有层次结构的世界模型。面向对象的程序设计方法基于上述面向对象世界模型。
2.2 面向对象分析(OOA)
OOA强调直接针对问题域中客观存在的各项事物设立OOA模型中的对象。用对象的属性和方法分别描述事物的静态特征和行为。问题域有哪些值得考虑的事物,OOA模型中就有哪些对象。而且对象及其方法的命名都强调与客观事物一致。另外,OOA模型也保留了问题域中事物之间关系的原貌。这包括:把具有相同属性和相同方法的对象归结为类;用一般----特殊结构(又称分类结构)描述一般类与特殊类之间的关系(即继承关系);用整体一部分结构(又称组装结构)描述事物间的组成关系;用事例连接和消息连接表示事件之间的静态联系(一个对象的属性与另一个对象有关)和动态联系(一个对象的行为和另一个对象行为有关)。可以看到,无论是对问题域中的单个事物,还是对各个事物之间的关系,OOA模型都保留着它们的原貌,没有加以转换、扭曲,也没有打破原有的界限而重新组合。所以,OOA模型能够很好地映射问题域。OOA对问题域的观察、分析和认识是直接的,对问题域的描述也是很直接的。它所采用的概念及术语与问题域中的事物保持了最大程度的一致,不存在语言上的鸿沟。
2.3 面向对象设计(OOD)
OOA与OOD的职责划分是:OOA针对问题域运用OO方法,建立一个反映问题域的OOA模型,不考虑与系统的具体实现有关的因素(例如采用什么编程语言、图形用户界面、数据库等),从而使OOA模型独立于具体的实现。OOD则是针对系统的一个具体的实现运用OO方法。其中包括两方面的工作,一是把OOA模型直接搬到OOD(不经过转换,仅作某些必要的修改和调整),作为OOD的一个部分:另外使针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。这些部分与OOA采用相同的表示方法和模型结构。OOA与OOD采用一致的表示法是面向对象的分析与设计优于传统的软件工程方法的重要因素之一。这使得从OOA到OOD不存在转换,只有局部的修改或调整,并增加几个与实现有关的独立部分。因此,OOA与OOD之间不存在传统方法中分析与设计之间的鸿沟,二者能够紧密衔接,大大降低了OOA过渡到OOD的难度、工作量和出错率。
2.4 面向对象编程(OOP)
面向对象编程是面向对象方法从诞生、发展到走向成熟的第一片领地,也是使面向对象的软件开发最终落实的重要阶段。在OOA和OOD理论出现之前,程序员要写一个好的面向对象的程序,首先要学会运用OO方法来认识问题域,所以OOP被看作一门比较高深的技术。现在,在OOA->OOD->OOP这一软件工程的过程系列中,OOP的分工比较简单了:认识问题域以及设计系统成分的工作已经在OOA和OOD阶段完成,OOP工作就是用一种面向对象的编程语言把OOD模型中的各个成分书写出来。
2.5基于UML的软件分析和设计
系统(用户)需求。它是问题提出的过程,软件大体要实现什么功能,有什么参与者。而应用图所表达的正是参与者(Actor)与软件应用(Use Case ),应用和系统响应之间的关系。在了解系统需求的过程中,就可以给应用图添加上相应的Actor与Use Case。在了解系统需求的后期,则可以把不同Actor与Use Case间的关系用相应的连线连接和对连线的定义使之清晰。之后可对Use Case的系统响应进行分析,即把系统执行顺序画出来,这已经进入系统分析阶段。
系统分析。在这一阶段,需要把软件的功能细节化,同时考虑数据间的关系(层次),然后建立与之对应的对象,接着分析对象间的关系(即软件结构)并定义对象的属性和方法。常用的分析方法有流程图、泡泡图和由上到下分析法等,但每种方法只能反映系统的某一个方而,把它们综合起来,即是UML的分析方法。
代码编写。这一过程是把抽象的软件模型转变为具体的代码。使用基于UML的CASE工具建立了相应的模型,或者说建立起一个多视角的相关数据库系统(RDMS)之后,则可使用软件直接产生基于此模型的对应代码框架。至此一个具有清晰结构的软件系统就已经有了雏形,往后的阶段只需要把某一种具体代码往框架里填充。
代码的维护和扩展。面向对象的程序设计出来的方法,主要目的就是为了让程序更容易维护、扩展。为了改动和添加代码,一般情况下就得通读源代码和注释,然后才明白程序的结构和完成的功能,进而修改。但对于UML设计出来的软件,先看其模型中不同视角的图表就可以把软件结构清晰的表达出来了。同时在建立模型时所写的文档,也会加入源代码中。另外,有的CASE工具还提供COM接口,通过编程对建立的模型进行分析,输出相应的报表、文档。以上3点都说明了用UML建立模型更利于软件的维护和扩展。
2.6 优越性和局限性
优越性:采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。在软件开发时效率较高,能够根据设计的需要对现实世界的事物进行抽象、产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
局限性: 需要一定的软件支持环境;不太适宜大型的MIS开发,若缺乏整体系统设计划分,易造成系统结构不合理、各部分关系失调等问题;只能在现有业务基础上进行分类整理,不能从科学管理角度进行理顺和优化;初学者不易接受、难学。
3. 结构化和面向对象设计的对比
结构化方法首先关心的是功能,强调以模块(即过程)为中心,采用模块化、自顶向下、逐步求精设计过程,系统是实现模块功能的函数和过程的集合,结构清晰、可读性好,的确是提高软件开发质量的一种有效手段。每个模块有可能保持较强的独立性,但它往往与数据库结构相独立,功能模块与数据库逻辑模式间没有映射关系,程序与数据结构很难封装在一起。如果问题世界的功能比数据更复杂或者更重要,那么结构化方法仍应是首选的方法。
如果数据结构复杂,模块独立性很难保证。面向对象方法抽象的系统结构往往并不比结构化方法产生的系统结构简单,但它能映射到数据库结构中,很容易实现程序与数据结构的封装。结构化设计从系统的功能入手,按照工程标准和严格规范将系统分解为若干功能模块。然而,由于用户的需求和软、硬件技术的不断发展变化,作为系统基本成分的功能模块很容易受到影响,局部修改甚至会引起系统的根本性变化。开发过程前期入手快而后期频繁改动的现象比较常见。面向对象方法则从所处理的数据入手,以数据为中心来描述系统,数据相对于功能而言,具有更强的稳定性,这样设计出的系统模型往往能较好地映射问题域模型。对象、类、继承性、多态性、动态定连概念和设施的引入使用,显然令面向对象的设计方法具有一定的优势,能为生产可重用的软件构件和解决软件的复杂性问题提供一条有效的途径。
面向对象的设计过程就是指通过建立一些类以及它们之间的关系来解决实际问题,这就需要对问题域中的对象作整体分析,类及类间关系的设计要求较高,否则设计出的并不是真正意义上的面向对象的软件系统,而只是一些类的堆砌而已,不能体现出面向对象设计方法的优势之处。
面向对象方法的优点并不是减少开发时间,初次使用这种技术软件,可能比结构化方法开发时间更长,开发人员必须花很大精力去分析对象是什么,每个对象应该承担什么责任,所有这些对象怎样很好地合作以完成预定的目标。这样做换来的好处是,提高了目标系统的可重用性,减少了生命周期后续阶段的工作量和可能犯的错误,提高了软件的可维护性。
4. 总结
无论是以模块为核心的结构化还是以对象之间关系的面向对象软件工程设计思路,都是基于实践,总结出来的科学的程序设计方法。在现实的程序设计开发的过程中,开发者必须结合项目本身的特征,以及自己的实际开发经验,选择最适合的设计和开发方法。
5. 参考文献
[1] 刘薇.关于软件工程之中的结构化设计方法探究[A].2013
[2] 蔡伟淦.软件工程中的结构化设计方法[A].2011
[3] 霍迎旦.软件工程中结构化方法和面向对象方法之比较[A].2007
[4] 张京,李成大.结构化软件工程方法与面向对象软件工程方法的比较[A].2000
[5] 邸剑,李新叶,宋雨.面向对象软件工程分析方法[A].2002
[6] 张秋. 结构化程序设计及判别 [A].1997
[7]王德军,郝永芳.结构化程序设计方法与面向对象的程序设计方法的比较 [A]. 2003
[8]张耀民.软件工程中的结构化设计方法[A]. 2012
[7] http://blog.csdn.net/lxd8731247769/article/details/47101589
[8] http://blog.sina.com.cn/s/blog_71e00b8801010msv.html
[9] http://blog.csdn.net/zhoukun1008/article/details/40450627
---恢复内容结束---