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

         本文简单介绍了软件工程用到的两种设计方法:结构化方法与面向对象方法,并比较了二者的异同,分析了各自的特性,对二者在软件工程中的实际应用价值提出了个人的看法。

一、结构化方法

         20世纪60年代中期,随着大容量、高速度计算机的出现,计算机软件需求迅速增长,软件系统的规模与复杂度大大提高,若采用过去私人化、特定化的软件开发方法,则开发、维护过程中会产生一系列问题,开发者们迫切需要一种更高效的软件开发方法。在此背景下,结构化方法则应运而生,其主要思想是把一个复杂问题的求解过程分阶段进行,这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。在笔者看来,这和分而治之的算法思想是类似的。如果把软件当作一个整体看待,那么人类的大脑完全没有能力管理规模如此庞大的系统,但若是将其不断细分成互相关联极小的模块,每次只关注某一个模块,则是完全可行的。

         结构化方法主要由三个部分组成,按软件生命周期排列为:结构化分析(Structured analysis,简称SA),结构化设计(Structured design,简称SD),结构化编程(Structured programming,简称SP)。

1.1 结构化分析

         结构化分析的作用是将系统概念(或现实世界的情境)转化为计算机中的数据和控制术语,用图来表示转化结果,该结果是之后进行软件设计的重要依据。De Marco于1979年设计了一种结构化分析方法,它主要由系统关系图、数据流程图、程序规格、数据字典四部分组成。

1.1.1 系统关系图

 

         系统关系图(System context diagram,简称SCD)表示了系统和外界环境元素的交互关系,它是系统的最高层次的视图,因为在SCD中,整个系统是被看作单一的元素,通常放置在图的中心位置,图中描述了该系统与外界因子的输入、输出关系,而没有描述任何系统内部的细节。

         SCD有助于了解系统和其他相关系统或事件之间的关系,了解系统在软件工程中所处的环节,设计数据流程图时需要参考SCD提供的这些外界的交互信息。

1.1.2 数据流程图

 

         数据流程图(Data flow diagram,简称DFD)是信息系统中数据流的图像表示,它描述的是数据在不同程序之间的流动,而非在不同硬件之间的流动。

   DFD是一个有向图,弧线表示数据,节点(用圆圈或泡泡表示)表示转换数据的程序。程序还可以再细分为更细的数据流程图,描述程序中的子程序,一直到清楚说明及了解程序机能为止。对于不需要在细分的程序,一般用程序规格来对其说明,程序规格可以是流程图、伪代码或结构化英文。

   DFD能将系统的一些重要信息可视化,这些信息包括:系统的执行过程,系统的执行效果,系统的用法等。用户可以通过DFD了解到,向系统输入的信息会经过怎样的处理,最终对整个系统产生何种影响。

1.1.3 数据字典

         数据字典(Data dictionary)是一个定义数据库基本结构的文件。数据字典含有数据库中所有文件的列表,每个文件的记录数,以及每个数据区的名称与类型。数据字典不存储数据库的实际数据,只存储管理这些数据所需要的信息。要想从数据库中获取数据,数据字典是必不可少的。数据字典可以使软件的数据库保持高度一致性,方便开发人员对数据库的操作。

1.2 结构化设计

         结构化设计(SD)紧随结构化分析(SA)之后,意在利用SA得到的结果确定软件的结构。SD的重要目的是让程序的结构尽可能反映要解决的问题的结构,而其主要任务是把SA生成的DFD转化为系统结构图。

 

         结构图(Structure chart,简称SC)描述了将系统分解为最小可管理层次的过程。该图表反应了结构化方法的重要思想,即自顶向下,逐步求精。即采用上图所示树状结构描述各模块之间的细分关系。在程序的实现阶段,SC是重要的参考依据,因此其设计的好坏会直接影响最终软件成品质量。评价一个SC好坏的主要标准在于各模块的独立性,模块之间的联系越弱越好,而模块内部各成分的联系越紧密越好,即高内聚低耦合。

         结构化设计也用到了抽象的思想,其主要涉及三类抽象,即过程抽象、数据抽象和控制抽象。以过程抽象为例,任何一个完成明确功能的操作都可以作为一个实体看待,而这一操作实际上可能由多个子操作组成,在一定情况下忽视这些子操作,只关注操作整体,可以提高软件开发效率。其他同理,一个具有确定意义的数据实体可能由多个更低级的数据组成,程序控制机制也可以在不同层次上看待。

