簡體   English   中英

數據隱藏是封裝,但並非所有封裝都是數據隱藏

[英]data hiding is encapsulation, but not all encapsulation is data hiding

我已閱讀了近100多個鏈接,並探討了所有關於SO的問題但是:(仍然無法理解
數據隱藏和封裝之間的區別
在閱讀這個答案時,我讀了這一行
數據隱藏是封裝,但並非所有封裝都是數據隱藏
所以經過一番巨大的研究,我發現了這一點
1)數據隱藏是通過封裝實現的,或者它是一種封裝形式(Am I Right)?
2)如果是,應用訪問說明符是數據隱藏(和封裝也是如此)但是什么是僅封裝但不是數據隱藏的機制?

簡短的回答:

1)數據隱藏可以在沒有封裝的情況下實現,其中一個示例是類中的私有常量,並且任何“getter”都不返回該常量。

2)應用訪問修飾符可能是數據隱藏和封裝。 在公開數據時,您可以實現封裝,但不能實現數據隱藏,但只能由getter和setter修改。

而答案很長:

數據隱藏和封裝是完全不同的事情,但相關的概念。 數據隱藏不會泄露任何類用戶的實現細節,而封裝可防止對數據進行意外更改。

我發現的最好的解釋是在“測試引導的面向對象增長系統”一書中(第49頁)

作者所說的是封裝幾乎總是一件好事,但數據隱藏可能在錯誤的地方,並且它們給出了以下示例:

  • 封裝Loader類中緩存的數據結構
  • 在PrivacyPolicy類中封裝應用程序日志文件的名稱

以上兩種聲音都是明智的,直到我們從數據隱藏的角度來看它們

  • 在Loader類中隱藏緩存的數據結構
  • 在PrivacyPolicy類中隱藏應用程序日志文件的名稱

在緩存的示例中,隱藏它是有意義的。 但是關於應用程序日志文件名,隱藏它是沒有意義的。

Abstaction

  • 重點關注重要方面並隱藏背景/實施細節

  • 重點關注對象的外部視圖示例:Stack類[Abstaction專注於類Push,Pop提供的服務]

  • 抽象允許捕獲整個對象行為,而不是更少。
  • 它着重於對象可以做什么
  • 它有助於根據責任驅動的方法識別類[根據類的責任將系統分類為一組對象]

封裝

  • Bundeling狀態和對象的行為分為單一單位
  • 通過定義類[識別狀態和行為並將這兩個事物放在一起]來實現
  • 允許將對象的狀態和行為保持在一起
  • 它沒有隱藏實現細節,其目的是識別狀態和行為並將這些事物保持在一起
  • 它側重於對象的內部視圖,而abstaction則側重於對象的外部視圖
  • 封裝有助於實現抽象

信息隱藏

  • 封裝必須只允許顯示基本服務,隱藏與封裝相關的概念的信息需要隱藏對象的實現細節
  • 信息隱藏和封裝不一樣

封裝是決定將對象的哪些狀態和行為放在一起的決定而信息隱藏是決定要向用戶顯示哪些封裝的項目以及哪些不被重新分配給用戶

封裝隱藏了復雜性 就像我們正在創造吸氣劑和定型器..

但是數據隱藏意味着隱藏某些內容而在java中我們可以使用訪問修飾符來完成,即

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM