结构化方法与面向对象方法之比较

 结构化方法和面向对象方法是软件工程中的两种主要开发方法。软件开发方法是一种软件策略,要求我们在规定的要求内高质量地开发出目标软件。在计算机软件领域,很多新的方法和技术都起源于程序设计语言。之前笔者对这两种方法的认识也主要在程序设计方面,具体例如C语言是一种面向过程的结构化语言,而C++,Java等则是面向对象的语言。对于这两种方法,开发时我们分别需要做些什么,深入地了解他们,以及二者之间的区别和联系,则是笔者在本次博文中讨论的问题。

1.什么是结构化方法

1.1概述

软件开发时我们需要遵循的一个共同的流程是先分析再设计,因此就结构化方法,我们有结构化分析(SA)和结构化设计(SD)。结构化方法,是从层次的角度,自顶向下地分析和设计系统。在分析时,我们的基本思想是把一个大问题分解成若干个小问题,每个小问题再分解成若干个更小的问题。即我们通过逐层分解,使得每个最底层的问题变得足够简单,以此解决复杂的问题。

结构化方法遵循的原则有抽象原则,分解原则,和模块化原则。分解原则和模块化原则自然不用说,我们把系统的功能分解,分成一个个模块然后更简单地实现,抽象原则在分析设计阶段也很重要。抽象的过程使得我们把实际问题数学化,计算机化,从而设计出目标产品。

1.2结构化分析与设计

结构化分析有一系列的过程,包括数据分析,功能分析和行为分析。数据建模我们常用到数据字典和实体关系图,数据字典如同生活中的字典一般详细地记录数据的每一项信息,下图为一个数据字典:

 

 

图1- 1一个数据字典实例

 

此外,在分析中通过构建系统E-R图,建立了带属性的各个数据之间的联系,联系的名称是什么,联系本身有什么属性也为我们清晰地表现出来。

转向功能分析,我们通常采用的一种方式是绘制数据流图 (DFD)。绘制DFD时也采取了分层的思想,首先绘制的是顶层的DFD图,然后进行局部功能的扩展,最终目的是将每个功能都清晰地表现出来。

 

 

图1- 2一个数据流图实例

转到结构化设计,这里需要我们在前面分析的基础上能够建立若干的模块,并实现功能的独立性。我们基于前面的数据流图等信息实现具体的函数结构,这才是结构化方法的精髓。

总的来说,结构化方法注重分解问题为几个子问题,在分析设计中,我们着重表现了这一方面。通过图例我们以一种放大镜的形式把一个大问题局部化,不断分解细化解决。与“盲人摸象”不同的是我们是一个开发者,对于这个“象”我们已经有了整体的感知然后再去接近它的每一个部位。也就是说,对于系统,我们自顶向下,由浅及深,一步步深入。

2.什么是面向对象方法

2.1  OO概述

面向对象方法的核心是面向对象——Object Oriented。在上个学期的面向对象建模方法课中,我们初步对这种思想进行了认识并实现了一个电梯系统的开发。现在我们需要面向对象方法运用到软件工程的设计中。

根据尤登的论述,面向对象根据三个构造法则而建立起来:1.区分对象及其属性;2.区分整体对象及其组成部分;3.形成并区分不同对象的类。在我们的分析设计中,对象和类是最基本的概念,对象是动态的概念而类是静态的概念。面向对象方法更强调地运用人们在日常的逻辑思维中经常采用的思想方法和原则,如:抽象、分类、继承、聚合、封装等使软件开发者更有效地思考问题。

2.2 从OOA入手看

面向对象方法涉及的分析(OOA)和设计(OOD)具有一致的概念,原则和表示方法。相比于OOA,OOD则由于进入实际设计层面将问题考虑得更加深入。同样标识对象,OOA只是对客观世界进行了抽象,而OOD则要考虑到这些做法是否有助于系统功能的实现和非功能性的满足。OOD对OOA中原有的类进行了精华和改进,并完成应用控制、人机交互界面的设计。

那么回到OOA,一系列基础的奠基工作是不可忽视的。在这个阶段,我们要分析清楚系统提供的功能,系统对象的组成,对象之间的联系以及每个对象拥有的属性和服务。在描述系统功能时,我们建立简单的角色与用例之间的用例图(Use Case),展现直接的关系。

 

 

图2- 1系统管理员的用例图

 

接下来,我们根据需求建立系统的静态模型来构造系统的结构,静态模型包括类图,对象图和包图。类图是我们经常采用的一种UML语言,类图描述了系统中的类及其相互之间的关系,其本质反映了系统中对象的类型以及对象之间的各种静态关系,如关联、依赖、聚合等等。对象图是类图的实例,几乎使用与类图完全相同的标识,它们的不同点在于对象图显示类的多个对象实例而不是实际的类,包图则由包或类组成,表示包与包之之间的关系。下图便是一个经典的类图案例:

 

 

图2- 2类图实例

 

在OOD中,则解决了对象及其相互关系。OOD对OOA所得出的

 

 

3.区别与联系

3.1联系

