1.3.4 信息隐藏
您已经看到,抽象要求为每个模块编写功能规范,描述外部的或者公开的状况。此外,抽象还可以帮助确定应该隐藏的细节,也就是不应该出现在规范中而是应该私有的细节。信息隐藏原则指出,不仅应该在模块内部隐藏这些细节,还应该确保其他模块不会干扰这些隐藏的细节。
当编写一个模块的规范时,必须明确可以在模块中隐藏的细节。信息隐藏原则不仅涉及隐藏这些细节,而且还包括让这些细节在模块外不可访问。理解信息隐藏的方法之一是假想围绕着程序执行的不同任务的墙。这些墙可以阻止任务缠绕在一起,这些围绕着任务的墙阻止其他任务"看到"某个任务是如何执行的。
注释:所有的模块以及ADT都应该隐藏一些内容
然而,模块不可能完全独立。尽管MyProgram不知道sort是如何执行的,但是它必须知道sort的任务是什么,以及如何执行初始化。例如,假定程序要对某个已经排序的名字数组执行操作,这个程序可能需要在数组中搜索某个名字,或者按照字母表顺序显示名字。因此这个程序需要一个对名字数组排序的sort函数。尽管程序的其余部分知道sort可以对数组排序,但是并不关心sort如何完成任务。
因此,考虑墙的一个小裂缝,如图1-2所示。这个裂缝不够大,因此外界无法看到函数内部的运行状况,但是数据可以从这个裂缝进入并输出。这个裂缝就是函数的原型、声明或者头部。这个裂缝包含了函数或者方法的名称、参数列表以及返回类型。例如,可以向函数sort传递一个数组,这个函数将返回一个已经排序的数组。输入和输出已经由函数规范的条款规定:如果以这种方式使用函数,函数将执行这些确定的操作。

假定开发了更为快速的排序算法,由于函数sort独立于程序中的其他模块,因此新的算法可以在sort函数中实现而不影响其他模块。这样,如果MyProgram使用了sort而执行排序的算法以及实现发生了改变,则MyProgram不受影响,如图1-3所示。墙阻止sort的算法影响MyProgram的算法。

提示:信息隐藏限制了处理模块和数据的方式。作为模块的用户,不需要担心模块的实现细节。作为模块的实现者,不需要担心模块的使用。