陳 倩
摘要:抽象技術是人類理解和解決復雜問題最重要的工具之一,更是面向對象程序設計中應用最廣泛的原則之一。本文介紹了抽象的概念、抽象層次的劃分以及兩種典型的抽象方法,并從抽象這個較高層次來理解面向對象技術的主要思想:類、對象、封裝、繼承和多態,等等。
關鍵詞:抽象;抽象層次;面向對象技術
中圖分類號:G642 文獻標識碼:B
面向對象技術是當今最流行的軟件系統設計和開發技術,從80年代產生到現在短短30年間,面向對象技術已經在計算機的方方面面得到了成功的應用并吸引了越來越多的人在軟件設計和開發中學習和使用這種技術。學生在學習面向對象技術時往往從面向對象程序設計語言出發(比如C++,JAVA等)入手,在程序語言語法學習中理解面向對象概念,導致在學習過程中,學生往往過多地糾纏于程序設計語言的語法規則等細節方面,而省略了對面向對象技術本質思想的領會。抽象技術是人類在實際生活中理解和解決復雜問題最重要的技術之一,抽象思維更是一個程序員必不可少的素質。面向對象技術正是利用抽象技術,通過抽象層次分類方法達到自上而下地對復雜問題進行逐步求精和模塊化,把問題分解為人們可以理解和分析的不同規模。所以,從抽象的角度(本文從抽象的概念、抽象的層次和抽象的方法三個方面)來介紹和分析面向對象技術的主要思想,能夠幫助面向對象技術學習者從一個比較高的層次來理解面向對象的主要思想,從而避免被編程語言的語法細節所牽絆,真正掌握這種技術的精髓所在。
1抽象的概念
抽象是指對于一個事物或過程的某些細節有目的的隱藏,通過省略某些信息來把事物的主要結構表達得更加清楚。舉個例子來說,當你打開一本世界地圖冊,首先你會看到一張世界地圖,這張世界地圖描述了一些簡單的地理區域(比如7大洲,4大洋),以及一些主要山脈、河流、國家和首都城市。在這張地圖上,通過省略詳細的地理信息(比如某個村莊的地理位置)而讓人們可以了解整個世界的主要區域分布;接著當你打開一張更小區域的地圖時(比如一個國家),你就能到更多的地理細節,包括這個國家的許多大中型城市,主要的道路,山脈、湖泊等等,但是卻只能看到本區域的信息,而不能看到別的區域信息了;以此類推,當你打開更小區域的地圖時,得到的細節信息就更多,也更加詳細,但是信息的范圍卻越來越小。通過這個例子,我們可以看到,在實際生活中我們總是不知不覺地運用了抽象思維來看問題和解決問題,每張地圖都是人們對某一個地理范圍的一種抽象,而且抽象是分級別的,在每一個級別水平上都會包括某些特定的信息,而省略某些其他的信息,使得我們在這個抽象級別上理解和解決某些問題變的非常容易。人類吸收和處理信息的能力是有限的,抽象技術通過省略一些細節信息來縮減信息量以達到人類處理問題的水平。
在程序設計技術中,也需要把復雜的現實問題抽象成能夠處理的形式,在面向對象技術中,有另外一個術語來描述抽象這種有意識隱藏細節的行為:信息隱藏(或者叫封裝)。所謂信息隱藏就是指在系統設計開發過程中,有目的地省略細節,而集中精力在實際問題的幾個主要特征上。這樣,在整個系統的設計開發過程中,系統設計人員才不會被大量的細節所干擾,從而把精力放在整個系統的主要框架上。那么什么時候考慮細節問題呢?其實抽象概念的運用是分層次的,越高級別的抽象往往隱藏的信息越多,抽象層次則越低,描述的細節信息越豐富。在實際的面向對象程序設計和開發中,程序員非常重要的一項工作就是確定自己在哪個抽象級別上工作,這樣,你就非常清楚自己的應該做些什么,不應該做什么(即省略什么)。在現實情況中,經常出現的錯誤卻是程序員總是在最低抽象級別上反復思考,關心各種關鍵細節的實現,而不是努力的思考如何實現高級別的抽象,來促使任務各個部分盡可能的分離,這才是最重要的。
2抽象的層次和抽象方法
前面提到在處理復雜問題時,需要利用抽象方法,并且劃分抽象層次,才能在正確的抽象級別上考慮和解決問題。如何對一個復雜事物或過程進行抽象以及劃分抽象層次?有兩種抽象方法在面向對象程序設計和開發中得到了廣泛的應用。
2.1組合抽象方法
組合抽象方法是人們在現實生活中經常用到的一種抽象方法。具體地說,人們在抽象一個事物或者過程時,通常會分析這個事物或過程是由哪些部分組合而成,然后依次檢查和分析每一個組成部分來得到對事物更精細的理解。這種抽象方法也是通常所說的“分而治之”思想的一種具體體現。舉個例子來說,如果我們要理解和分析計算機是如何進行計算的?組合抽象方法首先分析計算機由哪些部分組成:CPU(指令計算)、內存(數據存儲)、總線(數據傳輸)、輸入輸出設備(數據的輸入輸出)。這樣我們就很容易地得到了一個計算機的抽象模型(如圖1所示)。顯然這個抽象模型并不能代表一臺真正的計算機,真正的計算機遠遠比這個模型復雜的多。但是,一般情況下,通過這個抽象模型我們可以來解釋計算機的計算過程,即:計算機通過外部設備得到輸入數據,然后存儲到內存中,CPU從內存中取數據和指令進行計算,并把結果存儲到內存,輸出設備再把結果從內存中讀出并顯示,其中數據的傳輸通過總線進行。

