【问题标题】:Encapsulation Vs DataHiding?封装与数据隐藏?
【发布时间】:2013-09-29 14:19:57
【问题描述】:
这可能是重复的问题,但我还没有找到答案。
Link 1
封装:
封装是将类中的字段设为私有的技术
并通过公共方法提供对字段的访问。如果一个字段是
声明为私有,类外的任何人都无法访问它,
从而隐藏类中的字段。因此,封装也称为数据隐藏
Link 2
封装:
“它 […] 是指围绕一些事物的集合构建一个胶囊,在这种情况下是一个概念障碍。” — [Wirfs-Brock et al, 1990]
“作为一个过程,封装是指将一个或多个项目封装在一个 […] 容器中的行为。封装作为一个实体,是指一个包装或外壳,其中包含(包含、封装)一个或更多项目。”
“如果封装‘与信息隐藏相同’,那么人们可能会认为‘所有被封装的东西也被隐藏了’。这显然不是不正确的。”
我应该选择哪一个?还是我误解了定义?
【问题讨论】:
标签:
java
c++
oop
encapsulation
information-hiding
【解决方案1】:
主要的一点是它并不重要。任何人都可以用稍微不同的方式来定义一个术语,而且通常不同的作者会根据他们使用这些术语的各种上下文来调整含义。
你不会从试图弄清楚哪个是“正确的”和哪个是“错误的”中获得任何启发。断章取义的引用尤其缺乏信息。
重要的是在不参考用来指代它们的词汇项目的情况下理解基本思想。
【解决方案2】:
对于封装的定义是否应包括数据隐藏存在分歧,因此这将是一个严格的意见答案。我相信后一种定义更正确,因为数据隐藏并不是面向对象编程所独有的。它是一个单独的功能,不排除封装,即函数/方法与一组变量的绑定。事实上,数据隐藏是 C 和 Pascal 等语言早期模块化编程的标志。
【解决方案3】:
第一个定义非常以 Java 为中心。第二个更通用。两者都是正确的。至于选哪一个,这是一个主观问题。由于两者都是正确的,我建议您选择您喜欢的那个...
【解决方案4】:
封装不仅仅是数据隐藏。它将内部数据表示和实现与公共接口解耦。多亏了封装,只要不破坏接口契约,就可以在外界不知道的情况下更改内部实现。所以我会说封装=数据隐藏+实现隐藏。