从C语言到Java,我们多多少少可以感觉到两种语言在设计上有所不同,其实,这两种程序设计语言对应的是两种不同的软件开发方法。那么,什么是软件开发方法?软件开发方法指:在项目投资规模和时间限制内,设计、实现符合用户需求的高质量软件,根据软件开发的特点,提出的多种软件开发策略。20世纪60年代的“软件危机”席卷了全球的软件业,其表现为费用超支、进度失控和软件质量难以有效保证,人们开始意识到软件的开发需要有一套科学、先进的工程技术作为理论指导。于是为了提高软件质量,软件开发方法不断推陈出新,产生了许多众所周知的开发方法,如生命周期法(即结构化方法)、原型法、面向数据结构的Jackson方法、基于模型的VDM(维也纳开发)方法、面向对象方法等。其中,结构化方法与面向对象方法是比较具有代表性的两种方法,结构化方法经过30多年的研究以及应用,最为成熟且影响最大,直到现在仍有许多系统是用它开发的.而面向对象方法是在结构化方法、信息建模方法等基础上发展起来的。
结构化方法(Structured Methodology)是计算学科的一种典型的系统开发方法。它采用了系统科学的思想方法,从层次的角度,自顶向下地分析和设计系统。结构化方法包括结构化分析(Structured Analysis,简称SA)、结构化设计(Structured Design,简称SD)和结构化程序设计(Structured Program Design,简称SP)三部分内容。其中,SA和SD主要属于学科抽象的内容,SP则主要属于学科设计方面的内容。面向对象(Object—oriented,简称OO)方法是以面向对象思想为指导进行系统开发的一类方法的总称。这类方法以对象为中心,以类和继承为构造机制来抽象现实世界,并构建相应的软件系统[1]。下文将进行结构化方法与面向对象方法的应用比较。
从起源上看
结构化方法的起源:1966年,C-BOhm和G-Jacopini提出了关于“程序结构”的理论,并给出了任何程序的逻辑结构都可以用顺序结构、选择结构和循环结构来表示的证明。在程序结构理论的基础上,1968年,戴克斯特拉提出了“GOTO语句是有害的”的问题,并引起普遍重视,SP逐渐形成,并成为计算机软件领域的重要方法,对计算机软件的发展具有重要的意义。伴随着SP的形成,相继出现了Modula-2、C以及Ada等结构化程序设计语言。
面向对象方法的起源:与结构化方法一样,面向对象方法也起源于面向对象程序语言(Object Oriented Program Language,简称OOPL)。面向对象程序语言始于20世纪60年代后期,第一个OOPL是挪威计算中心的Kristen-Nygaard和Ole-JohanDahl于1967年研制的Simula语言,该语言引入了许多面向对象的概念,如类和继承性等。受Simula语言的影响,1972年,Alan Kay在Xerox公司研制成功了Smalltalk语言,并对面向对象的一些概念作了更精确的定义。1980年,Xerox公司推出的Smalltalk-80语言标志着00PL进入实用化阶段。20世纪80年代,OOPL得到了极大地发展,相继出现了一大批实用的面向对象语言。20世纪80年代中期,随着OOPL推广使用,面向对象技术很快被应用到系统分析和系统设计中。20世纪90年代,面向对象分析(Object-Oriented Analysis,简称OOA)和面向对象设计(Object—Oriented Design,简称OOD)开始成熟,一些实用的面向对象开发方法和技术相继出现。如G.Booch提出的面向对象开发方法,P.Coad和E.Yourdon提出的OOA和OOD等等。这些方法的提出,标志着面向对象方法逐步发展成为完整的系统化的技术体系。
从基本思想上看
结构化方法的基本思想就是将待解决的问题看作一个系统,从而用系统科学的思想方法来分析和解决问题。结构化方法遵循以下基本原则:(1)抽象原则,(2)分解原则,(3)模块化原则。
面向对象是面对问题的,本身就是以人的角度来看问题,如同《大英百科全书》描述了“分类学理论”中有关人类认识现实世界普遍采用的3个构造法则:(1)区分对象及其属性;(2)区分整体对象及其组成部分;(3)形成并区分不同对象的类。按照P-Coad和EYourdon的论述,面向对象思想正是根据以上3个常用的构造法而建立起来的。在实际应用中,它采用对象及其属性,整体和部分,类、成员和它们之间的区别等3个法则来对系统进行分析和设计,遵循了分类学理论的基本原理,符合认识来源于实践,又服务于实践的科学思维方式。在OO方法中,对象和类是其最基本的概念。其中,对象是系统运行时的基本单位,是类的具体实例,是一个动态的概念;而类是对具有相同属性和操作(或称方法、服务)的对象进行的抽象描述,是对象的生成模板,是一个静态的概念。类可以形式化定义为:
Class=<ID,INH,ATT,OPE,ITF>
其中:
ID——类名:
INH——类的继承性集;
ATT——属性集;
OPE——操作集;
ITF——接口消息集。
从核心问题上看
模型问题是结构化方法的核心问题。建立模型(简称建模)是为了更好地理解要模拟的现实世界。建模通常是从系统的需求分析开始,在结构化方法中,就是使用SA方法构建系统的环境模型;然后使用SD方法,确定系统的行为和功能模型;最后用SP方法进行系统的设计。SD的主要任务就是要在系统环境模型的基础上建立系统的行为和功能模型,完成系统内部行为的描述。实现系统行为和功能模型的主要工具有:数据字典、数据流图、状态变迁图和实体一联系模型等。
面向对象方法与结构化方法一样,其核心问题也是模型问题。面向对象模型主要由OOA模型、OOD模型组成。其中,OOA主要属于学科抽象方面的内容,OOD主要属于学科设计方面的内容。OOA关心的是构建现实世界的模型问题。如何解决现实世界的建模问题呢?根据系统科学的思想,首先需要对复杂的系统进行分解,最常用的分解方法就是分层。OOA与OOD不存在转换的问题。OOD根据设计的需要,仅对OOA在问题域方面建立的5个抽象层次进行必要的增补和调整,同时,OOD还必须对人机交互、任务管理和数据管理3个部分的内容进行抽象,最后建立完整的OOD模型。使用OOPL来实现OOA和OOD模型相对来说比较容易,因为OOPL的构造与OOA和OOD模型的构造是相似的,OOPL支持对象、运行多态性和继承等概念。使用非OO语言则需要特别注意和规定保留程序的OO结构。OO概念可以映射到非OO语言结构中,这只是一个表达方式的问题,不是语言能力的问题,因为编程语言最终要转换为机器语言,对OO模型而言,使用OOPL效果更好一些[2]。
除了上述几个重要的不同之外,结构化方法和面向对象方法在其他方面仍有不同之处。在编程语言方面,面向对象方法主要采用的是C++、 VB、 JAVA 等,而结构化方法主要采用的是C、 BASIC、 FORTRAN 等;在逻辑工具方面,面向对象方法主要采用的是对象模型图、 数据字典动态模型图、 功能模型图,而结构化方法主要采用的是数据流图、 系统结构图、 数据字典状态转移图、 实体关系图。在处理问题方面,面向对象方法面向的是问题,而过程化方法则是面向过程的。在层次结构的逻辑关系方面,面向对象的方法使用类的层次结构来体现类之间的继承和发展,而结构化方法则是用模块的层次结构概括模块和模块之间的关系和功能;从控制程序方式,面向对象方法是通过“事件驱动”来激活和运行程序,而结构化方法则是通过设计调用或者返回程序来实现的。在可扩展性方面两种软件开发方法也存在一定的差异,面向对象方法相比于结构化方法可扩展性更好,只需要通过修改或者增加操作,而基本对象结构不变。相比之下,结构化方法可扩展性显得更弱一点,功能变化会危及整个系统。同理,在重用性方面,面向对象方法也显得更有优势。在分析、设计和编码的转换方式上,面向对象是个平滑过程,可以实现无缝连接,而结构化设计则是需要按照规则转换,有缝连接。尽管如此看来,面向对象方法似乎显得比结构化方法更好一点,但是,出来混的总是要还的,面向对象方法相比于结构化方法之所有有如此多的有点正是因为其牺牲了运行效率换来的,所以在运行效率方面,结构化方法比面向对象方法略胜一筹[3]。
尽管二者之间有很多差异,但毕竟面向对象方法是在结构化方法基础上建立起来的,所以二者之间还是存在一定的联系。主要体现在以下几方面:首先是在预定目标和组成上的一致。面向对象方法与结构化方法都是把客观世界中要解决的问题转向计算机上的实现作为预定目标[4]。从抽象的意义上讲,面向对象方法与结构化方法从实现预定目标和组成上是完全一致的[5]。
其次是在运用分解和抽象原则上的一致分解和抽象是软件开发中控制问题复杂性的重要原则。分解即是化整为零,各个击破;而抽象则是通过分解体现,在逐层进行的分解中,上一层是下一层的抽象,而下一层是对上层的具体解释或体现,运用抽象可以不用一下考虑过多的细节,而是逐步有节奏地去了解更多的细节。因此,分解和抽象的原则是处理客观世界复杂问题的最有力的武器,面向对象方法和结构方法在运用分解和抽象原则上的要求则是完全一致的。
再则则是局部化是软件开发中的一个重要原则,即不希望软件一部分过多地涉及或影响软件的其他部分。在结构化方法中,局部化主要体现在代码与数据的分隔化,即程序各部分除必要的信息交流外,彼此相互隔离而互不影响,而面向对象方法则采用数据、代码的封装,即将数据和代码封装成一个能动的整体对象。在运用局部化原则上,面向对象方法继承了结构化方法的宗旨,但它比结构化方法的运用更为深入、更为彻底。重用性即复用性。复用性是软件或软件构件能够容易地构造其他新软件的一种能力。重用性与局部化密切相关,重用性是以局部化为基础的,即只有采用局部化设计原则,才有可能使被设计的软件具有重用性。在面向对象方法中,重用性往往是通过类继承和对象组合两个最基本的技术来实现的,而在结构化方法中,多通过基本模型的组合实现重用[6]。
在软件系统的开发中,结构化方法和面向对象方法在建模中得到了广泛的应用。面向对象方法是现代软件开发方法的主流,在各个领域得到了有效的应用,显示出强大的生命力。虽然相比之下结构化方法优势不如面向对象方法,但是仍有其优势领域所在,不至于被淘汰。在开发软件过程中,要善于发挥两种方法各自的优势,在主流的面向对象的开发方法中,可以辅助结构化方法来更加明确系统的功能,加快面向对象的软件开发过程,有利于建造高质量的软件。
参考文献:
[1] 林玲 结构化方法与面向对象方法在建模中的应用与比较 机电技术 2011年10月
[2] 喻 梅 结构化程序设计方法与面向对象程序设计方法之比较
[3] 汪寒昊 谢加胜 邢跃 软件开发方法——结构化方法与面向对象方法比较 科技信息 2011 年 第 13 期
[4] 黄柏素软件工程实践者的研究方法 [M].北京: 机械工业出版社 , 2001.
[5] 周之英现代软件工程 (新技术篇 ) [ M ].北京: 科学出版社 , 2001.
[6] 贺启宝 ,王 军 面向对象方法与结构化方法 佛山科学技术学院学报 (自然科学版 )第 22卷第 4期