1.3 结构化编程

         作为结构化方法在软件生命周期排列上的最后成分,结构化编程是根据结构化设计的结果(如SC图),进行实际的代码编写过程。结构化编程拥有三种基本控制结构:顺序结构、选择结构、循环结构,其主张利用这三种结构嵌套连结成具有复杂层次的结构化程序,并限制Goto语句的使用,意在使得程序易于理解、易于排错、易于维护、容易进行正确性证明。在结构上的效果为:

①以控制结构为单位,只有一个入口,一个出口,所以能独立地理解这一部分。

②能够以控制结构为单位,从上到下顺序地阅读程序文本。

③由于程序的静态描述与执行时的控制流程容易对应,所以能够方便正确地理解程序的动作。

二、面向对象方法

         面向对象的程序设计方法是在吸收、借鉴了软件工程领域几十年来的新概念和新方法的基础上发展起来的一种相当有发展前途的程序设计方法,堪称当代“结构化方法”。它集数据抽象机制、模块化程序设计、信息隐藏、知识表示和继承性为一体,创立了一种新的程序设计模式。

   面向对象方法主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能够映射问题域,也就是说,系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。

   类似的,面向对象方法同样拥有三个组成部分:面向对象分析(Object-oriented analysis),面向对象设计(Object-oriented design)与面向对象编程(Object-oriented programming)。

2.1 面向对象分析

         OOA所做的主要工作是理解问题和需求构模,将现实世界中的问题映射到问题域。在该阶段,要明确用户提出了哪些功能要求,为完成这些要求,系统应有哪些构件,采用什么样的结构,并写出详细的需求规约。从这一点来看,OOA与SA的功能是非常相似的。不过,OOA的分析过程采用的是一套完全不同的体系。OOA引入了很多面向对象的概念和原则,如抽象、属性、继承、封装等,OOA需要利用这些概念和原则来分析、认识和理解客观世界,将客观世界中的实体抽象为问题域中的对象,即问题对象,分析客观世界中问题的结构,明确为完成系统功能,对象间应具有的联系和相互作用。

         OOA的分析过程可分为以下五个步骤:

   第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,即从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

   第二步,确定结构。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。

   第三步,确定主题。主题是指事物的总体概貌和总体分析模型。

   第四步,确定属性。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。

   第五步,确定方法。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。

2.2 面向对象设计

         OOD与SD类似,同样是确定实现用户需求的方法,即怎样做才能满足用户需求,并构造出系统的实现蓝图,使其能被OOP所接受。不同的是OOD在构造系统蓝图时需要引入面向对象的概念与原则,用以指导设计工作,这点和OOA是一样的。OOD首先从OOA的结果开始,并将其从问题域映射到实现域。为满足实现的需要,还要增加一些类、结构及属性和服务,并对原有类及属性进行调整。此外,还要完成应用控制、人机交互界面的设计等。

   总之,OOD主要是对OOA结果进行改进和精化,具体来说,有以下几个方面:
