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