信息隐藏和封装之间有什么区别?

信息隐藏封装之间有什么区别?

我已经读到过,封装意味着将数据和应该对它们进行操作的过程捆绑在一起。如果是这样,以下类是否实现了封装?

class IsThisEncapsulation {
    public int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在声明数据属性会实现信息隐藏吗?ageprivate


答案 1

封装和信息隐藏是非常紧密相连的概念,尽管它们的精确定义取决于你与谁交谈。

Parnas(1972)首先描述了“信息隐藏”的概念,他建议应该限制对信息的访问,以减少系统的相互联系。他建议,这将有助于将系统拆分为模块,同时保持用户友好的外部界面,并允许在不影响客户端的情况下更改实现细节。

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

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

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

相反,Rogers(2001)认为封装只是一种语言机制,它允许数据与对该数据进行操作的方法捆绑在一起。他声称封装从根本上与信息隐藏无关。然而,这个定义与在他的文章发表之前的28年里,学术文献中几乎所有关于该术语的用法背道而驰。还有其他一些这种用法的例子,例如Archer和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);
    }
}

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


答案 2

好吧,我知道将字段设为私有,然后使字段的 setter 和 getter 是封装的。但是,封装是否意味着这一点?

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

信息隐藏:

-->机制,用于限制对某些对象组件的访问。您上面的例子是信息隐藏的情况,如果您将其设为私有。age


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

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

第二个定义的动机是,在许多OOP语言中,隐藏组件不是自动的或可以被覆盖的;因此,信息隐藏被那些喜欢第二种定义的人定义为一个单独的概念。

参考资料: 维基页面