①属性:有些属性在分析阶段有助于问题的理解。而到了设计阶段则可以由其他属性导出或根本没必要保留。因此。应将它们去掉。相反地。为了实现服务算法还需要增加相应的一些属性。
②服务:OOA只给出了服务的接口,其具体实现算法要在OOD阶段完成。
③类及对象:在OOA阶段有助于问题理解的一些类在OOD阶段成为冗余,需要删除,而为了优化调整继承关系还要增加一些类。所有的类都确定以后还要明确哪些类的对象会引发哪些类创建新对象。
④结构:对类间结构进行优化调整。
⑤对象行为:明确对象间消息传递的实现算法,依据动态模型确定对象间消息发送的先后顺序,并设计相应算法,协调对象的行为。

2.3 面向对象编程

         同样的,OOP的概念与SP也十分类似,都是根据设计得到的结果进行实际代码的编写。不过由于OOD和SD输出的结果遵循了不同的原则,OOP与SP所写出的代码也是遵循着不同的原则。OOP遵循的即面向对象的编程原则。

   在OOP的编程过程中,数据及对数据的操作行为被看作一个相互依存、不可分割的整体,即对象。对象通过公共接口进行通信,程序的执行即表现为一组对象之间的通信。因此,OOP的编程过程如果搭积木一般,也就是根据之前的设计,用代码实现相应的对象,并实现对象之间的通信。这样的编程方法达到了软件工程的三个主要目标:重用性、灵活性和扩展性。

   OOP 主要有以下的概念和组件:

组件 - 数据和功能一起在运行着的计算机程序中形成的单元。

抽象性 - 忽略当前信息的某些方面,只关注主要方面。

封装 - 保护组件内部状态,确保其不会发生预料外的更改。

多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果依据实际调用的类型。

继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。

三、两类方法比较

3.1 概念比较

3.1.1 模块与对象

         结构化方法中的模块是一个数据处理单位,它能接受一定的输入,并产生相应的输出,是一个纯功能化的实体。而面向对象方法中的对象,它同样可以接受输入并产生输出,但它作为一个数据与操作的整体,也可以存储数据。因此,对象是对数据和功能的抽象和统一,其概念包括了模块的概念。利用对象,可以实现的程序效果比利用模块要丰富很多,因此,对象的设计比模块更高明一分。

3.1.2 过程调用和消息传递

         在结构化方法中,过程是一个独立实体,显式地为其使用者所见;过程调用所涉及到的过程及函数都属于一个程序实体。在面向对象程序设计中,方法是隶属于对象的,是对象的功能体现,是不能独立存在的实体;不同对象间的消息传递是不同程序实体之间的交互协作。可以这样说,面向对象设计中的程序实体是松耦合,而结构化的实体是紧耦合。在结构化设计中,同一实参的调用,其结构是相同的。但在面向对象中的消息传递不同,同一消息的传递可能产生不同的结果,这正是面向对象方法多态性的体现。

3.1.3 静态连接与动态连接

         在面向对象方法中,消息的激活机制把不同对象动态地联系在了一起,使整个机体运转了起来。而结构化方法中的各模块只能按照最初编写好的代码按序执行功能。

3.2 程序设计思想比较

3.2.1 结构化方法

         结构化方法的程序设计偏重于过程,在其基本指导思想中,一个完整的程序是由算法和数据结构两部分组成的,开发人员的工作就是实现这两部分的内容,并用合适的方式使其二者建立连接,实现期望的程序功能。

         在具体设计流程上,结构化方法遵循了自底向上的设计思想,即先设计底层模块,确定模块内部算法,设计模块内部程序,并进行单元测试。模块完成之后,再进行模块之间的组装,进行模块的集成测试。随后进行确认测试和系统测试,完成设计和调试任务。

3.2.1 面向对象方法

         对于面向对象方法的程序设计,其唯一组成是对象,对象之间的关系构成了程序的基本框架。由于对象是一个数据、功能统一的实体,故开发人员需要实现对象内部的数据结构与算法,不过显然实现难度比一个完整的程序要小很多。之后的关注点就是协调好对象之间的信息传递,使其能协同工作,发挥预期效果。

         与结构化方法相反的是,面向对象方法采用自顶向下的设计思想,先设计父类,再设计子类,并继承父类的属性与方法,而对象则是在最后程序运行过程中动态生成。

