从面向过程到面向对象的变革

时间:2022-09-22 06:30:05

摘要:面向过程方法的弊端引发了20世纪60年代的“软件危机”,面向对象方法的出现为软件开发开辟了新的出路。从分析“软件危机”的起因着手,阐述了面向过程方法的弊端,介绍了面向对象方法的特点,并总结了面向对象方法优越性和局限性。

关键词:软件开发;面向过程;面向对象

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)09-2136-03

The Revolution from Structural Method to Object-oriented Method

YE Xuan

(School of Educational Technolegy, Beijing Normal University, Beijing 100875, China)

Abstract: The disadvantages of structural method precipitated the software crisis in the 1960s, but the appearance of object-oriented method changed the embracing position of Software Engineering. Beginning with analyzing the cause of software crisis, expounds the disadvantages of structural method, than presents the characteristic of object-oriented method and both its advantages and limitation.

Key words: software engineering; structural method; object-oriented method

从软件工程的诞生开始,软件开发的方法就处于不断进步的进程中,其中从面向过程方法进化到面向对象方法是一次伟大的飞跃,是什么导致了这次转变?面向对象方法又给软件工程带来了什么变化?这些得从“软件危机”谈起。

1“软件危机”与面向过程方法

20世纪60年代中期,随着计算机技术的逐步成熟,计算机应用范围的逐渐扩大,软件开发领域急剧膨胀,这时,软件开发人员开始面临一个十分严峻的问题――“软件危机”。

“软件危机”主要表现为三点:第一,开发出来的软件的功能和用户的需求往往“牛头不对马嘴”;第二,软件系统的规模和复杂度的扩大让开发人员力不从心,开发过程中的一些错误已经达到开发人员无法掌控的地步;第三,开发出的软件可维护性很差,要复用已有成果或者对其进行扩展都很困难,软件的进化也很难跟上硬件发展的速度。

追究“软件危机”产生的原因,固然有一部分是因为开发者缺乏对大规模软件的管理经验,缺乏正确的方法学指导或者是开发工具的支持(杨健,张晓玲,周少,2006,135-136),但是最关键的问题在于――当时大多数软件开发工作的全过程,包括分析,设计以及编程实现等,都采用面向过程方法。具体来说,在分析阶段,开发人员根据面临的情况,如用户的需求,软件要求的功能等,做出一个物理模型,其次转换成逻辑模型,再通过数据流分析,把这个模型转化数据流图,记录数据字典。在设计阶段,开发人员根据数据流图划分数据类型,并映射到不同的程序模块类型,通过这样完成分析模型到设计模型的转变,并设计出数据结构图。然后,开发人员在此基础上详细的设计每个程序模块内部的结构和算法。常常是把大模块又分成很多小模块,多次分解,最后再设计完成每个小模块的内容。在实现阶段,利用面向过程的编程语言(如C语言等)进行编程,具体实现整个软件系统。

之所以说这一套方法是导致“软件危机”的关键,是因为它不论是在分析和设计上,还是在编程实现上都存在很大的弊端。

第一,面向过程方法的分析手段是不够妥当的。整个分析和设计阶段可以概括为“需求-数据流-程序模块”的模式,所以对于需要解决的问题,在分析阶段并不能直观的显示出各种事物及其关系,而是映射到数据流中进行分析。因此,当系统比较复杂的时候,很难判断基于数据的分析是否有偏差,是否相对于原本的实际问题有出入,或是否存在理解上的错误。也正是因为所有的分析工作是基于数据流的,开发人员在分析阶段就面临和用户沟通上的困难,他们很难和用户解释数据流图中的内容代表了什么,很难通过沟通发现分析结果和用户需求的差距在哪。并且,如果用户在开发工作的中途想改变一些需求或是外界条件发生了变化,开发人员也不能直接改动分析结果,必须重新映射到数据上再做调整。

第二,从分析阶段到设计阶段的转化是有很大的隐患的。所谓的“数据―程序模块”的转型就是依照一些对应原则,把数据流图转化成程序模块,这两种不同的体系之间的转换是否正确,是否合理是没有保障的。这种“需求-数据流-程序模块”的模式就像多人传话一样,第一个人传话给第二个人,第二个人根据自己的理解把话传给第三个人,第三个人再加上自己的理解,得到的结果和原话已经不是一个意思。原本的内容经每个步骤都被不同的体系“转义”了一遍,这样很可能导致设计出的结果和软件需求的本来面貌相差甚远。

