天天看點

封裝

所謂封裝,就是将屬性和方法捆綁到一起,封裝到一個對象中去,簡單的說,你是人,你有許多屬性,比如說你的姓名,年齡,身高,體重,性别,性格,愛好等等,這是屬性;而同時,你又會吃飯,睡覺,工作,學習,做事情,這些是方法,是你所具有的;同時将屬性和方法封裝到一個類中去,就能很完美的描述這個類的特征了,同時,它所具有的方法也就一起內建到類中,友善使用。這些是簡單的描述了。

至于什麼時候需要這個似乎不是讨論的重點了,既然是java号稱完全面向對象的語言,那麼,你就應該一直以封裝方式去思考問題和設計類了。

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

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

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

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

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

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

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

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

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

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…)。這樣,把實作細節隐藏在内部,顯然這樣的封裝的更加合理,使用起來也更加的友善。這就像操作轎車,如果轎車的接口是這樣:按一個按鈕,彈出一根線,再按下另一個按鈕,彈出另一根線,然後司機用手把兩根線一碰,汽車發動了!雖然也能發動汽車,但未免太麻煩了;這種發動汽車的方式就像比較兩個對象是否相等的例子中的前者,這樣做肯定也是能發動着汽車的,就像很多封裝的不好的對象一樣能實作要求的功能一樣(比如比較對象是否相等的第一個例子)。一擰鑰匙,汽車就發動,明顯優于手工碰線頭的方式。

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

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