抽象技术与面向对象程序设计教学

时间:2022-07-06 09:13:34

抽象技术与面向对象程序设计教学

摘要:抽象技术是人类理解和解决复杂问题最重要的工具之一,更是面向对象程序设计中应用最广泛的原则之一。本文介绍了抽象的概念、抽象层次的划分以及两种典型的抽象方法,并从抽象这个较高层次来理解面向对象技术的主要思想:类、对象、封装、继承和多态,等等。

关键词:抽象;抽象层次;面向对象技术

中图分类号:G642 文献标识码:B

面向对象技术是当今最流行的软件系统设计和开发技术,从80年代产生到现在短短30年间,面向对象技术已经在计算机的方方面面得到了成功的应用并吸引了越来越多的人在软件设计和开发中学习和使用这种技术。学生在学习面向对象技术时往往从面向对象程序设计语言出发(比如C++,JAVA等)入手,在程序语言语法学习中理解面向对象概念,导致在学习过程中,学生往往过多地纠缠于程序设计语言的语法规则等细节方面,而省略了对面向对象技术本质思想的领会。抽象技术是人类在实际生活中理解和解决复杂问题最重要的技术之一,抽象思维更是一个程序员必不可少的素质。面向对象技术正是利用抽象技术,通过抽象层次分类方法达到自上而下地对复杂问题进行逐步求精和模块化,把问题分解为人们可以理解和分析的不同规模。所以,从抽象的角度(本文从抽象的概念、抽象的层次和抽象的方法三个方面)来介绍和分析面向对象技术的主要思想,能够帮助面向对象技术学习者从一个比较高的层次来理解面向对象的主要思想,从而避免被编程语言的语法细节所牵绊,真正掌握这种技术的精髓所在。

1抽象的概念

抽象是指对于一个事物或过程的某些细节有目的的隐藏,通过省略某些信息来把事物的主要结构表达得更加清楚。举个例子来说,当你打开一本世界地图册,首先你会看到一张世界地图,这张世界地图描述了一些简单的地理区域(比如7大洲,4大洋),以及一些主要山脉、河流、国家和首都城市。在这张地图上,通过省略详细的地理信息(比如某个村庄的地理位置)而让人们可以了解整个世界的主要区域分布;接着当你打开一张更小区域的地图时(比如一个国家),你就能到更多的地理细节,包括这个国家的许多大中型城市,主要的道路,山脉、湖泊等等,但是却只能看到本区域的信息,而不能看到别的区域信息了;以此类推,当你打开更小区域的地图时,得到的细节信息就更多,也更加详细,但是信息的范围却越来越小。通过这个例子,我们可以看到,在实际生活中我们总是不知不觉地运用了抽象思维来看问题和解决问题,每张地图都是人们对某一个地理范围的一种抽象,而且抽象是分级别的,在每一个级别水平上都会包括某些特定的信息,而省略某些其他的信息,使得我们在这个抽象级别上理解和解决某些问题变的非常容易。人类吸收和处理信息的能力是有限的,抽象技术通过省略一些细节信息来缩减信息量以达到人类处理问题的水平。

在程序设计技术中,也需要把复杂的现实问题抽象成能够处理的形式,在面向对象技术中,有另外一个术语来描述抽象这种有意识隐藏细节的行为:信息隐藏(或者叫封装)。所谓信息隐藏就是指在系统设计开发过程中,有目的地省略细节,而集中精力在实际问题的几个主要特征上。这样,在整个系统的设计开发过程中,系统设计人员才不会被大量的细节所干扰,从而把精力放在整个系统的主要框架上。那么什么时候考虑细节问题呢?其实抽象概念的运用是分层次的,越高级别的抽象往往隐藏的信息越多,抽象层次则越低,描述的细节信息越丰富。在实际的面向对象程序设计和开发中,程序员非常重要的一项工作就是确定自己在哪个抽象级别上工作,这样,你就非常清楚自己的应该做些什么,不应该做什么(即省略什么)。在现实情况中,经常出现的错误却是程序员总是在最低抽象级别上反复思考,关心各种关键细节的实现,而不是努力的思考如何实现高级别的抽象,来促使任务各个部分尽可能的分离,这才是最重要的。

2抽象的层次和抽象方法

前面提到在处理复杂问题时,需要利用抽象方法,并且划分抽象层次,才能在正确的抽象级别上考虑和解决问题。如何对一个复杂事物或过程进行抽象以及划分抽象层次?有两种抽象方法在面向对象程序设计和开发中得到了广泛的应用。

2.1组合抽象方法

组合抽象方法是人们在现实生活中经常用到的一种抽象方法。具体地说,人们在抽象一个事物或者过程时,通常会分析这个事物或过程是由哪些部分组合而成,然后依次检查和分析每一个组成部分来得到对事物更精细的理解。这种抽象方法也是通常所说的“分而治之”思想的一种具体体现。举个例子来说,如果我们要理解和分析计算机是如何进行计算的?组合抽象方法首先分析计算机由哪些部分组成:CPU(指令计算)、内存(数据存储)、总线(数据传输)、输入输出设备(数据的输入输出)。这样我们就很容易地得到了一个计算机的抽象模型(如图1所示)。显然这个抽象模型并不能代表一台真正的计算机,真正的计算机远远比这个模型复杂的多。但是,一般情况下,通过这个抽象模型我们可以来解释计算机的计算过程,即:计算机通过外部设备得到输入数据,然后存储到内存中,CPU从内存中取数据和指令进行计算,并把结果存储到内存,输出设备再把结果从内存中读出并显示,其中数据的传输通过总线进行。