前面我们分别对结构化方法和面向对象方法进行了纵向的深入认识,现在我们横向了解二者之间的区别和联系。在研究这一方面,我们不能局限于二者中的实现细节,而要从一个开发方法的角度来进行综合归纳。作为软件工程中的开发方法,二者都需要遵守软件工程中的基本原则——“形式化原则”,对问题世界的抽象结论应该以形式化语言(图形语言、伪代码语言)表述出来。结合我们学到的各种工具和技巧,结构化方法可以用数据流图、系统结构图、数据词典、实体关系图来进行系统逻辑模型的描述;面向对象方法可以使用类图、动态模型图、功能模型图等。其次,无论是结构化还是面向对象的方法,都需要遵循一定的开发过程,先分析再设计,不管是SA到SD还是OOA到OOD,这都是必不可少的。

另外,软件工程中所要求的的良好的程序设计原则,如抽象性、封装性、模块化、层次性、类型化和永久性等都是结构化方法与面向对象方法所共同具有的,而不是某种方法所特有。

3.2区别

但是,二者从一开始分析问题的不同方法和遵循的不同思想就决定了二者之间有较大的差异。

3.2.1从具体设计看

结构化方法首先关心的是功能,强调以模块为中心,采用模块化,自顶向下,逐步求精设计过程,系统是实现模块功能函数和过程的集合,结构清晰且可读性好。每个模块可能保持较高的独立性。面向对象方法的处理问题手段则是从所处理的数据入手,以数据为中心描述系统,通过建立一些类以及它们之间的关系解决实际问题,这就需要对问题域中的对象作整体分析。类和类间的关系的设计要求比较高,而不仅仅是一堆类的堆砌。通过这种方法将面向对象的优点表现出来:提高目标系统的可重用性,减少了生命周期后续阶段工作。相比较结构化设计方法,比如后期系统的某个功能涉及到微小的改变,那么工作量就可能会非常大,因为可能与该功能相连的多个模块函数都需要作大的修改。

不仅如此,由于我们系统中一般由数据库的存在,结构化方法导致了设计的模块往往与数据库结构相独立,功能模块与数据库逻辑模式间没有映射关系,程序与数据结构很难封装在一起。面向对象的系统结构则可以映射到

3.2.2从系统视图看

面向对象与结构化设计的不同,导致他们从整体看系统的形式也就不同了。对于面向对象则是这样一种视图:

 

 

图3- 1系统视图

即结构化设计时由于直接将功能分解完成的便是用户功能的要求,从某种意义上来说比较直接,且易出效果。面向对象方法虽然更接近事物的本质,但是设计者的系统视图和用户的系统视图有很大的差距。

在初次使用面向对象方法时,可能耗费的时间比结构化方法更长,因为开发人员必须花很大精力去分析对象是什么,每个对象应该承担什么责任,所有这些对象怎样很好地合作以完成目标。当然,正是由于这些工作,换取了开发者对系统内部每个对象的更深入的认识,此时数据以一种鲜活的方式展现在了开发人员的面前。

3.2.3从问题角度看

从上面的内容我们已经初步看到结构化方法和面向对象方法的种种区别和不同点,从整个我们所要解决问题的角度考虑,我们又可以得到新的认识。对于结构化方法,考虑系统的问题时我们没有以问题中的事物为基本单位,而是打破各个事物之间的界限,以数据流的方式进行分析,这种分析方式是全局式的分析。当系统变得复杂时,问题会变得更加困难。与之相比较,面向对象问题具体化到每个数据实体。

当然,面向对象方法也有限制于自身的问题。当我们问题客观边界模糊而难以确定时,面向对象方法很难保证软件的有效性。由于我们的抽象过程直接抽象为对象,包括一些对问题的描述,此时问题与对象一致性的问题必须能够很好地处理。不同的系统描述者在观察描述同一个问题,不能表述对该问题现象的不同认知,而结构化可以通过对一系列模块的构建展现这个方面。从这个角度看,面向对象必须借助底层结构的处理才能改进这个问题。

4.综述

笔者在本次博文中主要介绍了结构化方法和面向对象方法,作为两种在软件工程中广泛运用的方法,我们有必要学习他们的特点并能够认识到不同,在实际处理问题时,不能照搬这两种技术方法的理论。而应该根据实际问题,问题的各个方面的综合考虑,来确定我们选取何种方式进行软件工程的开发设计。我们更需要有时候将这两种方法整合起来,取其精华,不断发展进步。未来,于软件工程这门学科,还会有更加科学更加高效的开发手段和技术。

参考文献

[1].软件开发方法——结构化方法与面向对象方法比较 汪寒昊,谢加胜,邢跃 绵阳师范学院数学与计算机科学学院,2011

[2].软件工程中结构化方法与面向对象方法之比较  霍迎旦 江苏电大武进学院,2007

[3].结构化方法与面向对象方法的比较分析  张莉,裘国勇.陕西师范大学计算机学院,2001

[4].结构化开发方法和面向对象开发方法的研究 黄锡伟,胡建彰 南京邮电学院无线电工程系,1996

posted on 2016-12-22 09:43  Li_YH  阅读(432)  评论(0编辑  收藏  举报