2012-12-17 40 views
13

Ecapsulation和Information Hiding之间的区别究竟是什么?封装vs信息隐藏

嗯,我知道,让私人领域,然后制作领域的setter和getter是ecapsulation.However并不意味着封装眼前这个?

假设我有一类如下所述。

现在是类IsThisEncapsulation封装的一个例子?

现在会在做上面的类私有实现,情报隐藏字段“年龄”?

能否请您给我明确的例子,这将帮助我明确区分这些概念?

+0

*?“是类IsThisEncapsulation封装的一个例子” * =>您还没有真正封装的任何事情,因为你提供的getter和可读取制定者和直接写你的班级的状态... – assylias

+0

@assylias公开'age'是什么打破封装,不提供getter和setter ... – hyde

+0

@hyde我没有注意到“细节”!确实! – assylias

回答

12

嗯,我知道,让私人领域,然后制作领域的setter和getter是封装。但是,封装是否意味着这个?

--->封装是一种OOP概念,其中对象状态(类字段)及其行为(方法)被包装在一起。 Java使用class提供封装。

信息隐藏:

- >机制限制对某些对象的组件的访问。你上面的例子是信息,如果你让age私人隐藏的情况。


最初,信息/数据隐藏被认为是封装的一部分,封装的定义是为:

  • 语言机制,限制对某些对象的组件的访问。
  • 一种语言结构,便于将数据与在数据上运行的方法(或其他函数)捆绑在一起。

第二个定义是由许多OOP语言隐藏组件不是自动的或可以被覆盖的事实所驱动的;因此,信息隐藏被偏好第二种定义的人定义为一个单独的概念。

参考:wikipage

7

abstraction-vs-information-hiding-vs-encapsulation

抽象和封装是相辅相成的概念:抽象的重点对象的观察行为...封装侧重于,使人们产生这种行为的实现......封装是最常见的实现通过信息隐藏,这是隐藏对其基本特征没有贡献的对象的所有秘密的过程。

信息隐藏:

“之所以选择它的接口或者定义尽可能少的透露其内部工作方式。” - [帕尔纳斯,1972b]

“抽象可以是[...]用作一种技术,用于确定哪些信息应该被隐藏”。

“混乱,可能会发生当人们失败的信息的隐藏和技术来区分(例如,抽象),其被用来帮助识别哪个信息将被隐藏。”

封装:

“它[...]是指构建一个胶囊,在壳体中的概念障碍,周围的一些事情的集合” - [魏尔夫斯-Brock等人,1990]

“作为一个过程,封装是指[...]容器封装内包围一个或多个项目,作为一个实体的行为,是指一种包装或外壳那个。拥有(包含,包含)一个或多个项目。“ “如果封装与信息隐藏是'相同的事情',那么人们可能会说”封装的所有东西都隐藏了“。这显然不是真的。“

+0

如果你给了我这些定义的例子,这将是如此的好:) – user1720616

+0

看看http://stefanoricciardi.com/2009/12/06/encapsulation-and-information-hiding/ –

+0

我会5 if我只能引用帕纳斯的话。 – dietbuddha

4

有那些之间的细微差别,我喜欢描述‘成长的面向对象软件的测试指导’由史蒂夫·弗里曼和NAT普赖斯写的书:

它说:

封装

确保对象的行为只能通过API受到影响 它可以让我们控制对一个对象的更改会影响的其他部分通过确保有 无关组件之间没有意外的依赖系统。

信息隐藏

由于隐藏的对象是如何实现它的API的抽象 背后的功能。它让我们忽略较低级别的细节 是无关手头的任务具有更高的抽象工作。

1

只看到他们的字面意义。封装只是把东西放在一个袋子里。 即把所有的属性和方法的类实现封装 但是在一定程度上也实现信息的封装隐藏。 访问修饰符不包含在封装中,而是在信息隐藏中。

+0

非常感谢。所以如果访问修改不会有助于封装,那么我在这里定义的类确实实现了封装不是吗? – user1720616

+0

@Harit我会说封装也意味着封装对象的不变式必须保持为真。这只需要通过公共API访问对象。语言是否阻止访问它们绕过API(不管是否强制隐藏信息)是另一回事,但封装并不仅仅是把事情集中在一起,它还包括不变量。 – hyde