3.3 软件开发过程比较

3.3.1 结构化方法

         结构化方法采用分层次的方式展现系统模型,在最外层只有输入与输出信息,因此开发人员在查看系统详细结构时,需要逐层深入才能获得内部信息,而一个大型软件工程的层次繁多,每一层的分支众多,使得开发人员对整体结构的把握较为困难,使用也不方便。这一点随着软件规模的扩大,会体现得尤为突出。

         此外,结构化方法还有一个无法克服的弊端,即数据与操作分离的设计。数据没有和相应的操作进行绑定,因此一个操作可能对不相关的数据进行,使得数据的管理容易出现意料外的情况,数据的安全性得不到保障。而且一旦数据发生了格式或结构上的改变,相应的操作也需要进行改变。例如,软件设计之初,某一类数据只存储了少量的信息,处理该数据的函数也只能接受少量信息的输入,若随着软件的升级,该数据需要存储更多信息,那么原有的函数就无法使用,必须全面修改来适应新的信息输入。这使得软件的更新效率非常低下。

3.3.2 面向对象方法

         用面向对象的思想去开发软件,有助于开发人员对软件本身获得一个更清晰的认识。因为它让软件中的各个成分和现实世界的事物联系起来。对象的概念弥漫了整个开发过程,对象和它们之间的关系成为分析、设计和编码等各个阶段的共同表达媒介,每一个阶段都可以相互反馈。传统软件工程的重心从编码向分析转移,开发人员可以把重点放在对象之间的关系上,而非具体的代码上。

         面向对象的方法从问题的模型开始。然后就是识别对象、不断细化的过程。它从本质上就是迭代的和渐增的。在这里,快速原型和反馈环路是必须的标准结构。开发过程就是一次次的迭代反复过程,随着迭代的进行,系统的功能不断完善。在软件更新的过程中,开发人员的主要工作是设计新的对象,或者在管理相应功能的对象上进行修改,而不需要对程序整体的数据结构或操作进行修改,很少出现牵一发而动全身的情况。此外,类的继承等机制也提高了代码的重用性。这些特性大大方便了软件的升级与维护工作。

3.4 总结

         两种方法都是人们为了应对日益增长的软件需求而提出的,它们在特定的时间范围内都发挥了重要的作用,解决了当时软件开发过程中遇到的种种问题。

         在20世纪六七十年代,结构化方法在一定程度上解决了软件的可靠性、可修改性和可理解性等问题,但其可重用性依然无法满足日后的软件需求,分层次的设计对于大规模软件结构的理解仍然不够方便,数据与操作分离的设计也会引发种种安全性和维护方面的问题。

         面向对象的程序设计方法是在吸收、借鉴了软件工程领域几十年来的新概念和新方法的基础上发展起来的一种新型程序设计方法。它更强调运用人类日常的逻辑思维中经常采用的思想方法与原则,把对象的观念贯彻到整个软件中,可重用性与可扩展性强,方便了设计、开发、升级等过程。因此对于当今的大型软件工程而言,面向对象方法更为高效。

         不过结构化方法的相关思想仍然十分宝贵,经过几十年的发展与积累,已经有了一整套成熟的工具和方法学,在发展日后的软件方法时,绝不能忘了它。

四、参考文献

(1)结构化方法与面向对象方法思想辨析.许秀林.南通职业大学学报.2004.18(4)

(2)对比分析面向对象方法与结构化方法.郭溪川.农业网络信息.2006(11)

(3)面向对象方法与结构化方法的比较.雷西玲.谢天保.何文娟.现代电子技术.2002(1)

(4)Wikipedia.Structured analysis(2016.12.13)

(5)Wikipedia.Object-oriented analysis and design (2016.12.13)

转载于:https://www.cnblogs.com/buaazc/p/6178850.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值