面向对象程序设计方法的本质和局限

          随着Visual Studio.net的出现,网络编程也实现了面向对象的程序设计方法,这样,面向对象程序设计方法成为新世际的编程方法主流。这种方法为编程工作带来了极高的效率,并且入门容易。但与此同时,人们容易忽视这样一个事实,这种方法并不提供真正的创新的手段,可以说一般的编程人员只是被动的跟着技术的进步他们做的只是学习和一些非创造性的重复劳动(多是些拼凑的工作)。因为这一点,我想从哲学的角度去分析面向对象程序设计方法的本质和局限是有益的.
 
        对于编程技术不是很熟悉的人会认为面向过程和面向对象这两种编程方法有什么根本的不同,其实这是一种误解,编程技术的发展只是硬件适应性的提高,程序模块化而带来的可重复利用的程序段的积累,以及算法的改进等方面的结果,所谓面向过程和面向对象只是表达这种发展阶段的情况而已。
        面向过程的编程方法表达了这么一种情况,我们在可用的资源和工具的基础上为实现一个即定的结果,需要进行一步步的工作。如同我们利用铅笔要画出一幅素抄作品只是不断的在纸上画出线条的过程而已,其结果的好坏就在于过程的安排。计算机编程说到底是面向过程的,比如我们利用机器码开发程序,最后的可供用户利用的程序只是通过二进制数(事实上就是两种信号)编写信息代码,编写存储代码,编写调入内存代码和信息间互相调用的代码这些过程的结果。那么什么是面向对象呢?比如现在市场上卖的有1000片的拼图板,这种游戏就是面向对象的,我们不需要制作或画出每一张卡片,而只需要把每张卡片放在恰当的位置。对于计算机编程而言,现在的许多编程工具都是面向对象的,也就是说都提供现成的类或控件或动态链接库等以供调用,而对这些类或控件的真正代码构成可以不知道(有些也是无法知道)。但事实上这么些可供利用的类、控件、函数(.h)等都是以前面向过程编程的结果,可以说现在的对象就是以前的成功了的过程。
        那么面向对象编程方法有些什么好处呢?值得注目的有三点:简化了编程工作,因为有很多现成的代码可供利用,从而工作效率得到了很大的提高。划分开程序员的工作档次。有些有能力的程序员可以直接开发类和控件(注意!一定是包含了成功的过程),并且由于面向对象的编程方法使他能够保护自己的知识产权;而事实上面向对象的编程方法使很多的非专业训练的人士也可以介入编程活动,这样也降低了为培养程序员而要付出的庞大的开支。最后,由于编程工作的简单化和编出的应用程序的美观易用性(基于大的软件公司的软件制作套路),使得开发编程软件的厂商获得巨大的利润及提高其知名度。但应该强调的是面向过程的方法永远都是编程的根本(事实上除非直接操纵机器语言,在一定程度下,所有的编程语言,如C,Pascal,Basic,Fortran等,甚至汇编语言都有面向对象的成份,这时对象表现为宏或函数等)。
        本文主要是讲述关于面向对象编程方法的一些问题,那么在说清楚面向对象的编程方法和面向过程的编程方法之间的联系和区别之后,我想就应该进入正题了。
        面向对象程序设计(Object Oriented Programming, OOP)的定义是这样的:就是指一个基于定义明确的设计模型开发一条或者许多条程序指令的过程。这个设计模型可以形象化的表现为对象的不同方面、这些对象的类(从类中派生出函数)、属性变量、以及对象相互间的交互作用[1]。
        以Visual Basic的面向对象方法为例来说明上述定义。所谓设计模型就是指对需要编程的事实分析出完成该事实所需要的动作或操作及这些动作或操作施加其上的实体要素。这些实体要素表达为界面要素,包括静态的和动态产生的对象(如控件)。对于一个VB对象来说有属性、事件和方法三方面内容。属性就是指该对象实例(一个对象事实上可以看作有诸多返回值和可调用的函数及过程的代码体,其在编程中的具体实现被称为对象的实例)在外观上和同其它对象的联系上的一些规定,而事件则是这些对象对操作者动作如键盘、鼠标的动作及某动作完成后的动作的反映,方法则是对该控件所拥有的某种功能的调用。理解了这些,那么就容易理解在编程前做出完整的规划的重要性。
        首先是需求分析。这一步的关键在于把需求概念化,过程化。举个例子,考察一个银行工作人员的事务处理过程应该是这样的:为客户建帐户或打开帐户,接受存取款,记录,关闭该帐户。根据上述汇集来的需求,进而构造分析模型,即构造类,比如上述需求模型所期待的应用程序的用户(即那个银行工作人员)将同系统本身有交互行为,比如客户端软件需要同服务器相联系,要确定使用权等,这方面问题构成用户接口类;而对帐户所做的所有处理构成帐户类;最后这些处理完成后工作人员该决定这些处理是否保存,是否转移等等问题,而这些构成管理类。这样就完成了分析模型的构造。进一步确定编程中所采用的对象或控件,并进而确定其上响应的事件,这就是设计模型上的事了。注意这一过程中实际上就是一些现实动作的概念再机器化,动词变化为事件,名词变化为对象。(关键名词实际构成了行动者或者说类的一个候选清单,而动词清单则提供了一份由行动者完成的事务处理,或者作为候选类的成员的方法的候选清单[2])看来面向对象程序设计的方法实质上是将物质的现实转化为意识的现实,这种转化是能动的,因为计算机介入的管理将大大改善原先的人的普通管理。
        这个阶段完成之后就是具体的编程过程。合理的模块分配和正确的代码就是这时的关键问题了。
        从面向对象程序设计过程的实施可以看出,这种方法的本质无非基于这样一个事实:对于人的可以造成外界反应的行为,我们总可以描述成一些句子,这些句子的关键是其中的名词和动词,而这些词的机器内容则是读、写、改、删、保存等动作。而这一事实也说明哲学通过概念去认识世界是合理的,因为的确我们可以利用概念再现我们所认识的世界。当然我们不能忽视这样一个问题——机器化的概念是描述表达完整的行为的有效手段,而对于如亚里士多德所说潜能之类的东西并不能化为可操作的概念,即编程所实现的是一种必然性而不是可能性。另外就是编程不表达行为的原因,只是后果。比如说我们所编程化的一件事务为什么发生,不在编程所考虑的范围内。最后编程化的事务所蕴涵的规律可能或必须要求新的分析手段。比如需要考察一年来的银行业务情况,就不是仅仅由于收集了这么些数据就可以完成的,而是需要对这些数据利用现有的或创造的数学工具进行合理的分析。
        计划代码(书写伪代码)是编程工作的一个重要步骤。我们知道面向过程编程方法的这一步是使用流程图语言来编写的,其中包括过程语句,控制语句,说明语句和I/O语句的书写[3]。但对于面向对象的编程方法从总体上而言不是这样的,这里的核心内容是类之间的消息传送。消息包括用户的操作和操作后造成类的响应,实质上是一些参数在不同类之间传送。因为这一点,我们应该这样来进行伪代码的书写,根据用户可能的操作确定对象,再确定对象之间应该传递的消息,然后再分模块考虑实现这些消息的方法,这时可能就要用到流程图了。
