【问题标题】:data hiding is encapsulation, but not all encapsulation is data hiding数据隐藏就是封装,但并不是所有的封装都是数据隐藏
【发布时间】:2013-06-19 11:20:40
【问题描述】:

我已经阅读了近 100 多个链接,并探讨了关于 SO 的所有问题,但是 :( 仍然无法理解
数据隐藏和封装之间的区别
在阅读 this answer 时我读到这一行
数据隐藏是封装,但并非所有封装都是数据隐藏
所以经过大量研究后,我发现
1) 数据隐藏是通过封装实现的,或者它是一种封装形式(我说对了吗)?
2) 如果是,应用访问说明符是数据隐藏(和封装也是)但是只有封装而不是数据隐藏的机制是什么? /em> ?

【问题讨论】:

  • 来自关于信息隐藏的维基百科文章:“封装一词经常与信息隐藏互换使用。但并非所有人都同意两者之间的区别;人们可能认为信息隐藏是一种原则,并且封装就是技术。” - 我怀疑你会得到一个明确的答案......
  • 我认为你在分裂头发。数据隐藏和封装几乎是一回事。
  • @Despicable:我想我可以肯定的是,不同的人会以不同的方式解释这些术语。
  • @JonSkeet 我需要“深度 C#”作者的意见吗?他说什么?

标签: java oop encapsulation


【解决方案1】:

简短的回答:

1) 无需封装即可实现数据隐藏,例如类中的私有常量,任何“getter”都不会返回该常量。

2) 应用访问修饰符可能是数据隐藏和封装。当你暴露数据时,你可以实现封装但不能隐藏数据,但只能通过getter和setter进行修改。

长答案:

数据隐藏和封装是完全不同的东西,但相关的概念。数据隐藏是为了不泄露您类的任何用户的实现细节,而封装是为了防止数据发生意外更改。

我发现的最好的解释是在“Growing Object Oriented Systems Guided by Tests”一书中(第 49 页)

作者说的是封装几乎总是一件好事,但数据隐藏可能在错误的地方,他们给出了以下示例:

  • 在Loader类中封装缓存的数据结构
  • 在 PrivacyPolicy 类中封装应用程序日志文件的名称

上述两种说法听起来都很合理,直到我们从数据隐藏的角度来看它们

  • 在Loader类中隐藏缓存的数据结构
  • 在 PrivacyPolicy 类中隐藏应用程序日志文件的名称

在缓存的例子中,隐藏它是有意义的。但是对于应用程序日志文件名,隐藏它是没有意义的。

【讨论】:

  • +1 Data hiding is about not leaking the implementation details any user of your class, while encapsulation is preventing unexpected changes on the data.
  • 真棒答案,非常清楚。现在我只想知道一件事,然后我不接受你的答案。1)从encapsulation is preventing unexpected changes on the data 行开始,这意味着通过应用 getter setter,我们可以轻松实现封装。对吧?(如果你有其他例子,也请分享)。2)从Data hiding is about not leaking the implementation details any user of your class这行开始,这意味着不仅来自封装,还来自抽象我们可以实现数据隐藏? (另外,如果您有任何其他数据隐藏示例,请分享)
  • 如果数据隐藏是为了不泄露实现细节那么数据隐藏和抽象有什么区别?它们是一样的吗?
【解决方案2】:

抽身

  • 专注于基本方面并隐藏背景/实现细节

  • 关注对象的外部视图 示例:Stack类【抽象专注于Push、Pop类提供的服务】

  • 抽象允许捕获整个对象的行为,不多不少。
  • 它专注于对象可以做什么
  • 它有助于根据职责驱动方法识别类[根据类执行的职责将系统分类为一组对象]

封装

  • 将对象的状态和行为捆绑到单个单元中
  • 通过定义类来实现[识别状态和行为并将这两个东西放在类中]
  • 使对象的状态和行为保持在一起
  • 它不隐藏实现细节,其目的是识别状态和行为并将这些东西放在一起
  • 它侧重于对象的内部视图,而抽象侧重于对象的外部视图
  • 封装有助于实现抽象

信息隐藏

  • 封装必须只允许显示基本服务,隐藏与封装相关的概念的信息需要隐藏对象的实现细节
  • 信息隐藏和封装不一样

封装是确定哪些状态和行为的决定 对象将被放在一起而信息隐藏是 决定将哪些封装项目显示给用户 以及不向用户透露的内容

【讨论】:

    【解决方案3】:

    封装隐藏复杂性。就像我们正在创建 getter 和 setter..

    但是数据隐藏意味着隐藏某些东西,在java中我们可以使用访问修饰符来完成,即

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2018-06-29
      • 2016-05-15
      • 2015-08-13
      • 1970-01-01
      • 2011-08-06
      • 2021-07-24
      • 1970-01-01
      • 2017-03-20
      相关资源
      最近更新 更多