面向对象技术的哲学思考_面向对象分析与设计论文

关于面向对象技术的哲学思考,本文主要内容关键词为:面向对象论文,哲学论文,技术论文,此文献不代表本站观点,内容供学术参考,文章仅供参考阅读下载。

60年代软件危机的出现,导致软件工程学的兴起和面向对象技术的应运而生。面向对象技术很好地解决了软件危机中所面临的如何实现软件IC和如何实现问题空间与方法空间在结构上一致性的两大难题。本文将从哲学的角度对此作一分析。

1 软件危机与面向对象

随着集成电路(IC)工艺的不断进步,计算机硬件取得了飞速发展。相对而言,计算机软件却发展缓慢。计算机软件所面临的难以开发、难以维护和难以重用等种种困难,被称为“软件危机”。产生软件危机的原因是多方面的,概括地讲,大致有四方面的原因:一是软件设计技巧和程序的个性化太强。在计算机发展的早期,硬件价格昂贵,机器运算慢,内存很小,程序员常常使用各种小技巧来减少对内存的需求,加快程序的执行。结果造成很多程序,让人难以读懂、难以理解,给软件维修造成困难。二是软件缺乏严格、统一的规范。软件设计在很长时间内大多是由个人独立完成的。由于每个程序员都有自己的一套符号和规则,彼此间很少了解,当软件量增大到必须由多个人共同完成时,各个人所编写的软件模块单独能够很好地运行,但合成一个整体时却由于缺乏严格统一的规范而常常出现多种问题。三是软件的重用性和软件IC问题。随着计算机的发展,软件越来越庞大,越来越复杂。程序员们发现他们常常在重复写一些以前写过的、至少是类似的代码,正由于这样造成了软件生产率极低。这促使人们想到:软件作为一种智力产品,也应该象硬件那样用工业化的方式开发和生产。最好能够实现象硬件集成电路那样的软插件(即软件IC),使得软件工程师也可以象硬件工程师搭硬件电路那样构造软件系统。为此,人们编写了大量的函数库,可是实践证明,在构造一个新系统时,除了一些接口十分简单的标准数学函数外,大部分库函数还是不可重用。四是语言鸿沟和语义断层问题。现代计算机都属于冯·诺依曼体系,诺依曼机所能理解的程序语言与人们的自然语言差距太大,这就造成它所求解的问题域结构与它所用的求解问题的解域结构的不一致。在系统分析阶段,系统开发者常常从计算机的角度了解用户需求,结果导致系统开发者和用户之间的通信存在大量障碍,分析容易出现偏差,使得软件开发的后续设计与实现建立在不正确的系统分析之上;另一方面,由于语义断层的存在,使得在传统的结构化系统分析、设计和实现各阶段之间必须进行复杂概念及表示符的语义转换,容易导致信息遗漏并增加了系统开发的难度。

软件危机导致了软件工程学的诞生。软件工程学较好地解决了前两个问题,但对后两个问题却无能为力。70年代以来,针对后两个问题,产生和发展了面向对象技术。面向对象的思想、方法和技术尽可能地模拟人的思维,追求解域与问题域结构间的近似和直接模拟,最大程度地消除了语义断层,已经显示出了其强大的生命力,被视为是传统软件工程方法摆脱困境的极有希望的突破口。

2 面向对象技术的方法、语言和程序设计

(1) 面向对象的方法学

面向对象的方法学认为:①客观世界是由各种对象组成的,任何事物都是一个对象,每个对象都有自己质的规定性和运动变化的规律,每个对象都属于某个对象“类”,都是该对象类的一个实例化元素。不同对象的组合及其相互作用就构成了我们要研究、分析和构造的客观系统。②通过分析和比较,可以发现对象间的相似性,即揭示出不同对象的共同属性。这就是构成对象类的根据。在按“类”、“子类”、“父类”等概念构成对象类的层次关系时,如不加特殊说明,则低层对象可以自然地继承较高一层对象的属性。③对于已分成类的各个对象,可以通过定义一组“方法”来说明该对象的功能,也就是允许作用于该对象上的各种操作。对象间的相互联系及其作用是通过传递“消息”来完成的,消息就是通知对象去完成一个允许作用于该对象上的操作。至于该对象将如何完成这个操作的细节,则是封装在相应的对象类的定义中的,对外是隐蔽的。

(2) 面向对象程序设计语言(OOP)

