(注:本文并非提倡不使用面向对象的设计方法)
面向对象(也就是 OOP )究竟是什么,他真的有那么神奇吗?是不是说有了 C++ 以后,那么 C 就一无是处了,可以淘汰掉?
对于上面的那个问题,相信一部分人已经有了答案。不过,有人会问: OOP 是一种新的编程思想,在它的影响下,计算机编程已经发生了翻天覆地的变化,有必要对它提出质疑吗?
在说明我的观点之前,我想先提出一个编程所面向的抽象层面的概念。
下面先回顾一下计算机语言的初始,在开始没有计算机语言的时候,人们用十六进制来编程,那时候编程的人是面向硬件体系的。
技术是进步的,历史是前进的,跟着发明了汇编语言(也发展出后来的编译原理一课)。汇编的出现,使得硬件体系被抽象成计算机的逻辑结构,编程人员便是面向逻辑结构编程的,这便是最早的编程面向的抽象层面了。
强调指出的是,正是把硬件体系抽象成逻辑结构,使得编程人员的受到的束缚得到解放。同时也造就了一个虚拟的计算机世界。于是人们便是面向逻辑结构这个抽象层面进行编程了。
后来高级语言的产生,也就是在此逻辑结构之上进行再抽象,形成一个更高的虚拟世界,同时也掩藏了更多的实现细节和与规律。(相信现在真正懂得微程序、微操作的人已经没有想象的多了。)
C 语言是如此, C++ 面向对象也是如此,只是 C++ 的抽象层更高,被隐藏的细节更多( 还包括一些高级语言,如 VB 和 JAVA ,其中以 JAVA 尤其突出,因为它是解释语言,而且跨平台!不相信?那么你见过用 JAVA 编的大型射击、动作游戏没有? )。
每一样新的事物的出现都有它的存在的价值,同时也有不利因素。下面先说说 OOP 面向对象的优点。
· OOP 的优点:使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化。
· OOP 的也有缺点,就 C++ 而言,由于面向更高的逻辑抽象层,使得 C++ 在实现的时候,不得不做出性能上面的牺牲,有时候甚至是致命的 ( 所有对象的属性都经过内置多重指针的间接引用是其性能损失的主要原因之一;不过,笔者的局限性在于未使用过 VC++ 外的面向对象语言,所以不是十分肯定,哈哈,有人笑出来了… )。
在计算机速度飞速发展的今天,你可能会说,一丁点的性能牺牲没什么大不了。是的,从面向对象的角度,使的编程的结构更加清晰完整,数据更加独立和易于管理,性能的牺牲可以带来这么多的好处,没有理由不做稳赚的生意吧?
不过,在某些对速度要求极高特殊场合,例如你做的是电信的交换系统,每秒钟有超过百万的人同时进行电话交换,如果,每一个数据交换过程都是一个对象,那么总的性能损失将是天文数字!!
或者这个例子不够贴身,再举个例子吧。假如你受聘于一个游戏设计公司,老板希望做出来的游戏可以更多的兼顾到更多的电脑使用者,游戏每秒钟的运行的帧可以更多,子弹和爆炸物可以更多、更华丽。那么,你会发现使用 C++ 会使你的程序变得笨拙,无法满足你的需求,除非你非得要你的游戏运行于奔腾四的机器上 ( 如果不是,而你又坚持用 C++ 的对象编程,那么请减少主角的枪的威力吧 )。
如果你是冥顽不宁的人,你说不相信 OOP 会有性能上的损失,那么,我记得曾看到在 CSDN 上关于 VB 和 VC 执行效率的讨论的文章,讲述的就是使用了 MFC 以后,执行效率甚至低于 VB 开发出来的东西。请各位验证一下:如果使用的是纯粹的 C 语言语法的话,那么一定会比在 VB 编出来的东西要快很多 ( GetTickCount 函数可以查阅 MSDN ,如果想更加精确一些,可以使用 QueryPerformanceCounter 函数 )。
· 也许你会说,本文的作者真笨,懂得 C++ 的人,不可能不懂得 C 的语法吧?那么刚才所说的全部都是废话了!!
请你也清楚一点,懂得 C 的语法,跟熟练使用 C 编写程序完全是两回事。例如在编写游戏的时候,使用 C++ 的人会不停的创建对象,而一个严谨的 C 程序员,他甚至要考虑如果创建的函数太多了,会否造成调用函数时保存现场造成的性能损失,最终决定是否要合并某些函数,或者使用内联函数去做等细节。自然,这样开发出来的东西运行起来也会快的多 ( 在编写程序的时候,只要不是涉及快速开发,我总是拒绝使用 MFC ,虽然我曾经很迷恋 OOP 的开发;不过真的好累人啊 )。
再次强调,写本文的目的并不是提倡不使用面向对象的设计方法,相反,我肯定面向对象所带来的编程方法的革命性的意义。只不过,我在这里指出,如果读者想成为一个真正有价值的程序员,那么请不要忽视 C 的程序设计方法。如果肯面向低的逻辑抽象层面进行程序开发就更好,例如在你的 VC 程序里面直接插入汇编的语句 ( 例如像: _asm mov ax,xx 之类 ),将会提供更大的灵活性,也为你的就业提供更多的机会。
( 写了该文后,我曾害怕会遭到攻击,什么各人有各人的路,把自己的观点强加于人之类的说法,小弟的确实不敢。就好像刘巍写了 — 由C#…给…忠告一文,反而被人说他大言不馋,确实有点冤。我认为,刘先生的文章写的好,是写给有志于振兴中国计算机事业的程序员或初学者的,对我何尝不是一种鼓励,虽然我的水平相差太远…… )
另外,不知大家注意到没有,刘巍先生的文章其实是转贴的,他对各位的漫骂可能根本不知情!
刘巍先生的 “ 由C#风潮想起的-给初学编程者的忠告”的出处在 http://www.zdnet.com.cn/developer 上有;
好了,不说太多题外话!2002年9月25日 .