面向對象之封裝

隱藏複雜性,是我們人類處理更復雜問題的一種常用方法。這可能跟人的記憶力、計算力等是有限的這點有關,對這種方法背後原因的深度挖掘,要涉及人類認知學方面的知識,而顯然它(認知學)的表現並不盡如人意,否則完全可以根據它造出會認知的機器來。

這裏不討論認知學與強人工智能,感興趣的讀者可以找些這方面的資料來讀。我們只要知道,這種隱藏複雜性的方法很常用、很好用就可以了,比如操作電視,我們不需要知道電視內部的繁雜的佈線,只通過幾個電視按鈕就可以實現調整音量、切換頻道等等功能;軟件中,面向對象中的封裝,就是對這一基本方法的體現。

對象的封裝,要分兩個方面來考察,一個是怎麼樣封裝纔算對,一個是怎麼樣封裝纔算好。

達到了封裝者對對象的職責預期就是對的,否則,就是錯的。

比如,想得到的是一個狗對象,能狗叫,而封裝的結果竟然是個貓,會貓叫。又比如,想得到的是一個狗對象,能狗叫,而封裝的結果是一個狗對象,卻能貓叫。這都是沒有達到封裝預期所致。但也有這種情況,有人先封裝了一個對象後,接着說,這個對象就是我的預期,這樣做就像打哪兒指哪兒的神槍手一樣,預期永遠與封裝的對象相符合,那麼我們只能考察它的另一項指標:好不好。

而評價封裝的好不好,很難有一個客觀的標準,不管從哪個角度說,,它都更屬於設計美學範疇。當一種封裝顯得不怎麼美的時候,就是不太好。怎麼又算美呢?這真的很難說;一千個人可能會有一千種關於美的評價吧。我只能說一下我自己的審美傾向,簡潔既是美。

簡潔的追求會自然促使你讓類的職責單一,比如一個狗對象,不但會狗叫,也能貓叫,那麼貓叫就是很不和諧的音符,這就顯得不美。狗對象只表現狗的行爲則顯得更爲合適,表現的太多,反而會感覺很怪異。假如來了只貓對象,見到這隻會貓叫的狗,一定感覺很不是滋味。程序是給程序員看的,職責明確而接口簡單的對象,看起來會更舒服,可讀性也一定會更好。職責模糊而接口複雜的對象,看起來總不那麼舒服(雖然也能實現所有業務功能)。

我們還是看一段具體的程序吧。這是一個計數器程序。

       這個類只有一個屬性,對應到這個對象,則這個類屬性代表着對象的狀態,所有的方法,都是圍繞着對象的基本屬性或狀態進行的操作,沒有和基本屬性無關的操作。這個對象的職責就是負責計數。很簡潔。假如我們再添加一個方法,如下:

public int max(int a,int b){

       if(a>b) return a;

       else return b;

}

那麼這個方法對於這個計數器對象來說,就是相當於狗對象中有了貓叫,就是不和諧的,就是不美的。這個方法和計數器的職責是無關的,它也沒有涉及到類屬性的任何操作,如果一個操作對它自身沒有任何影響,這好像更應該是別的對象的方法。所以,把取得最大值這種方法放在這裏是很累贅的。

       既然是在進行封裝和信息隱藏,就要區別於開放和信息暴露,那麼在能完成特定職責的情況下,封的越嚴實越好,信息隱藏的越多越好,留的接口越少越好,這樣的對象的功能才強大而接口又簡潔。這種簡潔的美感怎麼表述呢,我總認爲蘋果公司的各種產品的界面設計最能體現出這種簡潔美感。IPod的界面和操作設計,就有一種藝術般的簡潔美感。而面向對象設計中的封裝,也應該向iPod的封裝效果學習。

       比如兩個同類型對象,如果它們的id屬性相等,則認爲這兩個對象相等。有兩種辦法判斷相等,一種是分別通過兩個對象提供的接口取出對象id,再在對象外的程序中做id的比較邏輯判斷(例如:if a.id=b.id then…);一種是對象本身提供是否相等的方法,在對象內部完成此判斷,外人看不到(例如:if a.equal(b) then…)。這樣,把實現細節隱藏在內部,顯然這樣的封裝的更加合理,使用起來也更加的方便。這就像操作轎車,如果轎車的接口是這樣:按一個按鈕,彈出一根線,再按下另一個按鈕,彈出另一根線,然後司機用手把兩根線一碰,汽車發動了!雖然也能發動汽車,但未免太麻煩了;這種發動汽車的方式就像比較兩個對象是否相等的例子中的前者,這樣做肯定也是能發動着汽車的,就像很多封裝的不好的對象一樣能實現要求的功能一樣(比如比較對象是否相等的第一個例子)。一擰鑰匙,汽車就發動,明顯優於手工碰線頭的方式。

       一想起封裝與信息隱藏,我總是會不由自主的想起《自私的基因》一書的作者道金斯說的關於基因的一段話:

       但在今日,別以爲它們(基因)還會浮游于海洋之中了。很久以前,它們已經放棄了這種自由自在的生活方式了。在今天,它們羣集相處,安穩地寄居在龐大的步履蹣跚的“機器”人體內,與外界隔開來,通過迂迴曲折的間接途徑與外部世界聯繫,並通過遙控操縱外部世界。它們存在於你和我的軀體內;它們創造了我們,創造了我們的肉體和心靈;而保存它們正是我們存在的終極理由。這些複製基因源遠流長。今天,我們稱它們爲基因,而我們就是它們的生存機器。

       他的這段話如此精彩,令我忍不住套用如下:

       基本的變量已經不再浮游於一大段一大段的程序中了,它們已經放棄了(其實是程序員不用這種方式了)這種自由自在的存在方式,而是安穩的寄居於龐大而蹣跚的“對象”內部,與外界隔開來,通過迂迴曲折的間接途徑與外部世界聯繫和通信。而這些對象,就是它們這些基本變量的生存機器!

作者:dapplehou email:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章