第三,由于面向过程的程序语言本身存在很多不足,导致软件开发的实现阶段出现了很多问题。首先,程序的安全性缺乏保障。很多关键的数据既可以被作用于它们的操作访问,也可以被其他的操作访问。并且,面向过程的程序操作都属于“白盒操作”,所有细节都被暴露在外。一个疏忽的数据修改或者程序调用都可能导致整个系统崩溃。其次,程序员的工作非常繁杂。由于数据和函数是分开来处理的,程序员在编程的时候要考虑的因素就很多,每次编写一个函数都必须把详细的注释添加到数据字典中,对于不同类的数据进行一种操作或者同一类数据进行不同操作都必须写不同的代码。这种编程对程序员的水平要求非常高,仅仅让数据和函数一直保持兼容就已经是程序员沉重的负担。在团体合作中,一个程序员要接手另一个程序员的工作往往需要阅读数十页的数据字典,不同的程序员编写的程序可能还存在着名称重复,风格迥异等冲突,这些问题在复杂的系统中将凭空地加大程序员的工作量。再次,软件的可维护性很差。由于数据和函数代码的分离,每当数据发生改动,所有相关的函数都要重写,想对整个程序进行扩充,升级,或者移植到别的背景下重用都面临着大量的代码修改。

2面向对象方法

我们可以看到,面向过程方法确实给软件开发工作带来了很多困扰,而面向对象方法正是在这种情况下诞生的。面向对象总的来说有三大特点的:封装性,继承性和多态性。

封装性是面向对象最基本的特点,因为它体现了面向对象最基本的思想:客观世界是由各种对象组成的,复杂的对象可以由比较简单的对象以某种方式组合而成(符于江,2008,451-456)。所有的对象都具有静态属性和动态行为,把相似对象的属性和行为抽象出来,用这些共同的属性(数据)和行为(方法)构成类,作为创建具体对象的模板。封装性就是指把关于一个类的所有数据和方法一起封装在类的内部,只通过一些方法作为对外沟通的接口,外界只能通过这些接口和对象进行联系,而对象内部的很多数据和具体操作是对外不可见的。

继承性是指对于一些具有一般意义的类,可以创建它们的子类,子类可以继承一般类的所有属性和方法,同时可以根据自己的特性,修改继承得来的属性和方法或者添加自己独有的属性和方法。比如对于一般类“亚洲人”,我们可以创建子类“中国人”,“韩国人”等。

多态性有两种形式。第一种是一个类中同名字的方法可以接受不同类型的参数,对于不同类型的参数的处理是不同的。比如在一个类中定义“add”方法实现数的相加,它既可以处理整形的参数,也可以处理浮点型的参数,还可以处理一些自定义类的参数,但是针对每个类型都有各自的处理操作。第二种多态和继承性有关。由于某个父类可以有多个子类,每个子类都可以根据自己的特征修改父类中的属性和方法,当把这些子类当成父类来用的时候(如JAVA中的上转型对象或是接口回调),相同的父类方法就会有不同的实现方式。例如一个JAVA程序中,对于父类“动物”中的方法“叫”,用子类“狗”的上转型对象实现该方法则输出“汪汪”,用子类“猫”的上转型对象实现该方法则输出“喵喵”。

基于以上三大特点,面向对象方法导致了对整个软件开发过程的彻底变革。在软件开发的分析,设计和实现阶段都和面向过程方法截然不同。开发人员首先按照需求分析出软件的每个必备功能。然后归纳属性,确定对象及对象之间的关系。再进一步把功能分配给每个对象,构建对象的行为。接下来对每个对象的方法和对象之间的交互作进一步的细化。再接着确定可重用的类和部件,用结构图画出各个类,部件的结构和相互依赖关系。最后再对软硬件的相互依赖关系进行描述。在以上分析和设计工作完成之后,开发人员利用面向对象程序语言进行编程来达到软件功能的实现。

3面向对象方法的优越性

面向对象方法之所以能把软件开发带入了一片新天地,是因为它在以下三个方面都有卓越之处。

3.1整体开发思维

抛开具体操作流程不说,面向对象方法首先对解决问题的整体思维进行了人性化的革新。其人性化主要体现在以下四点:首先,人们生活的现实世界是个体,群体及各种关系组成的,面向对象的系统也是如此。对象代表个体,类代表群体,对象之间,类之间,类与对象之间通过方法调用建立各种关系。其次,从大众个体中总结出一类共同的属性和行为,从而形成类的手段正是人类抽象思维的应用。抽象思维是人类最基本,最习惯的思维之一。再次,面向对象允许开发人员一开始只拟定系统的大致框架,即确定主要的类及其关系,之后再逐步对其进行细化和拓展。这和人类逐步深入的思考习惯是相一致的。最后,面向对象方法大大简化了开发人员思考问题的复杂度。比如对于一个子类,开发人员可以理所当然的认定它已经拥有父类的所有一般特征,只要把精力放在思考子类的特性上就可以了。面向过程要求程序员必须从数据流动的角度思考待解决的问题,而面向对象的这些人性化因素让开发人员摆脱了这种被迫的“机器化”思考的尴尬境地,用自然贴切的思维考虑问题。

3.2分析和设计

