browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

关于OO的牢骚

Posted by on 2007 年 06 月 06 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

没事干了,发上几句牢骚,有关OO的。并不是说OO不好,也不是对OO提出什么质疑——说到底,其实是程序员自身使用的时候出了偏差,或者一些其它不可违的因素导致了OO的局限性罢了。
计算机软件环境本身是一个由0和1组成的线性世界,随着计算机语言的进步(机器语言、汇编语言一直到高级语言),呈现在程序员面前的已然是一个复杂且发散的环境了。那么面对这个世界,OO的继承、封装及多态这三大特性使得程序员能够较方便地完成操作的抽象、数据与行为的绑定,驾驭较大规模代码的难度也就随之降低了。
OO的优势显而易见,于是有的程序员言必称OO,只有OO才是王道。不过他们忽略了一句话:大道至简。
假设有一个系统S,它由两层构成:业务层和UI层;其中业务层主要提供S系统的各主要功能,UI层主要提供S系统与用户的交互。无疑,对于业务层而言,较为适合用OO的方法来进行设计与编码。那么接下来,按照功能逻辑将业务层分为A、B、C、D四个模块,辅之以四个组件类来实现,分别为CAImpl、CBImpl、CCImpl、CDImpl。这四个组件类自身又按照更细的功能逻辑暴露出IA1、IA2、IB1、IB2……等接口给UI层。并在业务层提供一个总控函数来分别获得这四个模块的指针。——该设计的叙述完毕,现在需要完成A模块的一个操作,UI层的调用方式可能是这样的(仿COM之C++伪码):

C++代码
  1. IModuleA *pA = GetModule( MID_A );   
  2. if ( NULL == pA )   
  3. {   
  4.     // error!   
  5. }   
  6.   
  7. IA1 *pA1 = NULL;   
  8. if ( FAILED( pA->QueryInterface( IID_IA1, &pA1 ) )   
  9. {   
  10.     // error!   
  11. }   
  12.   
  13. pA1->DoSth();  

是的,并无错误。但我觉得,业务层直接提供一个C style的API,岂不更加畅快:

C++代码
  1. extern "C" BOOL DoA1Sth( void )   
  2. {   
  3.     IModuleA *pA = GetModule( MID_A );   
  4.   
  5.     if ( NULL == pA )   
  6.     {   
  7.         return FALSE;   
  8.     }   
  9.     IA1 *pA1 = NULL;   
  10.     if ( FAILED( pA->QueryInterface( IID_IA1, &pA1 ) )   
  11.     {   
  12.         return FALSE;   
  13.     }   
  14.     pA1->DoSth();   
  15.     return TRUE;   
  16. }  

这样一来,UI只需如此调用:

C++代码
  1. DoA1Sth();  

虽然说哪个都行,也没有什么你死我活的矛盾在里边,不过哪种做法让UI层更加简便,可谓一目了然。不是说业务层提供了C style的API就是放弃OO代表落后——恰恰相反,业务层自身采用了OO的组织,然后在层与层之间的接触面达到了最简化的效果,这才是一个更好的解决方案。
以上所说的是使用上的偏差,下面说说所谓不可违的因素
众所周知,不是所有的硬件环境都支持OO类型的语言,比如你不能奢求51单片机上支持Java虚拟机。——既如此,我们完全有理由相信,不是所有硬件环境所支持的编译环境都支持C++编译器。相对于上例用C++设计并实现的系统S而言,有另一家公司实现了类似功能的一个系统T,所不同的是,T是用C写的。那么好了,现在两家公司遇到了一个设备厂商,该厂商设备的编译环境只支持C编译器。到此为止,能看出来有什么结果吗?——也许C++程序员们可以鄙视甚至谴责这家厂商的技术多么落后,但如果我说,这是一个大单,谁赢了谁就占有了一半以上的市场份额的话,所有的鄙视和谴责都只能显得苍白无力!不要怀疑我的这个例子,这个事实是存在的,只不过这个名企的名字被我抹去,市场份额被我有限度的夸大了。
说到这里,似乎我真的是在“痛陈”OO的不好——其实回头望去,这只是我的一点牢骚。世间本无放之四海而皆准的道理,只是人为的、刻意地抬高与贬低一直存在着,这些压力统统落在了本无过错的OO头上。

订阅本站

4 Comments

  • At 2007.06.06 15:36, z said:

    再顶,回去继续当工人去……

    • At 2007.06.11 09:22, sinper said:

      大道至简

      • At 2007.06.11 11:37, luther said:

        其实 OO 诞生的初衷就是为便于人们用简便的方法设计复杂的系统,当某些时候过程方法设计会更简洁方便,所以殊途同归。都是为更简单的完成目标而来。

        • At 2008.07.03 14:26, mood said:

          世间本无放之四海而皆准的道理.
          又让我想起了关键字:豪猪,性关系,翡翠水滴的那篇文章。呵呵

          (Required)
          (Required, will not be published)