学镛小辞典
单字:OOOO(Obsessive-Object-Orientation Obliquity)
发音:KK: [O`OOO] DJ: /O`OOO/
解释:n. 【医学】【计算机】过度对象导向偏颇症,是一种过度使用对象导向(Object-Orientation)的病症,好发于年轻的程序员身上。属于接触性传染,带原者包括了不良的程序设计书籍和不够专精的程序设计老师及同事同学。
例句:
1. OO Advocates tend to be OOOO patients.(OO 拥护者很容易就会变成 OOOO 的病人。)
2. People with a good understanding of computer science can get rid of OOOO.(对于信息科学有深入的了解可以避免 OOOO。)
3. Most OO experts used to be OOOO victims.(大部分 OO 专家都曾经是 OOOO 的受害者。)
为了要有模有样,我发明 OOOO 这个词时,还特别参考了心理学的强迫症(obsessive-compulsive disorder),原本想叫做 obsessive-object-orientation disorder(OOOD),只是我不喜欢在这个词的最后使用 disorder,我于是用 O 开头的单字 obliquity 来取代 disorder,刚好形成四连 O 的词。
当今 OOOO 的感染者人数众多,数量直逼想靠乐透彩发大财的愚夫愚妇。他们常常有严重的幻想,认为全世界最了不起的东西就是 OO,成天开口闭口都是 OO,写程序时只管大用特用 OO,完全不管 OO 所带来的负面影响。
许多错误的信息,是造成 OOOO 普遍的原因。例如下面的说法,在许多书上都看得到:
对象导向是很自然的,教导一个小孩对象导向比教导一个计算机教授更简单,因为教授已经太熟悉计算机内的运作,所以比较难建立正确的对象导向观念。
上述的说法并不正确,但是许多人却都以为这样的说法是对的。我认为这样的说法错在于:
1. 只要对于计算机运作原理的认知不够,很难真的学会 OO,因为 OO 毕竟是用在计算机上的。许多人通常只能了解封装,对于继承不能完全掌握,对于多型更是难以捉摸。
2. 只要对于计算机运作原理的认知不够,规划出来的 OO 一点都不实用。可能是效率太差,可能是弹性太差,问题很多。
OOOO 患者写出来的程序常常会有下列的病征:
1. 太多类别:每个类别重用率极低,造成内存浪费太多。通常这样的状况,必须适当地利用继承来改写,或把功能类似的数个类别浓缩成一个类别。
2. 太多继承:继承固然可以提高重用率,但是也会使得对象体积变大许多,而且执行效率也会变差。继承被误用的情况一直很严重。更糟的是,继承是一种静态的关连,使得程序的弹性变差。许多时候,继承可以用 associate 来改写。
3. 太多物件:通常前述的「太多类别」会造成太多对象的状况,但是即使类别不多,也有机会造成太多对象的状况。一个程序使用太多对象会造成内存浪费。其实在许多时候,对象可以彼此共享的。
4. 太多短命物件:这会造成建构(construct)和回收(reclaim)花的时间太多,对于系统效率有很不好的影响。许多程序员的程序中有许多短命对象,但他们却完全不自觉。可以使用 Object Pool 等方式来改写。
5. 太多视觉组件:「太多对象」已经很不好了,如果这些对象是视觉组件,更是雪上加霜。视觉组件需要耗费 CPU 大量的运算能力。
6. 太多执行绪:其实从 OO 至上的角度来看,每个对象都是一个执行绪是最 OO 的,但是这样显然实际上不可行,因为占用太多 OS 的资源,效率会变很差。
想摆脱 OOOO,你需要花好几年的时间。建议各位好好研究 Java Swing,这是一个将 OO 发挥到极致又不失弹性和效率的 API。上述的六个 OOOO 的病征,Swing 完全都没有,足见 Swing 设计的巧妙。
OOOO 固然不好,但千万不要因噎废食而不用 OO,毕竟 OO 还是好东西,只是再好的东西都要适量。想摆脱 OOOO,您不妨多学习一些好的 design pattern,并认识操作系统、编译器、以及程序语言内部的原理。