1
 软件工程
1.8.1 6.1 传统软件开发方法与面向对象方法的比较

6.1 传统软件开发方法与面向对象方法的比较

思维方式决定解决问题的方式。传统软件开发方法与面向对象方法在思维方式上存在区别。传统软件开发方法是面向过程、面向功能的方法,其主要思想是将软件系统模块化,在此基础上还可以再分成若干个程序单元,这些单元可以通过一系列程序过程实现。而后者是面向对象的方法,其主要思想是尽可能模拟人们习惯的思维方式,使开发软件的方法与过程尽可能接近于人们认识世界、解决问题的方法与过程,也就是说,使描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能一致。所谓问题空间是指软件系统所涉及的应用领域和业务范围(现实世界),解空间是指用于解决某些问题的软件系统。

传统软件开发方法曾给软件产业带来巨大进步,部分缓解了软件危机,许多中小规模软件项目运用该方法获得了成功。但是,这种方法应用于大型软件产品开发时,却很少取得成功,其主要存在如下问题。

(1)传统软件开发方法无法实现从问题空间到解空间的直接映射。

(2)由于传统软件开发方法中数据与代码(操作)分离,使得传统软件开发方法无法实现高效的软件复用,而且,存在使用错误的数据调用正确的代码或使用正确的数据调用错误的代码的危险。例如,在多人分工合作开发一个大型软件系统的过程中,如果负责设计数据结构的人员中途改变了某个数据的结构却未及时通知其他人员,则会发生许多不该发生的错误。

(3)传统软件开发方法难以实现从分析到设计的直接过渡。

针对传统软件开发方法的缺点,人们提出了面向对象方法。随着Smalltalk-76和Smalltalk-80语言的推出,面向对象的程序设计方法得到了比较完善的实现。此后,面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、分布式系统、网络管理结构和人工智能等领域。面向对象开发方法比较自然地模拟了人类认识客观世界的方式,到了20世纪90年代,面向对象方法已经成为人们开发软件系统的首选。正是面向对象软件技术的广泛应用,推动了面向对象软件工程方法学的发展。

面向对象开发方法是一种把面向对象的思想应用于软件开发过程,指导开发活动的系统方法。它对软件开发过程所有阶段进行综合考虑,使问题空间与解空间具有一致性,从而降低了复杂性。它用符合人类认识世界的思维方式来分析和解决问题,使软件生存周期各阶段所用的方法、技术具有高度的连续性。它以对象为中心构造系统,而不是以功能为中心,能很好地适应需求变化,将面向对象分析(Object-Oriented Analysis,OOA)、面向对象设计(Object-Oriented Design,OOD)、面向对象编程(Object-Oriented Programming,OOP)有机地集成在一起,有利于系统的稳定性。由于对象所具有的封闭性和信息隐蔽性,使得软件具有很强的独立性和良好的可重用性。

归纳起来,面向对象开发方法的优点如下。

1.与人们习惯的思维方式一致

面向对象方法以对象为中心,使用对象模拟现实世界中的概念,而不是以算法为中心,所以计算机观点已被淡化,软件开发者在开发系统时,能够更多地使用用户应用领域中的概念去思考问题。在整个开发过程中都在考虑如何建立问题域对象模型;如何对问题域进行自然的对象分解;如何确定需要使用的类和对象;如何建立对象之间的联系。这样的开发过程和人们在解决复杂问题时逐步深化的渐进过程是一致的。

2.提高软件系统的可重用性

可重用性是面向对象方法开发软件的核心思路。从一开始,对象的产生就是为了重复利用,完成的对象将在今后的程序开发中被部分或全部地重复利用。面向对象的基本特征是抽象性、封装性、继承性、多态性,这四大特征都或多或少地围绕可重用性这个核心,而其中的继承性是主要的重用机制。通过上级父类派生出下级子类,子类不仅可以重用其父类的数据结构和程序,而且可以在其父类的基础上,方便地进行子类的修改和扩充,极大地提高了软件开发的效率。

3.降低系统的复杂度

面向对象是降低系统复杂度的好方法。首先,它按类来组织系统,把系统分成几个大的部分,每个部分又由更小的子类组成,如此细分下去直到能轻易实现它为止,这种分而治之的方法符合人们解决复杂问题的习惯。其次,它采用从抽象到具体的顺序来把握事物,抽象让人们用少量精力先掌握事物的共性,然后再去研究事物更具体的特性,这种逐渐细化的方法也符合人类解决复杂问题的习惯。许多软件开发公司的经验表明,当把面向对象方法学用于大型软件开发时,能较好地降低系统复杂度,软件成本明显降低,软件的整体质量也得到提高。

4.提高软件的可靠性

由于面向对象的应用程序包含了通过测试的标准部分,大量代码来源于成熟可靠的类库,因而新开发程序的新增代码明显减少,这是提高软件可靠性的一个重要原因。

5.提高软件的可维护性和可扩充性

当系统的功能需求发生变化时,通常仅修改与之相关的类或对象。类是独立性较强的模块,对象的封装性较好地实现了模块独立和信息隐藏,因此,当修改该类时,不易发生波动效应,只要接口不变,就不影响其他部分,提高了软件的可维护性。同时,由于对象具有良好的模块独立性和继承性,使得扩充与修改变得相对容易。

6.提高软件的稳定性

需求变化是软件开发面临的重要难题之一。用户似乎从来不知道他们真正的需求是什么,或许他们真正的需求也是在变化着的。事实上,大部分用户需求变化是针对功能的。因为面向对象的软件系统的结构是根据问题域的模型建立起来的,而不是基于对系统要完成的功能的分解,所以,当软件系统的功能需求发生变化时并不会引起软件结构的整体变化,通常只需作一些局部性的修改。例如,从已有类派生出一些新的子类以实现功能扩充或修改,增加或删除一些对象等。总之,由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也比较稳定。