如果想進一步了解CPU的工作過程呢?在這個抽象模型層次是沒有辦法做到的,我們需要更加詳細的抽象模型層次。方法就是對計算機的每個組成部分同樣用組合抽象方法做更詳細地分析從而形成抽象的下一個層次,比如CPU由運算器,寄存器和控制器組成,總線由系統總線、數據總線和地址總線組成,等等。這樣,對計算機的抽象模型就變得更加詳細,在這個層次上,人們可以進一步解釋CPU的運算過程。如果需要,我們還可以一直往下通過組合法劃分更加詳細的抽象層次,甚至分析到集成電路結構,研究分子結構、電子結構,等等。當然,對問題的任何解釋和描述我們都要基于某個正確抽象層次,這樣才能使得人們接受到的信息量比較適合,也比較容易理解(比如想要理解計算機的工作原理,我們最好在最高抽象層來解釋,如果放在電子層來解釋,人們是沒有辦法接收和理解的)。
組合抽象方法在面向對象程序設計中使用起來非常容易和直接,大到一個系統,小到一個類的設計,我們通常會分析這個系統或類由哪些部分組合而成來建立相應的抽象模型,然后遞歸的分析每個組成部分以達到逐步求精的目的。使用這種方法能夠很容易實現系統的封裝性和可擴展性。使用組合抽象技術,系統設計者很容易將一個大系統分成幾個部分,將每個部分單獨的分配給不同的小組。每個部分的設計者需要對本組承擔的工作對外進行良好的封裝,而對內進行非常詳細的理解和設計。在面向對象設計中,通常使用“接口”和“實現”這兩個術語來描述這兩種情況,“接口”描述系統被設計用來做什么,這是進行信息封裝非常重要的一點,“實現”包含具體怎么做。組合抽象技術也可以很好的實現系統擴展性,當程序設計者把一個系統分成各個部分時,理想情況下可以將各個部分之間的相互作用減少到最少。這樣,當系統的一部分需要修改時,就不會影響到其他部分運行。
2.2分類層次抽象方法
分類抽象是另外一種人們應用非常廣泛的抽象方法,早在2000多年前,古希臘哲學家亞里士多德就用分類的方法來對所有生物進行抽象(如圖2所示)。這種方法把生物首先分成動物和植物,動物又分成脊椎動物和無脊椎動物,脊椎動物又包括了哺乳動物,哺乳動物又具體包括貓、狗、鯨魚,等等。分類層次抽象不同于組合抽象的重要區別是:抽象層次越高,事物的特征越普遍,而抽象層次越低,事物的特征越具體;高層次抽象事物的特征和行為,可以直接應用到比它低的抽象層次的事物上去。比如,我們知道哺乳動物具有毛發,通過胚胎生育,這些特征可以毫無保留的應用到比哺乳動物更低的分類抽象層次上(比如:貓、狗也具備這些特征)。

在面向對象程序設計中,分類層次抽象方法有著非常重要的應用,面向對象程序設計中的繼承機制充分利用了分類層次抽象中較低層次的抽象類型自動具備了較高層次抽象類型的所有特征而不需要重新定義和說明的這個最重要的特點,使得新的類可以從已有的類繼承而來,從而自動具備了已有類的所有特性和行為,很好的解決了軟件設計中代碼復用和概念復用的問題,極大的提高了軟件開發的效率。我們來看個例子:Java的AWT(Abstract Windowing Toolkit)庫設計。在這個庫中,設計者就是根據分類層次抽象方法組織了所有的AWT圖形用戶界面組件類,如圖3:

從圖3中我們可以看到,層次越高,特征越具有一般性,層次越低,特征越個別化。層次比較高的類的數據和方法可以通過繼承的方式,直接被下層組件類所使用,從而大大簡化了組件的設計,提高了效率。比如Component類中的特征和方法:(1)組件的顏色(2)組件的字體(3)組件的大小和位置(4)組件的激活與可見性(5)組件上的光標(6)paint方法和repaint方法非常普遍,只要處在Component下面的分類抽象層次中的組件都具備這些特征,它們都可以通過繼承的方法直接把Component類中設計的特征和功能變成自己類的一部分。當然,具體的組件類除了繼承祖先的特征和方法,還有一些自己特有的東西,比如:TextField組件類除了TextComponet類和Component類中定義
的特征外,還有自己專有的特征:SetText(),等等,這些特性在別的組件類型就不一定有了。
3總結
抽象技術通過舍棄個體事物在細節上的差異,抽取其共同特征而得到事物的抽象概念,它是面向對象方法中使用最廣泛的原則之一。通過抽象的概念和方法來理解面向對象的主要思想可以幫助人們更好的理解面向對象技術,培養抽象思維,使用面向對象原則來進行軟件的設計和開發。
參考文獻:
[1] Timothy A.Budd. 面向對象編程導論[M]. 黃明軍,李桂杰,譯. 北京:機械工業出版社,2003.
[2] 周之英. 現代軟件工程(第二冊)[M]. 北京:科學出版社,2003.
[3] 楊大軍,張鳴. 并發面向對象程序設計語言研究與發展[J]. 計算機研究與發展,1998,35(9).
[4] Timothy C.Lethbridge, Robert Laganiere. 面向對象軟件工程[M]. 張紅光,溫遇華,譯. 北京:機械工業出版社,2003.
[5] 邵維忠,楊芙清. 面向對象的系統設計[M]. 北京:清華大學出版社,2003.