结构化与⾯向对象程序设计
软件开发⽅法指,在项⽬投资规模和时间限制内,设计、实现符合⽤户需求的⾼质量软件,根据软件开发的特点,提出的多种软件开发的策略。随着20世纪60年代,计算机软件、硬件发展不均衡,使⼤型软件的开发过程中出现了复杂程度⾼、研制周期长、正确性难以保证的三⼤难题,引发了“软件危机”。为了同时提⾼软件效率和质量,软件开发⽅法不断⾰新。经过⼏⼗年的研究和应⽤,两种基于相应的程序设计思想和语⾔的软件开发⽅法,结构化⽅法与⾯向对象⽅法,成为了主流的开发⽅法之⼀,⼴泛地使⽤于软件⼯程。
结构化⽅法包括结构化分析(Structured Analysis,简称SA)、结构化设计(Structured Design,简称SD)和结构化程序设计(Structured Program Design,简称SP)三部分内容。相应地,⾯向对象⽅法包括⾯向对象分析(Object-Oriented Analysis,简称OOA)、⾯向对象设
计(Object—Oriented Design,简称OOD)和⾯向对象程序语⾔(Object-Oriented Program Design,简称OOP)。两种软件开发⽅法从起源、思想、分析、设计,到程序设计、扩展重⽤、应⽤等各个⽅⾯有着许多的联系和区别,下⽂我将对⼆者进⾏⽐较分析。两种⽅法针对不同的⼯作环境和应⽤场景,各具优势,也都有所不⾜,我也将讨论⼆者在软件⼯程中的结合,以期产⽣更好的效果。
(⼀)从起源上看
结构化⽅法与⾯向对象⽅法都起源于相应的程序设计思想和语⾔。20世纪60年代后期,《程序结构理论》和《GOTO陈述有害论》的提出,证明了任何程序的逻辑结构都可以⽤顺序结构、选择结构和循环结构来表⽰,确⽴了结构化程序设计思想,产⽣了
如FORTRAN、PASCAL、C等语⾔。结构化⽅法把对程序的分析、设计,延伸⾄对项⽬⼯程的分析、设计,结合程序设计语⾔的技术⽀持,得以产⽣和发展。
20世纪80年代,随着应⽤系统的⽇趋复杂、庞⼤,结构化开发⽅法在⼯程应⽤中出现了⼀些问题。同期,⾯向对象程序设计思想经
过20年的研究和发展逐渐成熟,⼀⼤批⾯向对象语⾔相继出现,⾯向对象⽅法⾃产⽣就⼴受青睐。90年代中期,互联⽹兴起,JAVA语⾔因跨平台特性得以蓬勃发展;21世纪初,不受限于时空的联合开发成为常态;今天,移动APP市场⽕爆,Andriod开发成为热点。⾯向对象⽅法已经成为软件开发⽅法的中坚⼒量。
结构化⽅法和⾯型对象⽅法的起源和发展具有模式⼀致性:
图⼀:软件开发⽅法发展模式
(⼆)从思想上看
结构化⽅法承袭了结构化程序设计的思想,把待解决的问题看作⼀个系统,⽤系统科学的思想⽅法来分析和解决问题。结构化⽅法遵循抽象原则、分解原则和模块化原则;以数据和功能为中⼼;以模块
为基本单位;以算法为程序核⼼;强调逐步求精和信息隐藏。
⾯向对象⽅法的思想是模拟了客观世界的事物以及事物之间的联系。⾯向对象以类取代模块为基本单位;通过封装、继承和多态的机制,表征对象的数据和功能、联系和通信;通过对对象的管理和对象间的通讯完成信息处理与信息管理的计算和存储,实现软件功能。
对于结构化⽅法,模块由函数实现,完成对输⼊数据的加⼯和计算,数据和功能是分离的;⽽⾯向对象把数据和功能封装在对象中,形成⼀个整体。两种⽅法在数据和功能上的不同处理是其思想上的本质差别。
图⼆:结构化思想和⾯向对象思想
(三)从分析上看
建⽴模型是为了更好地理解要模拟的现实世界,是软件开发⽅法的核⼼问题。在结构化⽅法中,使⽤SA构建系统的环境模型和逻辑模型,实现模型的主要⼯具有数据字典(DD)、ER图和数据流图(DFD)。数据字典是⼀个包含所有系统数据元素定义的仓库;ER图描述了数据之间的属性及联系;数据流图是描述信息流和数据从输⼊到输出变换,并展⽰系统和外部的接⼝、数据的输⼊和输出以及数据的存储的应⽤
图形技术[1]。SA的前提条件是需求分析,建模过程是迭代分解需求、不断细化应⽤的过程,即数据流图的分解从顶层图开始,按照每个加⼯对应⼀个⼦图的分解原则,逐层分解为0层图、1层图等。
⾯向对象⽅法使⽤OOA定义类,对现实世界建模。OOA的主要任务是要在问题域上构建具有主题层、对象层、结构层、属性层和服务层的OOA模型,实现模型的主要⼯具有⽤例图(Use-Case)和类图(Class Diagram)。⽤例图从⽤户⾓度描述系统功能,并指出各功能的操作者,是对需求分析的整理;类图定义了类的组成(属性和服务)、类的结构和类间的关系,确定并划分系统中的类。经过OOA,系统的静态模型建⽴起来。
相对于结构化⽅法使⽤DD、ER图和DFD分别描述数据和功能(尽管⼆者存在相互参考),⾯向对象⽅法中,⽆论是⽤例图还是类图,数据和功能的描述总是并⾏的。
图三:数据流图
图四:⽤例图 图五:类图
(四)从设计上看
在结构化⽅法中,使⽤SD构建系统的⾏为和功能模型,实现模型的主要⼯具有模块结构图(SC)和程序流程图。模块结构图说明了系统的模块的划分、模块的功能、模块间的数据传递及调⽤关系。根据数据流图,我们能够映射出相应的软件的上层模块结构;结合数据流图,我们可以逐步分解上层模块,设计出中、下层模块;对于得到的全部模块,我们需要设计模块基本的内部结构和外部接⼝及对模块结构进⾏优化。进⼀步,则是针对每⼀个模块设计程序流程图,整理优化,归纳算法。SD依然是对项⽬系统的进⼀步分解求精的过程,把模型从逻辑级,细化到模块级,再细化到程序级。
⽽OOD不只是对OOA的细化,更主要的,构建了系统的动态模型,实现模型的主要⼯具有交互图(Sequence Diagram)、状态图(State Diagram)、活动图(Activity Diagram)。和模块相⽐,对象最⼤的不同是具有“活性”,突出表现在对象具有状态和对象间能够通讯。交互图描述对象间的交互关系,显⽰对象之间的动态合作关系,强调对象之间消息发送的时间顺序;状态图描述对象的所有可能状态,以及事件发⽣时状态的转移条件;活动图描述为满⾜⽤例要求所进⾏的活动以及活动间的约束关系,⽤于识别并⾏活动,以提⾼系统效率[2]。
从设计⽅⾯,我们可以⽐较明显地看出结构化和⾯向对象的区别。结构化⽅法的核⼼是程序,从分析到设计,其实是从抽象到具体,从模糊到清晰地实现程序的过程;⽽⾯向对象⽅法的核⼼是功能,分析的是对象,设计的是⾏为,程序设计和系统设计相对分离。
图六:模块结构图
图七:交互图 图⼋:状态图 图九:活动图
(五)从程序设计上看
以例⼦进⾏说明(银⾏存取款):
int main () {
int count;
int money;
int type;
scanf ("%d %d %d", &count, &money, &type);
if (type)
printf ("%d", count - money);
else
printf ("%d", count + money);
}
pascal语言面向对象吗
结构化程序设计
class Count {
int count;
Count (int count) {
}
int save (int money) {
count += money;
}
int take (int money) {
if(count >= money)
count -= money;
}
}
⾯向对象程序设计
从上例可见,结构化程序设计是⼀种过程式的“解题”的⽅式,程序关注且只关注对于输⼊数据,输出正确的结果,代码是算法的直接体现,代码效率⾼;⾯型对象程序设计是整体式的“建模”的⽅式,程序关注现实客体,⽽⾮某些数据,代码是功能的直接体现,复杂的算法往往是⼀两⾏库函数处理,代码效率低。
(六)从扩展重⽤上看
结构化⽅法是⾯向整体应⽤进⾏的分析、设计,程序设计也是过程式的针对固定的输⼊域,代码定向性明显。所以,结构化⽅法的可扩展性较差,功能的变化可能危及整个系统;重⽤性不好,若系统间存在嵌套关系,主系统可重⽤⼦系统;较难以组合拼接,系统的设计实现是紧耦合的,连接往往是有缝的。
相反,⾯向对象⽅法虽然基于应⽤,但⾯向现实客体,对象之间独⽴性较强,功能是对象的交互。所以,⾯向对象的可扩展性较强,只需扩展或修改某个类,或调整某种通讯;重⽤性好,⾯向对象的继承和多态机制⼤⼤提⾼了代码重⽤的层次和粒度;易于组合拼接,对象是数据和功能的最⼩单位,为对象建⽴新的通信的联系,就能够组合出新的软件系统。
(七)从应⽤上看
结构化⽅法的实质是问题求解,结构化程序是由算法决定的,算法是程序员分析设计的,程序的执⾏过程主要是由程序员控制,⽽不是由⽤户控制;⾯向对象⽅法中,程序员设计的是对象属性及操作⽅法,但在什么时间、使⽤什么⽅式操作对象则是完全由⽤户交互控制。
结构化⽅法的建模⼯具难以表达交互性强的软件系统,程序设计融⼊系统的分析和设计中,处理⼤型系统时会过于复杂,甚⾄很难控制;⾯向对象⽅法的抽象机制提供了⾃然的建模⽅法,特别是能很好地把握对象之间复杂的相互关系。
结构化⽅法⽐较适合⼯程计算、实时数据的跟踪处理、各种⾃动控制系统等等;⾯向对象分析更加适⽤于复杂的、由⽤户控制程序执⾏过程的应⽤软件,⽐如⼤型游戏软件以及各类管理信息系统软件[3]。
(⼋)⼆者之结合
经过上述分析,我们可知结构化⽅法和⾯向对象⽅法对于不同的软件系统各有优劣。结构化⽅法把解空间分数据和功能两部分,可以更加清晰地进⾏需求分析和功能分解,数据流图能够细致地说明数据在各个功能模块之间的流动和变化,更适于系统设计的前期阶段。设计⼈员清楚地了解数据和系统要求的操作后,⾯向对象⽅法能够把数据和功能以对象为单位封装成⼀个整体,更直观地表达对象的状态变化和对象间的交互,更加准确地分析功能的实现过程,更适于在软件后期细化系统的具体⾏为。基于此,设计的混合式软件开发⽅法如下:
1) 使⽤SA进⾏需求分析,建⽴数据字典,构建总的和分层的数据流图。
2) 使⽤模块结构图设计系统的独⽴功能块,做出模块内的程序流图。
3) 结合数据流图,聚合同类模块,规约类,根据程序流图,设计类的属性和类的⽅法。
4) 使⽤OOD建⽴系统的动态模型,分析对象的⾏为和协作。
5) 总体⾯向对象程序设计,细节结构化程序设计优化,实现代码层。
使⽤混合式⽅法,我们能够充分利⽤两种⽅法的优点,扬长避短,提⾼开发的效果和效率。
⽆论是结构化⽅法,还是⾯向对象⽅法,都是⽤来解决⽇益⽭盾的软件危机的系统⽅法。从直接开发,
到结构化⽅法,再到⾯向对象⽅法,软件构件的愈发独⽴、可重⽤,开发在⼀个更⾼的层次进⾏,分析层、设计层和代码层关联性减少。这些都有利于系统开发员更加关注功能本⾝,提⾼软件质量。硬件性能的提⾼会使计算机的使⽤越发⼴泛,软件⼯作的环境更加复杂,软件的功能更加丰富,软件的性能更需提⾼,对软件开发⽅法提出了更多的要求,会涌现更⾼层次的新的⽅法。⽆论使⽤哪种开发⽅法,或者是混合哪⼏种开发⽅法,我们都要因地制宜,依据需求分析和系统要求,做出最好的选择或组合。
参考⽂献:
[1] 汪寒昊,谢加胜,邢跃,《软件开发⽅法——结构化⽅法与⾯向对象⽅法⽐较》,绵阳师范学院数学与计算机科学学院,,2011,第13期。
[2] 张莉,《结构化⽅法与⾯向对象⽅法的⽐较分析》,陕西师范⼤学计算机科学学院,陕西师范⼤学学报(⾃然科学版),第29卷,第2期,2001.6。
[3] 许秀林,《结构化⽅法与⾯向对象⽅法思想辨析》,南通职业⼤学,南通职业⼤学学报,第18卷,第4期,2004.12。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论