0

回答你的问题:

信息隐藏:是隐藏着其暴露在内部执行的方式,揭露更高的抽象对象的基本部分。对于例如:在电视遥控器中,我们只能看到与电视机进行互动的按键,但我们并不知道里面有什么。

封装:封装被组合的数据和方法,并允许由公共方法访问内部数据。所以,是的,如果你的类,你把这些变量年龄,私人,你会实现封装

+0

嗯,我已经读过封装意味着捆绑数据和方法在一起,也有人在这里发布访问修饰符不会贡献封装。如果这些语句是真的,那么我定义的类确实实现了封装。我错了吗?请正确如果我是我,我的意思是,如果我把这个领域变成私人的,那么它会实现信息隐藏。 – user1720616

+0

封装为您希望防止未经授权访问的数据提供安全保护。这可以通过访问说明符和公共函数来实现。变量年龄在你的班级中被宣布为公开,所以它可以从外部访问并且可以改变,这不是我们想要的。所以我们需要保密。信息隐藏可以通过抽象来实现,这是暴露行为,不会显示如何保存/使用内部数据。所以,在这个例子中,如果你把它变成私人的,你会实现信息隐藏。 – stamhaney

3

封装和信息隐藏联系非常紧密的概念,虽然它们的精确定义取决于你要向谁倾诉变化。

“信息隐藏”的概念最早由Parnas (1971)描述,他们建议限制访问信息以减少系统的相互关联性。他建议,这将有助于将系统拆分为模块,同时保持用户友好的外部接口,并允许更改实施细节而不影响客户端。

术语“封装”由Zilles (1973)创建,用于描述使用过程来控制对底层数据的访问,以降低系统复杂性并保护数据免受危险修改。

随后,Parnas (1978)将信息隐藏和封装(和抽象)描述为同义术语,其描述隐藏可能改变的系统的细节。然而,信息隐藏和封装之间存在区别,例如Micallef (1987),他们将封装描述为“严格执行信息隐藏”。一些作者,例如Cohen (1984)Abreu and Melo (1996)描述了“封装机制”,特别是在面向对象的编程语言中,因为允许信息隐藏。

Meyers (2000)表明一段代码被封装的程度取决于代码的数量,如果代码发生了变化,它将被破坏。从这个意义上讲,私有数据和方法被封装得越少,访问它们的方法就越少。相比之下,公共数据和方法完全没有封装,因为它们可以访问的代码量是未知的。

相反,Rogers (2001)表明封装只是语言机制,允许数据与操作该数据的方法捆绑在一起。他声称封装从根本上与信息隐藏无关。然而,这个定义与其文章发表前28年的学术文献中几乎所有的用法都是相反的。有这个用法的一些其他例子,例如Archer and Stinson (1995),但它们很少,并且不是特别显着。

总之,隐藏信息是这样一种观念,即信息应该隐藏起来,以便在不影响客户的情况下改变设计。这可以提高灵活性和健壮性。封装可以被认为与信息隐藏相同,但是这个术语通常用于描述信息隐藏的实际实现,特别是在面向对象的编程中。

由于信息隐藏/封装的一个例子,考虑这个类:

public class BankAccount { 
    public int dollars; 
} 

这个类的实现是完全未封装的,这意味着它是不灵活(例如,我们不能轻易地添加在个别美分支撑未来)和不安全的(例如账户可以改变为负值)。但是,如果我们将数据隐藏在正式定义的方法界面后面,我们将获得灵活性和安全性。

public class BankAccount { 
    private int dollars; 

    public void deposit(int dollars) { 
     this.dollars += Math.max(0, dollars); 
    } 
} 

我们现在有对国家是如何修改的控制,而且我们还可以更改实施不破坏客户端代码:

public class BankAccount { 
    private int cents; 

    public void deposit(int dollars) { 
     deposit(dollars, 0); 
    } 

    public void deposit(int dollars, int cents) { 
     this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents); 
    } 
} 

该类现在更好的封装,因为我们已经隐藏有关信息,其基础实施。

0

- >封装允许我们访问某个对象的某些部分,同时限制访问其他对象。换句话说,封装允许我们做信息隐藏。

- >信息隐藏实际上是限制的过程或行为