Programming 版 (精华区)
发信人: zhangyan (生命中不能承受之弱), 信区: Programming
标 题: 我的面向对象程序观
发信站: 哈工大紫丁香 (2001年07月09日15:14:11 星期一), 站内信件
我的面向对象程序观
关键字:
OOP,java,c++ 贴文时间
2001-7-8 2:46:04 文章类型:
原作 给贴子投票
投票
agentmulder 原作 出处:
/**
* Title: 我的面向对象程序观
* Description: 描述我对面向对象的一些理解,思想上并不成熟,文章随时都在
更新,希望大家都来参与讨论
* Copyright: Copyright (c) 2001
* Company: Matrixfox
* @author 莫特探员
* @version 本文章还在继续更新中。
*/
我的面向对象程序观
1)面向对象概念的一些误解
“面向对象”是一个如今被人叫烂的词汇,就像去年人们都喜欢把自己的公司打上
“.com”的标记一样。其实有多少人能真正理解这个词汇呢,很难说。我喜欢这样
来比喻人们对“对象”一词的滥用。“对象”就好比人们经常说的“酷”和“爽”
,很多人并不仔细考虑这两个词的差别,在很多情况下他们是通用的,“酷”和“
爽”通常表达“心情不错”的意思,你可以在你玩的高兴的时候,大声的叫嚷“太
酷了,太爽了”,这个时候两个词汇是通用的。但是你可以说“这个人很酷啊”,
但是你不能说“这个人很爽啊”。人们对“对象”这个词汇的滥用就发生在这里,
“面向对象”和“基于对象”就好比“酷”和“爽”,这是两个不同的概念,但是
人们通常将这两个词汇混为一谈,一律用“面向对象”来表达。常见的错误可以在
此列举一些:
1)有个人兴高采烈的和你说“我不喜欢 flash 4 的脚本语言,flash 5 版本的
action script 采用了新的面向对象的“.”语法,写起来很舒服。我现在一直用
flash 5 来做东西。”(同样的话语也发生在 director 的 lingo 脚本语言中)
2)visual basic 采用了面向对象的属性和方法,比起过去的 basic 语言有了很
大的提高。
3)javascript 是面向对象的。
等等。
通常听到类似的话,你都要认真审视说话之人,分析他说的话。可以肯定一点,他
并非真正懂得什么是面向对象的思想。很多人没有区分“面向对象”和“基于对象
”两个不同的概念。面向对象的三大特点(封装,继承,多态)却一不可,通常“
基于对象”使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生
新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型
的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术
都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性
。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。
所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加
以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实
现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。
2)java 比 C++ 在贯彻面向对象的思想方面更加彻底。
我最近上的学习班的老师对我说:“C++ 是打着面向对象的幌子,干着过程编程的
勾当”,这句话我非常的赞同,而且我一直以来也是这么认为的。但是仔细听他讲
解后,我才发现,我是只是理解了这句话前两层的意思。但是还有一层意思我没有
理解。你可能要问,“难道 C++ 不是面向对象的吗?”。事实上 C++ 是真正的面
向对象编程语言。但是它也是过程编程语言。为什么怎么说呢, C++ 的产生不但
考虑了面向对象的特性,而且也更多的考虑了对 C 语言的向后兼容,使得 C++ 这
种杂合语言表现出“过程”和“对象”编程的双重性。你通常既可以继续用 C++
编译器来编写传统的 C 程序,也可以使用 C ++ 的类库或者编写自己的类来作面
向对象编程。这种“两面性”使得人们可以继续保留原有的 C 代码,同时也阻碍
了面向对象思想的推广。
举个简单的例子,94 年的时候,我开始学习 C++ ,当时是学习 turbo C++ 自己
带的一个叫作 turbo vision 的类库来做项目。我的同学也用 turbo C++ ,但是
他一点也没有学习过 C++ 这个语言,他只是用 turbo c++ 编译器来重新编译他以
前用 turbo c 写的程序,然后他自豪的对我说:“瞧,我用 c++ 做的东西”,好
像意思是说“我用 c++ 开发项目了”,在那个 c 比 pascal 高档, pascal 比
foxbase 高档的年代里, C++ 的标签绝对是个很"酷"的标志。我其实很清楚他的
行为。这就是“C++ 是打着面向对象的幌子,干着过程编程的勾当”的第一重意思
,也就是说, C++ 编译器对 C 程序的兼容性造成了最底层的“过程勾当”。在国
内有很长一段时间,人们都是在用 C++ 编译器做 C 编程。 我当时在想,比起我
那个同学,我才是真正懂得面向对象的人。 我学习了 C++ 语言,我懂得封装,继
承和多态,我学习了 turbo vision 的类库,我派生了 turbo vision 的类库并编
写了自己的类,所以我是懂得面向对象的。从某种意义上说,我这么想是对的。但
是从面向对象程序员的分类来说,我又不完全懂得面向对象的思想。从事面向对象
编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”,通常创
建类库的人才是真正懂得面向对象思想的人,他们创建类库供给那些“客户程序员
”来使用,他们从头开始制作类库,他们进行面向对象的分析,设计,实现的全过
程。当学习完 C++ 后,我的第一个感觉是,从头创建一个类库真是很麻烦的事情
,通常用 C 过程编程很容易实现的功能,你必须按照类的思想来从新建立对象,
但是一旦类库建立好后,使用类库和派生类,以及维护代码都是非常舒服的事情。
使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象
就可以使用类库了,然而我们的思维并没有真正的转过来,使用类库只是在形式上
是面向对象,而实质上只是库函数的一种扩展。这就是我理解的“C++ 是打着面向
对象的幌子,干着过程编程的勾当”的第二重意思,实际上用 C++ 编程的人,大
部分不自己创建类,而是使用类库,这样就造成了他们把类库作为一种高级的库函
数库来理解,并没有真正理解面向对象的思想。
C++ 的面向对象的思想推广很慢,直到 MFC ,OWL ,VCL 这样的类库出来以后,人
们才渐渐的接受了一些面向对象的思想。为什么这条面向对象的道路那么难走?我
的答案是“因为 C++ 给了我们第二条道路去走过程编程”,当然原因是为了考虑
兼容 C 语言,然而正是由于有了第二条老路才使得使得我们不会再去考虑新的面
向对象编程思维方式。
直到出现了 Java ,才真正迎来了面向对象的曙光。Java 真正是革命性的东西吗
?不是,所有现有的 java 的思想都是继承自其他的语言和技术,没有什么革命的
地方,虚拟机的概念早在 20 年前的 UCSD pascal 中就采用了,只是当时的机器
速度太慢,虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的。java
本身的很多东西也借鉴了 C++ 语言,连它的创始人也说,java 是 "C++--" 也就
是说 java 去除了 C++ 的一些不太好的地方。所以说 Java 本质上没有什么革命
的东西,所以那些对 Java 的赞美之词都是 Sun 公司的宣传伎俩。没有一种语言
会长久的存在下去,你很难说你的孩子在二十年后还会继续使用 C++ 或 java,所
以我们要抛开这些浮华词汇的背后,找寻真正我们需要学习的东西。否则今天我们
大家都是微软的傀儡,明天 Sun 公司起来了,我们就都是 Sun 的傀儡。仔细研究
美国电脑技术发展的历史,美国人一向喜欢象第三世界兜售他们的过时技术,而他
们始终可以自豪的说,我们将永远领先你们第三世界国家二十年。我们始终在跟在
美国人的后面学习他们的东西,这的确让人担忧。我说着说着又跑题了。Java 虽
然没有什么真正的革命性的东西,但是 Java 在真正推动面向对象编程思想方面是
功不可末的。使用 Java 编程,你无需考虑到向后兼容什么语言的问题,它是重新
建立的语言,你在掌握这门语言之前,你必须将自己的编程思想由过程编程彻底转
向面向对象编程,因为 每个 Java 程序,本身就是一个类,你编写任何 java 程
序,你都不自觉的在构造一个对象模板,没有第二条道路,只能是面向对象编程。
( 我非常喜欢 java 将所有类定义和类声明放在一个文件中,而不是象 C++ 那样
,cpp 和 .h 文件是分开的。通常刚刚开始学习 java 的人不习惯,不过学习一段
时间,你就会体会到它的好处了。), 使用 java 编写程序(我更喜欢说---编写
类,而不是程序)的时候,你会必须从一个对象的角度来考虑问题,因为你的程序
就是一个类,你必须考虑把哪些东西作为成员变量,哪些作为方法,要生成几个类
,哪些变量是成员变量,哪些是静态的变量和方法,等等。通常做完一个项目,你
就已经将面向对象的思想运用其中了。之所以说 Java 在面向对象的贯彻方面要比
C++ 彻底,就是因为你只能使用面向对象的方式来编写 java 程序,而 C++ 却可
以采用另外一条非面向对象的方式来编写程序。Java 并没有什么真正革命性的东
西,它最大的贡献当然是推广面向对象的思想了。
Java 总的来说是降低了继续过程编程的可能性,但是并没有完全消除它。面向对
象是一种思想,是我们考虑事情的方法,通常表现为为我们是将问题的解决按照过
程方式来解决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知
不觉的按照过程方式来解决它,因为我们通常习惯于考虑解决问题的方法,而不是
考虑将要解决问题抽象为对象去解决它。很多新的技术使我们更加趋向于过程而非
对象的思想。最明显的就是 RAD (快速应用程序开发)可视技术的出现,人们可以
通过设置属性和编写事件函数来快速开发应用程序,编写事件函数就是典型的按照
过程编程的思想(至少我是这么认为的),试问有多少人能区分VB 和 delphi ,
c++ builder ,java 的事件函数编写有什么本质的区别, 后三者都采用了
Delegation (委托模型),在 java 中是通过 anonymous 类(无名类),或者
Adapter 类来实现Delegation,这是一种面向对象的构想,但是 VB 不是,所以这
底层的区别都被上层的相似性所抹杀了,使用 jbuilder 编程的时候,我们如果没
有仔细研究 java 的 awt.event 编程方式的话,通常也是把它当作普普通通的“
类 VB"的编写方式来写程序,而实际分析它在后台所生成的代码,你才能明白这些
代码是真正的面向对象的,但是如果你只是简单的把它当作可视编程工具,你是永
远不会明白什么是”委托模型“,什么是面向对象编程的。这是我理解的 “C++
是打着面向对象的幌子,干着过程编程的勾当”第三重意思。无论是 C++ 还是
java 都有可能走过程编程的老路, java 降低的过程编写的可能性,但是如果你
没有具备面向对象的编程思想,你还是可能走面向过程的老路的。
(未完待续)
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.170.172]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.914毫秒