信息隐藏如何帮助解耦构成系统的模块?
答案 0 :(得分:10)
封装(信息隐藏)允许您仅向外界公开绝对最小值。这意味着您可以在不影响客户端的情况下将非暴露位更改为您的内容。
一个例子。假设您已经实现了一个包含数组中字符串的数据结构。如果公开数组,数据结构的用户只需使用str[7]
即可获得位置7的字符串。
现在,如果您决定将数据结构重新实现为平衡树以加快字符串搜索,会发生什么。你可以通过将字符串移动到树中并将数组更改为字符串而不是字符串,而是指向树中位置的指针来完成此操作。
这将打破你的客户,因为他们会期待字符串,而不是指针。每个客户端都必须更改以从数组中获取指针,然后查看树中的指针。
但是,如果您完全隐藏了实现并只提供了一个函数:
String getStringAt (int n);
您只需更改数据结构和该功能即可保持兼容。
客户端不会中断,因为您的应用程序编程接口(API)没有更改。
我遵循的最重要的规则之一是瞄准最大连贯性,最小耦合。换句话说,一个班级应该拥有它所需要的一切(仅此而已),它应该尽可能少地与外界分享信息。
这意味着客户端可以执行的 all 调用API。不暴露非API方法或允许不受限制地访问公共变量 - 一切都应该使用setter和getter来完成。
答案 1 :(得分:1)
数据隐藏,没有那么多解耦模块,它有助于限制它们之间的耦合。
这是因为除了定义它们之外的任何其他模块都不能使用任何隐藏元素,因此限制了可能的绑定/依赖/调用它可以将模块“耦合”在一起。
换句话说,它将模块间的交换限制为在API 中明确定义的,并且这一事实在修改给定模块的实现时有很大帮助,因为这么长时间由于API保持不变,模块互操作将起作用。 (无需通过代码来查找是否以某种方式查找模块A,使用模块B中的变量x(如果B隐藏x,则它是唯一使用它的人!)