閱讀271 返回首頁    go 技術社區[雲棲]


《數據結構與抽象:Java語言描述(原書第4版)》一P.1 封裝

本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第1章 ,第1節,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學  新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。

P.1 封裝

如果你想學習駕駛,那麼對汽車的哪些描述對你最有用?顯然不是描述它的發動機如何周而複始地獲取空氣和汽油,點燃空氣和汽油的混合物,然後排出的過程。當你想學習駕駛時,這樣的細節是不必要的。事實上,可以以你的方式獲知這些細節。如果你想學習駕駛,最有用的汽車描述是如下的這些特點:

  • 如果你將腳踩在油門踏板上,汽車將開得更快。
  • 如果你將腳踩在製動踏板上,汽車將慢下來並最終停止。
  • 如果你將方向盤向右轉,汽車將右轉。
  • 如果你將方向盤向左轉,汽車將左轉。

就像你不需要告訴想開車的人發動機是如何工作的一樣,你也不需要告訴使用一款軟件的人Java實現的全部細節。同樣,假定你為另一個程序員寫了一個用在程序中的軟件組件,你應該告訴其他的程序員如何使用它,而不是與程序員分享如何寫軟件的細節。
封裝(encapsulation)是麵向對象程序設計的設計原則之一。“封裝”這個詞聽上去好像是把東西放進膠囊,這個想象確實是正確的。**封裝隱藏**了“膠囊”裏的細節。由於這個原
因,封裝常常稱為信息隱藏(information hiding)。但不是所有的事情都應該隱藏。在汽車裏,有些東西是可見的(如踏板和方向盤),而其他的則藏在引擎蓋下麵。換句話說,汽車是封裝的,這樣隱藏了細節,隻有駕車所需的控製是可見的,如圖P-1所示。類似地,你應該封裝Java代碼,讓細節隱藏,而隻有必需的控製是可見的。
封裝將數據和方法放在一個類中,而隱藏了使用類時不需要的實現細節。如果類的設計良好,使用它就不需要理解它的實現。程序員可以在不知道代碼細節的情況下使用類的方法。程序員隻需知道如何為方法提供相應的參數,讓方法執行正確的動作。簡單地說,程序員不必擔心類定義的內部細節。使用封裝軟件寫更大軟件的程序員,他的任務更簡單。因此,軟件生產得更快,錯誤也更少。
注:封裝是麵向對象程序設計的設計原則之一,它將數據和方法放在一個類中,故而隱藏了類實現的細節。程序員僅需要知道使用這個類的信息就足夠了。設計良好的類,即使看不到每個方法的方法體,也可以使用它們。

image


圖P-1 汽車的控製對司機是可見的,但它的內部工作機理是隱藏的
抽象(abstraction)是一個要求你關注什麼而不是如何的過程。當設計類時,執行**數據抽象**(data abstraction)。你關注想做的或關注數據,而不擔心如何完成這些任務及如何表示數據。抽象要求你將注意力集中於重要的數據和操作。當抽象某件事時,你要確定中心思想。例如,書的抽象就是書的簡介,與之相對的是整本書。
當設計一個類時,不應該考慮任何方法的實現。即,不應該擔心類的方法如何實現它的目標。將規格說明與實現分開,能讓你專心於更少的細節,所以能讓你的工作更容易,出錯概率更低。詳細的、設計良好的規格說明,有助於讓實現更易成功。

注:抽象的過程要求你關注“什麼”而不是“如何”。

正確的封裝將類定義分為兩部分,我們稱為客戶接口(client interface)和實現(implementation)。客戶接口描述程序員使用這個類時必須了解的一切事情。它包括類的公有方法的方法頭,告訴程序員如何使用這些公有方法的注釋,以及類中公有定義的任何常量。類定義的客戶接口部分應該是在你的程序中使用這個類時要了解的全部。
實現部分由所有的數據域及所有方法的定義組成,包括公有、私有及保護的方法。雖然運行客戶(使用類的程序)時需要這個實現,但寫客戶時不需要知道實現細節。圖P-2說明了一個類的封裝實現及客戶接口。雖然實現對客戶是隱藏的,但接口卻是可見的,且為客戶提供了與實現進行交互的規範機製。
客戶接口和實現在Java類的定義中是不分開的,它們合在一起。不過你可以隨同你的類創建一個獨立的Java接口。本序言後半部分介紹如何寫這樣的接口,本書中還會再寫幾個。

image

自測題1 客戶接口如何區別於類的實現?
自測題2 用一個不同於汽車的例子說明封裝。例子中的哪些部分對應於客戶接口,哪些部分對應於實現?

最後更新:2017-06-26 14:02:12

  上一篇:go  《數據結構與抽象:Java語言描述(原書第4版)》一P.2 說明方法
  下一篇:go  《數據結構與抽象:Java語言描述(原書第4版)》一序 言-設 計 類