/** * 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 公司宣传伎俩。没有一种语言会持续很长时间,你很难说你的孩子20年后会继续使用它。 C++ 或 java,因此,我们应该抛开这些浮华词汇的背后,寻找我们真正需要学习的东西。否则,今天我们都是微软的傀儡,明天 Sun 公司起来了,我们都是 Sun 的傀儡。仔细研究美国计算机技术发展的历史,美国人总是喜欢像第三世界一样出售他们过时的技术,他们总是自豪地说,我们将永远领先你的第三世界国家20年。我们总是从美国人身后学习他们的东西,这真是令人担忧。说着说着又跑题了。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++ 以面向对象为幌子,做过程编程活动的第三个意思。不管是不是 C++ 还是 java 都有可能走过程编程的老路, java 减少编写过程的可能性,但如果你没有面向对象的编程理念,你仍然可以走面向过程的老路。
(待续未完)(待续未完)
![](/images/780-200-2.jpg)