面向对象的程序设计语言主要有:Smalltalk 80、Eiffel、C++、objective-C等,它们除了具有计算机语言的一般特征外,还具有其它语言所没有的特征。这些特征主要是数据封装(对象)、继承和多态性。数据封装将一个数据和与这个数据有关的操作集合封装在一起,形成一个能动的实体,称为对象。用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象。正由于此,数据封装带有类似硬件集成电路(IC)的特征。硬件工程师在搭硬件电路时,不必知道集成电路芯片的功能是如何实现的,只需了解管脚功能与电特性。软件工程师也可以类似地在软件中加入封装好的对象,提高软件生产率和增强软件的重用性。继承是面向对象语言的另一重要概念。在客观世界中,普遍存在着一般和特殊的关系,继承将其模型化。在面向对象的语言中,“类”功能支持了一般与特殊的层次机制。除了根节点外,每个类都有自己的父类。除了叶节点外,每个类都有自己的子类。一个子类可以从它的父类那里继承所有的特性和行为(对应于语言中的数据和操作),这就扩充了它的特性和行为。父类抽象出共同特征,子类表达其差别。类的实例化就得到对象。有了类的层次结构和继承性,每个类的共同性质只需定义一次,用户就可以充分利用已有的类,符合软件重用的目标。所谓多态性,就是一个符号多种语义,或相同界面多种实现。让我们考虑多态性问题的一个类比实例。当汽车司机为避免撞车时刹车,他关心的是快速刹车(效果),而不关心刹车是鼓式刹车还是盘式刹车(实现方法的细节)。这里,刹车的使用与刹车的结构是分离的概念,可能有多种结构的刹车,它们的使用方法是相同的。相同的使用方法(相同界面)对应于不同种类的刹车结构(多种实现),这形象地反映了多态性的思想。面向对象语言中利用函数重载和虚函数机制模拟实现了客观世界中这种普遍存在的多态性。

(3) 面向对象的程序设计

面向对象的程序设计主要有以下三个步骤:首先是进行面向对象的分析(OOA--object oriented analysis),它的主要任务是了解问题域内该问题所涉及的对象,对象间的关系和作用(即操作),然后构造该问题的对象模型,力争这个“模型”能真实地反映出所要解决的“实质问题”。其次是进行面向对象的设计(OOD-object oriented design),即设计软件的对象模型。在分析的基础上,根据所应用的面向对象软件开发环境的功能强弱不等,对所构造的问题的对象模型作必要的改造(以最少改变原问题域内的对象模型为原则),以便在软件系统内设计各个对象、对象间的关系(如层次关系、继承关系等)、对象间的通信方式(如消息模式)等,总之是设计各个对象“应做些什么”。最后是面向对象的实现(OOI--object oriented implementation)。所谓实现即软件功能的实现,包括:每个对象的内功能的实现;确立对象哪一些处理能力应在哪些类中进行描述;确定并实现系统的界面、输出的形式及其它控制机理等。

3 面向对象技术在克服软件危机中的作用

面向对象技术由于自身特殊的思想和方法,它比较好地解决了软件危机中存在的后两个问题,为软件危机的彻底解决开辟了一条新道路。

首先是基本解决了软插件问题,即初步实现了软件IC。以前,人们为了解决软件重用问题,编写了大量的函数库,但是库函数所加工的数据是外部输入的而非内部固有的。这样,每当输入一定的数据时,其结构仍然需要程序员重新设计,因此软件的重用性还很差,远远达不到软插件的要求,软件的生产效率因此依然很低,而且常常还会造成其它一些问题。而在面向对象设计方法中,数据和对数据进行的函数操作是按不同的层次和类型、依照不同的联系和作用方式编好程序、自成模块并被封装在不同的对象中的。这样,每一个对象就相当于一个硬件IC单元,它有着明确的界面和隐蔽的实现,是外部功能与内在结构的统一体。作为对象,它其实就是一个软件IC单元。可见,面向对象的设计从理论和实践两方面都基本实现了软件IC,解决了软插件的难题,尽管这种IC其集成度还不高。软件IC的设计由于实现了外部功能与内部结构的稳态联系和内外分离,结构就避免了以往程序设计中的错误操作,提高了软件的稳定性和可靠性,使软件的使用、维修大为方便,从而大大提高了软件的重用性和通用性。

