1.2 面向对象技术基础
什么是面向对象技术?不同人从不同角度考虑就有不同的理解。可以认为,面向对象技术是一种处理计算机软件系统的观点;也可以说是一种系统分析和设计的思想,或是一种编程方法;又或者说是一组设计原则和模式。
面向对象技术是一系列指导软件构造的原则(如抽象、封装、多态等),并通过语言、数据库和其他工具支持这些原则。从定义可以看出,从本质上讲,对象技术是对一系列相关原则的应用。有些书中采用“面向对象技术=类+对象+抽象+封装+继承+多态+消息……”这样更直观的形式定义面向对象技术。因此如果在应用过程中没有很好地利用这些思想,那么就不是面向对象。就像第1.1节中的Java实例,虽然定义了类,但是目标不是为了抽象、不是为了封装、不是为了多态,这就不是面向对象技术。
1.2.1 面向对象技术的发展历史
在掌握对象技术的应用之前,有必要介绍一下面向对象技术的发展历史,特别是几个标志性事件。
(1)Simula语言:面向对象技术最早起源于1962—1967年出现的Simula 67语言,该语言是由Ole-Johan Dahl和Kristen Nygaard在挪威奥斯陆的国家计算中心设计实现的,它是世界上公认的第一种面向对象语言,在该语言中第一次提出了类、对象、封装等基本思想。
(2)Smalltalk语言:使面向对象技术进入实用化的标志则是1970年诞生的Smalltalk语言,它是由美国施乐公司的恪洛阿尔托研究中心(PARC)的Alan Kay设计实现的,是第一个成熟的面向对象语言,在这个语言中提供了完整的面向对象技术解决方案(诸如类、对象、抽象、封装、继承、多态等)。该语言的很多思想到现在还被广泛应用(如MVC、重构等)。
(3)C++语言:对象技术能够发展到今天这个地步,离不开1983年诞生的C++语言。正是因为C++语言的广泛应用,面向对象技术才真正从实验室阶段走到了商业化阶段,当今流行的Java、C#等面向对象的编程语言都有C++语言的影子。
(4)UML:面向对象技术发展初期成果还主要体现在面向对象编程语言的应用领域。然而随着软件工程技术的日益成熟和受到重视,在20世纪80年代末、90年代初,面向对象的软件工程也得到了迅速发展。在此期间,各种面向对象的方法层出不穷,这给普通用户的使用带来了很大的困扰。而1997年统一建模语言(Unified Modeling Language, UML)的产生则标志着面向对象方法学的统一,从而为面向对象技术的应用扫清了最后一个障碍。此后,所有的软件工程师都可以使用他们的通用语言——UML来表达面向对象的思维。
1.2.2 面向对象技术的优势
作为一种区别于传统结构化方法的开发技术,面向对象技术被广泛认可和应用是因为它自身的优势,这些优势体现在很多方面。
1.沟通——在计算机中模拟现实世界的事和物
和传统结构化方法更侧重于计算机表达问题的能力不同,面向对象技术更顺应人类思维习惯,让软件开发人员在解空间(计算机环境)中直接模拟问题空间(现实世界)中的对象及其行为。这一特点使得开发人员能够更有效地在用户环境和实现环境之间进行转换,从而能够更加快速、有效地解决用户问题。
下面的这段代码采用最早的计算机语言(汇编语言)编写而成,它的目标是表达一件现实世界所发生的事情。然而,它到底要表达什么呢?对于普通用户来说,这段代码简直是一段“天书”,恐怕只有专业的技术人员才能对它进行有效的应用和维护了。
PUSH EBX MOV EBX, EDX MOV EDX, EAX SHR EDX,1 6 DIV BX …
而同样的这件事情,采用面向对象技术来描述就变得非常形象和生动了。原来它是在描述一件动物世界发生的故事,很形象且很容易理解。
AHare.Run; ALion.Catch(AHare); ALion.Kill(AHare); AHare.Dead; ALion.Eat; ALion.Happy;
2.稳定——较小的需求变化不会导致系统结构大的改变
在软件开发过程中,需求的不稳定性是影响软件工程的一个非常重要的因素。社会在发展,用户的要求也在提高,软件开发人员不可能要求用户不进行任何需求变更。那么,如何面对这样的变更呢?面向对象技术的核心思想就是用稳定的元素将不稳定的元素封装起来,从而将变更的影响降到最低。在现实应用中,功能是最易变的,数据是较易变的,而对象则是较稳定的。为此,软件开发人员就用较稳定的对象将易变的功能和数据进行封装,从而保证了系统的稳定性。这好比一枚鸡蛋,因为有了蛋壳这层封装,蛋清(功能)和蛋黄(数据)才能够稳定存在。
3.复用——提高质量,降低成本
随着计算机应用的日益广泛,软件规模越来越庞大,开发人员如何能够快速、有效地构造软件呢?作为一种智力劳动,构造软件的过程并不是简单的加减法问题。一个人需要10个月时间才能够完成的工作,并不等同于10个人用一个月时间就完成了,此种情况下必须采用有效的方法才可能在一个月内完成。Borland公司创始人Philippe Kahn曾经说过:“软件开发组越大,组中每个成员的生产率就越低”,他还提出了这样一个公式:
该公式的含义:一个人一年单独能够编写15000行有效代码(Ln),但随着项目组的人数n的不断增加,其有效代码的数量会下降。由此可见,构造大型的软件不能仅靠堆人,而需要采取有效的方法——复用。LOC是Line of Code的缩写,即软件规模性代码行。
面向对象技术通过封装、继承、聚合等手段,提供了各种不同层次的复用(如基于类库、框架等的代码层复用,基于抽象、多态、模式等设计层的复用),开发人员应该可以切身体会到面向对象复用所带来的好处。例如Java开发者通过调用庞大的Java类库,可以快速实现很多业务功能,而不需要进行太多的编码。这种基于复用的开发方法极大地提高了软件的开发效率,也大大降低了软件开发的难度。
除了上面所提到的3个优势外,面向对象技术还有其他优势,如改善软件结构、提高软件灵活性、增加可扩展性、支持增量式开发、支持大型软件开发等。这些优势使面向对象技术得到了更广泛地应用。