如果想进一步了解CPU的工作过程呢?在这个抽象模型层次是没有办法做到的,我们需要更加详细的抽象模型层次。方法就是对计算机的每个组成部分同样用组合抽象方法做更详细地分析从而形成抽象的下一个层次,比如CPU由运算器,寄存器和控制器组成,总线由系统总线、数据总线和地址总线组成,等等。这样,对计算机的抽象模型就变得更加详细,在这个层次上,人们可以进一步解释CPU的运算过程。如果需要,我们还可以一直往下通过组合法划分更加详细的抽象层次,甚至分析到集成电路结构,研究分子结构、电子结构,等等。当然,对问题的任何解释和描述我们都要基于某个正确抽象层次,这样才能使得人们接受到的信息量比较适合,也比较容易理解(比如想要理解计算机的工作原理,我们最好在最高抽象层来解释,如果放在电子层来解释,人们是没有办法接收和理解的)。

组合抽象方法在面向对象程序设计中使用起来非常容易和直接,大到一个系统,小到一个类的设计,我们通常会分析这个系统或类由哪些部分组合而成来建立相应的抽象模型,然后递归的分析每个组成部分以达到逐步求精的目的。使用这种方法能够很容易实现系统的封装性和可扩展性。使用组合抽象技术,系统设计者很容易将一个大系统分成几个部分,将每个部分单独的分配给不同的小组。每个部分的设计者需要对本组承担的工作对外进行良好的封装,而对内进行非常详细的理解和设计。在面向对象设计中,通常使用“接口”和“实现”这两个术语来描述这两种情况,“接口”描述系统被设计用来做什么,这是进行信息封装非常重要的一点,“实现”包含具体怎么做。组合抽象技术也可以很好的实现系统扩展性,当程序设计者把一个系统分成各个部分时,理想情况下可以将各个部分之间的相互作用减少到最少。这样,当系统的一部分需要修改时,就不会影响到其他部分运行。

2.2分类层次抽象方法

分类抽象是另外一种人们应用非常广泛的抽象方法,早在2000多年前,古希腊哲学家亚里士多德就用分类的方法来对所有生物进行抽象(如图2所示)。这种方法把生物首先分成动物和植物,动物又分成脊椎动物和无脊椎动物,脊椎动物又包括了哺乳动物,哺乳动物又具体包括猫、狗、鲸鱼,等等。分类层次抽象不同于组合抽象的重要区别是:抽象层次越高,事物的特征越普遍,而抽象层次越低,事物的特征越具体;高层次抽象事物的特征和行为,可以直接应用到比它低的抽象层次的事物上去。比如,我们知道哺乳动物具有毛发,通过胚胎生育,这些特征可以毫无保留的应用到比哺乳动物更低的分类抽象层次上(比如:猫、狗也具备这些特征)。

在面向对象程序设计中,分类层次抽象方法有着非常重要的应用,面向对象程序设计中的继承机制充分利用了分类层次抽象中较低层次的抽象类型自动具备了较高层次抽象类型的所有特征而不需要重新定义和说明的这个最重要的特点,使得新的类可以从已有的类继承而来,从而自动具备了已有类的所有特性和行为,很好的解决了软件设计中代码复用和概念复用的问题,极大的提高了软件开发的效率。我们来看个例子:Java的AWT(Abstract Windowing Toolkit)库设计。在这个库中,设计者就是根据分类层次抽象方法组织了所有的AWT图形用户界面组件类,如图3:

从图3中我们可以看到,层次越高,特征越具有一般性,层次越低,特征越个别化。层次比较高的类的数据和方法可以通过继承的方式,直接被下层组件类所使用,从而大大简化了组件的设计,提高了效率。比如Component类中的特征和方法:(1)组件的颜色(2)组件的字体(3)组件的大小和位置(4)组件的激活与可见性(5)组件上的光标(6)paint方法和repaint方法非常普遍,只要处在Component下面的分类抽象层次中的组件都具备这些特征,它们都可以通过继承的方法直接把Component类中设计的特征和功能变成自己类的一部分。当然,具体的组件类除了继承祖先的特征和方法,还有一些自己特有的东西,比如:TextField组件类除了TextComponet类和Component类中定义

的特征外,还有自己专有的特征:SetText(),等等,这些特性在别的组件类型就不一定有了。

3总结

抽象技术通过舍弃个体事物在细节上的差异,抽取其共同特征而得到事物的抽象概念,它是面向对象方法中使用最广泛的原则之一。通过抽象的概念和方法来理解面向对象的主要思想可以帮助人们更好的理解面向对象技术,培养抽象思维,使用面向对象原则来进行软件的设计和开发。

参考文献:

[1] Timothy A.Budd. 面向对象编程导论[M]. 黄明军,李桂杰,译. 北京:机械工业出版社,2003.

[2] 周之英. 现代软件工程(第二册)[M]. 北京:科学出版社,2003.

[3] 杨大军,张鸣. 并发面向对象程序设计语言研究与发展[J]. 计算机研究与发展,1998,35(9).

[4] Timothy C.Lethbridge, Robert Laganiere. 面向对象软件工程[M]. 张红光,温遇华,译. 北京:机械工业出版社,2003.

[5] 邵维忠,杨芙清. 面向对象的系统设计[M]. 北京:清华大学出版社,2003.

上一篇:基于教学实践本质的一体化实践教学体系构建与... 下一篇:人文外语类计算机课程体系设置调查研究报告