结构化方法与面向对象方法之应用比较
0.导语
上个世纪60年代中期爆发了众所周知的软件危机。为了克服这一危机,在1968、1969年连续召开的两次著名的NATO会议上提出了软件工程这一术语,在软件工程的发展中,也出现了多种软件开发方法,结构化方法与面向对象方法就是其中被广泛使用的两种。
1.结构化方法
结构化方法(SD方法)是一种传统的软件开发方法,它是由结构化分析(SA)、结构化设计(SD)和结构化程序设计(SP)三部分有机组合而成的。它的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。其基本要点是:自顶向下、逐步求精、模块化设计、结构化编码。结构化方法的三个部分中最重要的就是结构化分析与结构化设计,下面即介绍这两部分。
1.1 结构化分析SA
结构化分析方法给出一组帮助系统分析人员产生功能规约的原理与技术。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。
结构化分析的步骤如下:①分析当前的情况,做出反映当前物理模型的DFD;②推导出等价的逻辑模型的DFD;③设计新的逻辑系统,生成数据字典和基元描述;④建立人机接口,提出可供选择的目标系统物理模型的DFD;⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;⑥选择一种方案;⑦建立完整的需求规约。
数据流图DFD:数据流图是SA方法中用于表示逻辑系统模型的一种工具,它从数据传递和加工的角度,以图形的方式来刻画数据流从输入到输出的变换过程。
数据字典:数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素定义的集合。数据字典是结构方法的核心。数据字典有以下几个条目:数据项条目、数据流条目、文件条目和加工条目。
1.2 结构化设计SD
基本思想是:根据SA方法中的数据流图建立一个良好的模块结构图(例如SC图或软件层次方框图);运用模块化的设计原理控制系统的复杂性,即设计出模块相对独立的,模块结构图深度,宽度都适当的,单入口单出口的,单一功能的模块结构的软件结构图或软件层次方框图。此方法提供了描述软件系统的工具,提出了评价模块结构图质量的标准,即模块之间的联系越松散越好,而模块内各成分之间的联系越紧凑越好。
结构化设计的目的:使程序的结构尽可能反映要解决的问题的结构。
结构化设计的任务:把需求分析得到的数据流图DFD等变换为系统结构图(SC)。
2.面向对象方法
面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。
封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
继承性:继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继职其它类的全部描述,同时可修改和扩充。继职具有传达室递性。继职分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。
多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。
3.比较
3.1 基本思想
结构化方法的基本思想主要体现在三个方面。一、自顶向下,逐步求精:把程序看成是一个逐步演化的过程。把一个系统与程序看成是一层一层的。例如:户籍管理系统可以划分为:户籍迁入迁出,人员迁入迁出,户籍注销,人员注销等几个子系统,而每个子系统又划分为接收用户信息,实施处理,提供返回信息等等部分。二、模块化:即将几个系统分成几个模块,每个模块实现特定的功能,最终整个系统由这些模块组成。模块跟模块之间通过接口传递信息,模块最重要的特点就是独立性,模块之间还有上下层的关系,上层模块调用下层模块来实现一些功能。三、语句结构化:顺序结构、分支结构、循环结构,都是常用的语句结构。
面向对象方法的基本思想主要有:一、客观世界中的事物都是对象,对象之间存在一定的关系,并且复杂对象由简单对象构成。二、具有相同属性和操作的对象属于一个类,对象是类的一个实例。三、类之间可以有层次结构,即类可以有子类,其中,子类继承父类的全部属性和操作,而且子类有自己的属性和操作。四、类具有封装性,把类内部的属性和一些操作隐藏起来,只有公共的操作对外是可见的,对象只可通过消息来请求其他对象的操作或自己的操作。五、强调充分运用人在日常逻辑思维中经常采用的思想方法与原则。例如:抽象,分类,继承,聚合,封装,关联等。
3.2 优缺点
结构化方法在程序设计时,先考虑问题大的方面,在确定了主要方向后,再由表及里深入到问题具体的细节,由易到难,逐层解决问题,使得整个程序设计过程由模糊到清晰,由概括到具体。结构化方法强调功能抽象和模块化,采取了分块处理问题的方法,可以把一个比较复杂的问题分解为若干个容易处理解决的部分,从而降低了问题处理的难度。面向对象方法与人类习惯的思维方法一致,使得使用者和维护人员都容易理解,在用户使用时不会理解困难,在软件维护中可维护性也较高,并且易于测试和调试。它的稳定性好,对软件的局部进行修改时,不会引起整体的变化,而且对局部修改容易实现。它的可重用性好,并且由于它是把大的问题分解成相互独立的小问题处理,降低了开发的技术难度,开发工作的管理也变的容易了,开发大型软件变的容易,成本也降低了。
结构化方法在得到问题本质性的描述之前,不断分解出的结论和需要处理的信息越来越多、越来越复杂,它要求系统分析员具有一种“俯视全局”的能力,能够透过问题的表象直接把握到问题本质。当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到最简洁、高效率的逻辑模型。结构化方法对复杂问题的帮助有限,但它有助于使用面向分析方法的系统分析员确认系统最初的高阶模型。面向对象方法总是试图抽象出更公用的类,因此对系统分析员抽象事物和把握最初分析方向的要求很高,常常难以控制抽象对象的层次、粒度,甚至抽象出与问题本质面目全非的对象模型,掌握难度高于结构化分析方法。面向对象方法通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,但发生错误时,定位故障的代价大,尤其是继承的深度很大时。对于需求变化频繁的系统,得到一个高度可复用的面向对象软件系统设计是很困难的事情。