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