其次是比较好地解决了语义断层问题。以前我们用于分析、设计和实现一个系统的过程和方法大部分是“瀑布”型的,即后一步是实现前一步所提出的要求,或者是进一步发展前一步所得出的结果。因此,当越接近系统设计(或实现)的后期时,如要对系统设计(或实现)的前期结果作修改就越困难了。同时也只有在系统设计的后期才能发现在前期所铸成的一些差错。当这个系统越大、越复杂时,由于这种对系统的认识过程和对系统的设计(或实现)过程不一致所引起的困扰也就越大。而面向对象的设计方法,从设计工作的一开始就设法用多个对象来构造所要设计的系统,力求使问题域空间与解域空间相一致(如下图所示)。

设计过程是一个对所要实现的系统不断认识和逐步优化的过程。在面向对象的设计中,随着对系统认识的深入、全面和准确,程序员可以根据需要自由地选择对象,从而构造模拟系统,以尽可能地逼真映射出客观事物的内在联系和本质属性。这样一来,就既不会因为前期对系统认识的偏差而不可逆转地影响后期工作,又较好地解决了以往设计中的语义断层问题。可见,面向对象的设计与以往的设计有很大不同。在面向对象的设计过程中,程序员的任务主要是正确认识所要设计的系统,并借助“对象”概念为这个系统建立起与客观事物尽可能一致的模型。因此,它可以较好地解决问题域空间与解域空间不一致的问题。由于解域与问题域结构的一致,不仅在系统分析阶段使用户和开发者之间的通信障碍大为减少,而且避免了它在系统分析、设计和实现三个阶段之间复杂的语义转换,从而降低了软件开发的难度和成本,提高了软件的质量和生产率。

4 面向对象技术的根据和意义

面向对象技术之所以能够较好地解决上述两大难题,从哲学的角度看,它比较真实地模拟了客观事物的固有结构和层次关系,符合人类认识事物的一般规律。首先,从人们认知事物的思维机制来看,面向对象技术容抽象思维与形象思维于一身,即达到了对象抽象,大大地发展了计算机程序语言,使人的心智思维过程比较真实地对象化在计算机的程序设计和语言之中。人的认识过程本来就是从特殊到一般又从一般到特殊的不断反复过程,是归纳过程和演绎过程的交互统一。面向对象技术提供了“对象”、“类”、“继承”、“封装”、“多态”等机制。这样,从其设计方法、内部构造和实际运行过程来看,面向对象技术综合利用了从特殊到一般和从一般到特殊的思维方法,使抽象思维的逻辑方法始终贯穿和实现于“对象”的设计与实现之中。与此同时,作为结果,“对象”又是具体的,是内实现与外界面、隐结构与显功能的统一体。它以具有特定功能的软件IC个体直接给予用户和使用者。这样,建立在抽象思维基础上的软件IC产品,从设计的一开始就以直观、形象的个体为目标,即以“对象”为目标。而这正是面向对象技术优越于其它设计的根本区别所在,也是实现软件IC从而解决软件危机的关键性思想所在。可见,形象思维又构成面向对象技术的真正的出发点。

其次,由于面向对象技术是以“对象”为目标的,它一改传统的以“过程”为中心的设计方法,大大提高了软件的稳定性、可靠性和重用性。以往大量的手工编程、浩如烟海的数据库等都是从“过程”入手的,都以“过程”作为解决问题的突破口,即以“过程”为中心;而面向对象技术是直接面向“对象”的,是以“对象”作为解决问题的基石和突破口的,即以“对象”为中心。从哲学的角度看,与对象相比较,过程是不稳定的、多变的和易逝的,而对象则相对要稳定得多、可靠得多。因为说到底,对象是过程的载体,是它的基石。因此,以过程为中心的软件设计其稳定性、可靠性和重用性必然较差,而以对象为中心的软件设计,其主体结构则相对要稳定得多,它的可靠性和重用性因此也就要高得多。