好,接下来我们就进入面向对象编程方法的内部。
        先给出一个例子。我们要在程序设计软件中提供给编程者一个控件,比如一个按钮,我们该做哪些事呢?假若我们是利用C语言来编写这个控件,我们所该做的事,首先利用图形函数做出按钮的图形;再在其中(坐标范围)设置一些事件类,如响应鼠标事件的类,这是一些不完整的代码体,事实上提供了与其它对象的一个接口,我们可以在使用这个控件的程序中为这些事件添加一些具体的功能代码,如一个计算用的函数,或与其它控件实现联系的代码;再实现一些方法类,这是一些完整的可实现的代码体,如卸载窗体。学习过编程的同志可能都知道类,成员,数据封装,继承是面向对象编程技术的关键概念。在这我不会去说它们的基本语法,而只是将其概念含义弄清楚,以便分析它们的本质。
        编写类是一种完成对象设计的方式,而成员是类中为实现一定功能所确定的变量和函数的统一代码体,而这又是利用数据封装技术的。所谓数据封装是指将类的成员按其使用和存取方式进行分类。如在C++中类成员分为Private、Public、Protected三种,与之对应的访问者分别为类本身的成员函数、一般函数和派生类中的成员函数,即它们分别表达为与其它类中相应成员的调用关系。其中对象的属性可以由一些成员函数的返回值来确定,而事件则可以是返回的一些函数。最后方法则有完整功能的成员函数。继承是指在不改动某类原程序的基础上以一种被称为派生类的类对这个类(因为其被继承,所以称之为基类)进行扩充的方法,在继承中派生类要说明其对基类的访问权限(同于成员类的类型),而这一权限的设定将改变对这一派生类的再次继承中的原基类的成员函数种类。这种技术将做到对原有基类功能的继承,又使原有程序中的不能满足需要的部分得以增强[4]。
        由上可知面向对象的编程思路的优势关键在于减少了编程人员的工作量。事实上还有对硬件及系统的依赖的屏蔽也是很重要的优势,同时也是形成面象对象编程的出发点。对于任何高级语言编出的程序都要经过编译成为机器可识别的二进制数(为了实现特定动作的二进制数对每种机器来说一般是不一样的)才能真正运行使用,而且高级语言的编写也需要有操作系统的支持。如果对这些不同的硬件设备、操作系统的代码适应都需要在编写的程序中反映出来,那么程序员会觉得很痛苦,而且这样的程序的移植性也差。面向对象的程序设计方法很好的改变了这一情况,因为在这种方法下对于编程来说的诸多的不同都封装在类中(可设想成一个映射表),在程序员进行编程工作时,他不必考虑这些细节,事实上他的底层工作只是要学会对MAPI或Windows API的调用[5],也就是说这些Windows的应用程序接口(Application Programming Interface,API)帮编程人员解决掉了一些更为底层的工作。
        日前微软公司出品的Visual Studio.net更是把面向对象的编程方法使用的淋漓尽致。这个工具支持同一工程平台下的代码的通用,即无论你是用VB,还是VC,还是ASP,JAVA等脚本语言,还是混合着用,你都可以很好的完成任务。事实上这也就扩大了程序员的合作范围,使工作中的专家级合作变的更为容易。
