快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门赌场网站:我的面向对象程序观



作者:大年夜哥

email: programmers@sina.com

日期:8/7/2001 5:30:26 PM

/**

* 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 低落的历程编写的可能性,然则假如你没有具备面向工具的编程思惟,你照样可能走面向历程的老路的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: