學鏞小辭典
單字: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,并認識操作系統、編譯器、以及程序語言內部的原理。