面向对象编程方法的本质就是对长期编程工作中的成绩的选择和继承,并在程序设计中形式化,即尽量把所要赋值的参数和所需调用的过程或函数交给程序员去做。用一句话说面向对象编程就是没有现实内容的形式化代码体的现实化的过程。由于派生类的存在决定了类是可以改造的,当然这一改造的实施还是要求程序员熟悉面向过程的编程方法。由于包括面向机器、面向过程、面向问题到面向对象这诸多编程方法更多是继承和发展的关系,所以我们想评价面向对象编程方法的优缺点只能基于程序员的使用,而这种评价的结果将创造编程方法的未来。我们拿C语言来说,在使用面向过程的编程方法时,程序员需要掌握众多的库函数,及相应的包含这些库函数的头文件,那么在编程过程中运用正确的语法和逻辑就可以完成所要求的任务,而运用面向对象的编程方法时,不但要掌握上述的内容,还需要记忆大量的类,包括其类名及功能,虽然事实上这些类无非是一些更基本的技术(如函数)的使用的结果。正如音乐事实上是一些音符的横向和纵向的组合而产生的效果,但对于学习音乐的人来说学习和声和和声的连接是重要的,这里的和声也就是音的纵向组合,这样和声就相当于计算机编程中的类的概念。从这就能看出,面向对象的编程方法更多的是要求编程者的记忆力,事实上假设有10个函数,对这10个函数做自由组合就有210-1,即1023个结果,这相对于10而言是个极大的数,而对于记忆来说就更沉重。这样虽然面向对象使工作进行时的工作量减少,而实际上这些工作量转移到编程人员自己的学习时间中了。另外,选择也是一个很大的问题,比如说诸多的类或控件提供大同小异的功能,那么如果要加以选择,就需要在具体使用过程中考察它们的功能和比较它们的不同,这样就要把这多种备用的类或控件的操作和性能知识都学习一遍,可见浪费的工作量是可观的。而由此而来的另一种情况也值得注目,这就是比如说在面向过程时代,少数几本书就能把编程工作说的很清楚,而在面向对象的时代,学习用书就要包括类或控件的使用说明,类的制作,类的背景知识和浩如烟海的例子,第三方控件。我们知道微软的编程工具一般都提供MSDN的帮助,这种帮助是有益的,但这种帮助并不适合于初学者和对编程工作本身的性质还不清楚的人,这种帮助实际上的作用是帮助专家记忆,即对已经有相当经验的人提供快速的资料检索,在这种情况下,专家就不必对所需知识的众多细节加以记忆了,但这其实暗示了只能对已有知识特别是已经了解其形式及功能的知识作查询。或者说计算机的帮助系统不能帮助你找到你所希望具有某种功能或将用于什么任务的知识。如果你想找到它,你就要确实知道你所想知道的知识的关键词,而且也只需要知道这些就行了;结果你得到的是什么呢?就是该知识的语法和功能。这对于真实的工作而言是一个颠倒的过程。
        总结一下,面向对象的编程方法的主要局限在于爆炸式的记忆量和寻求帮助的非智能化。由些可见,面向对象的编程方法的未来将往更加智能化的方向发展。由于编程方面的知识和成果必然爆炸式的增加,想消除这种情况是不可能的,而只有智能化的管理才是面对这一情况的可行方法。这种智能化主要是指程序员甚至可以使用自然语言寻求帮助甚至编写程序。现在我们不妨设想一下这一技术。由于程序设计最终是面向应用的,而这种应用到最终的机器实现要通过这几级概念体系:工作本身的实施概念,编程所需的模型化概念,高级语言实现时为对象所起的名子。如果这些概念体系能够足够规范化的话,就可以利用如同数据库的数据字典的技术把这些概念的对应关系搞清楚并在计算机上实现之,就完成了编程的智能化。
 

Abstract: Along with the emergence of Visual Studio.Net, Network programming also make its OOP method to be fact. Like this, OOP become the main current of the programming method in the new century. This method is extremely efficient and easy to learn. Nonetheless, people easily neglect such a fact that the method can’t provide the creative means, that is, ordinary programmers are just passive to learn and do some repetitions (mostly piecing work). As to this point, I will analyze OOP from the philosophy's angle and it is beneficial to understand the essence and limitation of OOP by this way.

Key words: Object Oriented Programming , Essence , Future


2002年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值