《面向对象分析与设计》一1.4面向对象方法的主要优点

时间:2024-03-14 22:16:01

1.4面向对象方法的主要优点

本节从认识论的角度和软件工程方法的角度看一下面向对象方法带来的益处,并把面向对象方法与传统方法进行比较,看面向对象方法有什么优点。

  1. 从认识论的角度面向对象方法改变了开发软件的方式
    面向对象方法从对象出发认识问题域,对象对应着问题域中的事物,其属性与操作分别刻画了事物的性质和行为,对象的类之间的继承、关联和依赖关系能够刻画问题域中事物之间实际存在的各种关系。因此,无论是系统的构成成分,还是通过这些成分之间的关系而体现的系统结构,都可直接地映射到问题域。这使得运用面向对象方法有利于正确理解问题域及系统责任。
  2. 面向对象语言使得从客观世界到计算机的语言鸿沟变窄
    图1.4为一个示意图,说明了面向对象语言如何使得从客观世界到计算机的语言鸿沟变窄。

机器语言是由二进制的“0”和“1”构成的,离机器最近,能够直接执行,却没有丝毫的形象意义,离人类的思维最远。汇编语言以易理解的符号表示指令、数据以及寄存器、地址等物理概念,稍稍适合人类的形象思维,但仍然相差很远,因为其抽象层次太低,仍需考虑大量的机器细节。非OO的高级语言隐蔽了机器细节,使用有形象意义的数据命名和表达式,这可以把程序与所描述的具体事物联系起来。特别是结构化编程语言更便于体现客观事物的结构和逻辑含义,与人类的自然语言更接近,但仍有不少差距。面向对象编程语言能比较直接地反映客观世界的本来面目,并使软件开发人员能够运用人类认识事物所采用的一般思维方法来进行软件开发,从而缩短了从客观世界到计算机实现的语言鸿沟。
3面向对象方法使分析与设计之间的鸿沟变窄
本书所讲的传统软件工程方法是指面向对象方法出现之前的各种软件工程方法,此处主要讨论结构化的软件工程方法。图15是结构化的软件工程方法的示意图。

《面向对象分析与设计》一1.4面向对象方法的主要优点

在结构化方法中,对问题域的认识与描述并不以问题域中的固有事物作为基本单位,并保持它们的原貌,而是打破了各项事物间的界限,在全局的范围内以功能、数据或数据流为中心来进行分析。所以运用该方法得到的分析结果不能直接地映射到问题域,而是经过了不同程度的转化和重新组合。这样就容易隐藏一些对问题域理解的偏差。此外,由于分析与设计的表示体系不一致,导致了设计文档与分析文档很难对应,在图15中表现为分析与设计的鸿沟。实际上并不存在可靠的从分析到设计的转换规则,这样的转换有一定的人为因素,从而往往因理解上的错误而埋下隐患。正是由于这些隐患,使得编程人员经常需要对分析文档和设计文档进行重新认识,以产生自己的理解再进行工作,而不维护文档,这样使得分析文档、设计文档和程序代码之间不能较好地衔接。由于程序与问题域和前面的各个阶段产生的文档不能较好地对应,对于维护阶段发现的问题的每一步回溯都存在着很多理解上的障碍。

《面向对象分析与设计》一1.4面向对象方法的主要优点

面向对象开发过程的各个阶段都使用了一致的概念与表示法,而且这些概念与问题域的事物是一致的,这对整个软件生命周期的各种开发和管理活动都具有重要的意义。首先是分析与设计之间不存在鸿沟,从而可减少人员的理解错误并避免文档衔接得不好的问题。从设计到编程,模型与程序的主要成分是严格对应的,这不仅有利于设计与编程的衔接,而且还可以利用工具自动生成程序的框架和(部分)代码。对于测试而言,面向对象的测试工具不但可以依据类、继承和封装等概念与原则提高程序测试的效率与质量,而且可以测试程序与面向对象分析和设计模型不一致的错误。这种一致性也为软件维护提供了从问题域到模型再到程序的良好对应。

4面向对象方法有助于软件的维护与复用
需求是不断变化的(尽管可阶段性地“冻结”),这是因为业务需求、竞争形式、技术发展和社会的规章制度等因素都不断地在发生变化。这就要求系统对变化要有弹性。
在结构化方法中,所有的软件都按功能(可用过程或函数实现)来划分其主要构造块,最终的系统设计往往如图17所示。

《面向对象分析与设计》一1.4面向对象方法的主要优点

从图17中能够看出,数据结构与算法是分别组织的,对一处修改,可能会引起连锁反应。这种建模的缺点是模型脆弱,难以适应不可避免的错误修改以及需求变动,以至于系统维护困难。算法和数据的分离,是造成这种状况的根本原因。算法和数据间的可能的紧密耦合,也使得复用难以实现。
在面向对象方法中,把数据和对数据的处理作为一个整体,即对象。该方法以对象及交互模式为中心,如图18所示。

《面向对象分析与设计》一1.4面向对象方法的主要优点

通过与结构化方法的比较,能够看出,面向对象方法还具有如下的主要优点:
1)把易变的数据结构和部分算法封装在对象内并加以隐藏,仅供对象自己使用,这保证了对它们的修改并不会影响其他的对象。这样对需求的变化有较强的适应性,有利于维护。对象的接口(供其他对象访问的那些操作)的变化会影响其他的对象,若在设计模型时遵循了一定的原则,这种影响可局限在一定的范围之内。此外,由于将操作与实现的细节进行了分离,这样若接口中的操作仅在实现上发生了变化,也不会影响其他对象。对象本身来自于客观事物,是较少发生变化的。
2)封装性和继承性有利于复用对象。把对象的属性和操作捆绑在一起,提高了对象(作为模块)的内聚性,减少了与其他对象的耦合,这为复用对象提供了可能性和方便性。在继承结构中,特殊类对一般类的继承,本身就是对一般类的属性和操作的复用。
5面向对象方法有助于提高软件的质量和生产率
按照现今的质量观点,不仅仅要在编程后通过测试排除错误,而是要着眼于软件开发过程的每个环节开展质量保证活动,包括分析和设计阶段。系统的高质量不是仅指系统没有错误,而是系统要达到好用、易用、可移植和易维护等,让用户由衷地感到满意。采用OO方法进行软件开发,相对而言更容易做到这些。
有很多数据表明,使用OO技术从分析到编程阶段能大幅度地提高开发效率,在维护阶段提高得就更多。这主要体现在如下几方面:
 OO方法使系统更易于建模与理解。
 需求变化引起的全局性修改较少。
 分析文档、设计文档、源代码对应良好。
 有利于复用。