面向对象方法是分析和设计阶段的合理性有了很好的改善。面向对象的分析和设计采用的是“需求-对象-类”的模式,用对象和类直观地描述系统中的事物及其关系,这样就解决了面向过程方法所导致的一系列问题。在分析过程中,这种直观性原本的保留了所有事物及其关系的原貌,因此在构建对象和抽象出类的时候,很容易被发现在理解上的偏差。同时,开发人员也很容易向用户解释各个类和对象的含义,可以及时得到用户的反馈。处理需求的改变或是外部条件的改变时,也可以直接修改相应的类和对象。除此之外,对于问题的描述和对于问题的解决都应用同一套类和对象系统,因此软件开发的分析工作和设计工作是连续的,甚至是部分重叠的,不存在面向过程中从数据流到程序模块的转化,不用担心因为一个系统到另一个系统的映射不当导致结果和目标的偏离。

3.3编程实现

面向对象编程语言的应用使得软件工程的实现过程有了很大的改进。

首先,程序的安全性有了明显的提高。由于类的封装,对象中只有少数的成员和方法可以被外接直接调用,对象内部的实现细节也是被隐藏的。这样有效降低了程序各部分间的依赖性,整个系统一般不会因为某处变动而引发整体混乱。

其次,面向对象把开发人员的编程工作变得比较轻松和方便。每个对象的数据和操作都被封装在一起,因此开发人员很容易保持数据和方法的兼容性,并且编程时只需要对每个类进行说明,不需把对于每个数据,每个方法的描述都写进数据字典。对于被封装的方法,只要依据访问规则就可以使用,不必了解实现细节。类中描述了一类个体的共有特征,在创建对象的时候这些描述不需要一遍又一遍的重复。类和对象的设置还易于分类,管理和查找。这些改变都在很大程度上降低了开发工作对程序员编程水平的要求。

再次,面向对象让团体合作的编程更加顺畅。归功与类和对象的直观性,当某程序员利用别人的成果时不必面临复杂的查阅,学习过程。继承性和多态性允许开发团队先行确定主要的类及关系,事先统一编程标准和风格,然后再把具体的细节交给不同的人员实现,这样最终得到的结果不会面临很多麻烦的冲突问题。

最后,面向对象语言最强大之处表现为可复用性和可扩充性。通过继承已有的类可以实现可复用性,让很多类的性质可以被共享。在开发过程中,复用自己或是他人已有的成果,等于是站在巨人的肩膀上,省去了大量的工作,加速了开发进程。另外,被重用过的代码都是经过测试的,这样大大减少了编程中发生错误的机会。面向对象的三大特点使程序具有良好的可扩充性。封装性使程序各部分间的独立性很强,继承性使类程序具有层次结构,多态性是程序能够实现问题的复杂多样。当开发人眼对已有的问题有了新的认识的时候,通过继承和多态的方式,无需修改原来的父类代码,就可以再创建新的子对象类的过程中增加新属性,或删除过时无用的属性,操作或对象,达到高效的功能扩充。可复用性和可扩充性让整个软件有很强的可维护性。在修改程序的过程中,修改某个对象对别的对象影响很小,新增或修改某功能对其他功能的影响很小。同时,开发出的软件也有很好的可移植性。对于不同的使用条件,只要修改很少的代码就可以让软件重装上阵。

4面向对象方法的局限

虽然说面向对象方法给软件工程带来了很多好处,但是它也存在自己的局限性。第一,面向对象方法对支撑它的工具和环境的要求比较高。第二,利用对象和类对问题的描述存在不足。由于客观世界中很多事物的界限并不是很清晰,这给创建对象和抽象出类的正确性和精准性都带来了困难。并且,对于同一个客观事物,不同的人从不同的角度观察分析可能会映射出不同的对象属性和方法,有的时候开发团队之间或是开发人员与用户之间可能存在分歧。第三,面向对象程序的运行效率可能比较低,由于通过继承引入了层级,过多的祖宗类和父类势必会影响运行效率。所以在实现软件的时候应该遵循“多组合,少继承”的原则。第四,封装性带来的程序内部不可见可能给软件的维护带来不便。

由于这些局限性,在处理问题的时候不能盲目采用面向对象方法,必须先分析要解决的问题类型来决定是采用面向对象方法,面向过程方法还是其他方法,或是几种方法的综合运用。

参考文献:

[1]郑莉,董源,张瑞丰.C++程序设计[M].3版.北京:清华大学出版社,2004.

[2]耿祥义,张跃平.Java面向对象程序设计[M].北京:清华大学出版社,2010.

[3]张孝祥.Java就业培训教程[M].北京:清华大学出版社,2003.

[4]杨健,张晓玲,周少云.软件危机及其应对措施探讨[J].电脑知识与技术,2006(35):135-136.

[5]符于江.程序设计中结构化方法和面向对象方法的比较[J].电脑知识与技术,2008(21):451-456.

[6]郭溪川.对比分析面向对象方法与结构化方法[J].农业网络信息,2006(11):100-104.

[7]张莉,裘国永.结构化方法与面向对象方法的比较分析[J].陕西师范大学学报:自然科学版,2006(6):29-32.

[8]缪淮扣,高晓雷,李刚.结构化方法、面向对象方法和形式方法的比较与结合[J].计算机工程与科学,1999(4):27-31.

上一篇:中兴 Light Tab 2 WCDMA 无线数据终端 下一篇:中职计算机专业课有效教学的研究