再次,从内部结构和思想方法上来看,面向对象技术由于较好地实现了“对象”与“过程”的有机结合,所以,它真实地模拟了客观事物的固有结构和层次关系,为面向对象技术解决软件危机奠定了客观基础。在向向对象的设计中,对象的构成本身就是一个结构与功能、界面与实现的统一体。所以,它本身就是“对象”与“过程”的统一。易言之,从外部形象和直接使用上看,它是一个具体对象,而它的内部结构和实际运作却是一个具体过程。从哲学的角度看,对象是凝结着的过程,过程则是展开了的对象。所以说,面向对象技术的“对象”并不是一个黑箱式的“纯对象”,而是对象与过程的辩证统一。可见,它克服了以往仅以过程为中心的各种操作的弊端和局限性。建立在这种对象基础上的面向对象设计,它在制作“对象”时,其实就是将某种过程对象化;它在用对象组合系统以构造复杂事物的模型时,其实就是在建构客观事物的模拟系统。而建立模拟系统的过程又是以不同的对象为元素建构大对象(系统)的过程,这个过程有赖于各元素之间耦合关系(即不同操作)的建立。这其实就是某种新联系的建立和新过程的对象化。可见,以对象为中心和基础、用对象建构系统进而建立更大的系统的做法是面向对象技术的思想和方法所固有的。这样,面向对象技术就把对象与过程、结构与功能、层次与系统有机地结合起来、统一起来了。它建立对象、构造软件IC的过程就比较真实地模拟了客观事物的结构和层次关系,遵循和反映了自然界物质构成的系统层次律,为人们认识和再现物质世界提供了正确有效的途径和工具。因为物质世界本身就是层次与系统、事物的集合体与过程的集合体的辩证统一。可以说,这构成面向对象技术成功地解决软件危机的客观基础和哲学依据。

从哲学的角度看,面向对象技术的初步成功给我们的启示是多方面的和深刻的。

第一,面向对象技术初步实现了软件IC,使软件开发在自然化的道路上迈出了重要一步,为计算机语言的发展和软件危机的彻底克服指明了方向和道路。软件IC插件的实现,开了计算机软件“硬件化”的先河,从而大大提高了软件的稳定性、可靠性和重用性。作为一个“对象”,它其实就是客观事物及其过程的具体模拟,是客观世界某个层次的具体事物及其过程的对象化。所以说,软件“硬件化”的过程,也是软件客观化的过程。亦即,在一定程度上,它已经是转化为软件形式而存在着的自然事物和过程。这是面向对象技术在软件自然化道路上所迈出的重要一步,它构成软件所以能够是硬件化的客观依据,也是面向对象技术所以能够有效克服软件危机的实质所在。这启示我们,要彻底克服软件危机,计算机软件的发展就必须坚定不移地走不断自然化的道路。面向对象技术因此为计算机语言的发展和软件危机的克服指明了方向和道路。

第二,面向对象技术揭示了软件危机的实质。软件危机的表现形式是多种多样的,但从哲学的角度看,任何一个软件作为智力产品,都是人们认识事物的手段和工具,具有“方法”的性质。软件的生产过程就是人的认识方法形式化、对象化的过程。只有当人的认识方法正确表征和顺应了客观事物及其过程,符合客观世界的真实过程和规律时,这种方法的对象化、物质化才是可行的(工具的生产、科研仪器的制造等就是这样)。这种物质化的结果——软件,它的稳定性、通用性、重用性才是有保障的。否则,就是不可行的。面向对象技术通过软件的自然化克服软件危机的事实向我们昭明:以往软件不能大量生产、不能通用、不能重用的本质原因在于,作为方法的软件系统中的主观性因素太多。这就是软件危机的深层实质。由此可见,克服软件危机的过程,其实就是改进人们认识事物的方法的过程,是人的认识方法不断客观化、自然化、系统化的过程。

第三,面向对象技术的发展深化了主客体之间的关系,丰富和发展了辩证唯物主义的认识论。软件作为人类认识事物的方法和工具,它无疑是人和自然之间、主体和客体之间的中介。一方面,它是自然事物即客体的模拟物,是客观事物及过程的一定程度上的形式化和对象化;另一方面,它又是主体认识方法和思维过程的形式化,是主体思维过程的一定程度的对象化。人们借助于它认识事物、建构客体的过程,既是客观事物及其过程不断形式化的过程(其目的是与人的思维形式和机制相对接);也是人的认识方法不断客观化的过程(其目的是与事物的客观内容相一致)。换句话说,就是客体通过形式化进入主体和主体通过对象化深入客体的两个过程的交互统一。面向对象技术由于实现了软件IC、较好地克服了软件危机,提高了软件系统的功能,所以它加速了人们认识事物的进程,深化了主客体之间的关系。面向对象技术向我们表明,深化主客体之间的关系,提高主体的认识能力,其唯一正确的途径就是不断加速实现软件的自然化和系统化。这就是面向对象技术所启示给我们的客体走进主体、主体长入客体的方法论结论,也是一条重要的认识论结论。

标签:;  ;  ;  ;  ;  ;  ;  

面向对象技术的哲学思考_面向对象分析与设计论文
下载Doc文档

猜你喜欢