信息隐藏

计算机科学信息隐藏是隔离的原则设计决策在一个计算机程序;电脑程序最有可能改变的情况,因此如果更改了设计决策,则保护程序的其他部分免受广泛的修改。保护涉及提供稳定的界面这保护了该计划的其余部分免受实施的影响(其细节可能会更改)。以另一种方式写的信息隐藏是防止某些方面的能力班级或者软件组件从可访问到它的客户,使用编程语言功能(例如私人变量)或明确的导出策略。

概述

期限封装通常与信息隐藏式互换使用。但是,并非所有人都同意两者之间的区别。人们可能会认为隐藏的信息是原理和封装是技术。软件模块通过将信息封装到呈现接口的模块或其他构造中来掩盖信息。[1]

信息隐藏的常见用途是隐藏数据的物理存储布局,以便如果更改,则更改仅限于总程序的一小部分。例如,如果一个三维点(xyz)在一个计划中代表三个浮点标量变量,后来,表示形式更改为单个大批大小三的变量,一个牢记隐藏的信息设计的模块将保护该程序的其余部分免受此类更改。

面向对象的编程,信息隐藏(通过筑巢类型)通过移动代码来降低软件开发风险依赖性关于不确定的实施(设计决定)界面。接口的客户端完全通过接口执行操作,因此,如果实现更改,则客户不必更改。

封装

在他的书中面向对象的设计Grady Booch定义的封装为“构成其结构和行为的抽像元素的划分的过程;封装有助于分离抽象的合同界面及其实施。”[2]

目的是实现变革的潜力:可以改进组件的内部机制而不会影响其他组件,或者可以用支持相同公共界面的不同组件代替组件。封装还可以通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性。封装的另一个好处是,它通过限制软件组件之间的相互依赖性来降低系统的复杂性,从而提高鲁棒性。[2]

从这个意义上讲,封装的概念比在面向对象的编程中应用的方式更为笼统。例如,关系数据库被封装在其唯一的公共接口是一个查询语言(如SQL),它隐藏了数据库管理系统的所有内部机械和数据结构。因此,封装是粒度的各个级别的良好软件体系结构的核心原则。

将软件封装在接口后面,可以构建模仿现实世界中对象的行为和相互作用的对象。例如,简单的数字闹钟是一个现实世界对象外行可以使用和理解。他们可以理解闹钟的作用,以及如何通过提供的接口(按钮和屏幕)使用它,而无需了解时钟内部的每个部分。同样,如果时钟被其他模型替换,则外行人可以继续以相同的方式使用它,前提是该接口的工作原理相同。

在面向对象的编程语言的更具体的设置中,该概念是指信息隐藏机制,捆绑机制或两者的组合。(看封装(面向对象的编程)有关详细信息。)

历史

信息隐藏的概念首先由大卫·帕纳斯(David Parnas)1972年。[3][4]在此之前,Richard Gauthier和Stephen Pont在1970年的书中讨论了模块化设计系统程序虽然模块化编程多年以前在许多商业网站上使用过本身,尤其是我/o子系统软件库 - 没有获得“信息隐藏”标签 - 但出于类似的原因以及更明显的原因代码重复使用原因。[需要澄清]

例子

信息隐藏是将任何设备,软件或硬件分为功能模块的有效标准。例如,汽车是一件复杂的设备。为了使汽车的设计,制造和维护合理,复杂的设备分为模块特定的接口隐藏了设计决策。通过以这种方式设计汽车,汽车制造商还可以提供各种选择,同时仍然拥有经济制造的汽车。

例如,汽车制造商可能具有汽车的豪华版本以及标准版本。豪华版带有比标准版本更强大的引擎。设计两个不同的汽车发动机的工程师,一个用于豪华版本,另一种用于标准版本,为这两个发动机提供了相同的界面。两种发动机都适合汽车的发动机舱,这两种版本之间都是相同的。这两个发动机都适合相同的变速箱,相同的发动机安装座和相同的控件。发动机的差异是,更强大的豪华版本具有更大的位移,并通过燃油喷射系统进行编程,以提供较大的流量发动机所需的燃油空气混合物。

除了更强大的引擎外,豪华版本还可以提供其他选项,例如带有CD播放器的更好的广播,更舒适的座椅,更好的悬架系统,带有更宽的轮胎和不同的油漆颜色。随着所有这些更改,大多数汽车在标准版本和豪华版本之间都是相同的。带有CD播放器的收音机是一个模块,该模块替换了豪华模型中的标准收音机(也是一个模块)。与标准座椅类型的座椅安装更舒适的座椅。无论座椅是皮革还是塑料,还是提供腰部支撑,都无关紧要。

工程师通过将任务分为分配给团队的工作来设计汽车。然后每个团队设计他们的零件对于特定的标准或界面,该标准或界面允许团队在组件设计中的灵活性,同时确保所有组件都可以合并在一起。

汽车制造商经常将相同的核心结构用于几种不同的型号,部分是成本控制措施。这样的平台“还提供了隐藏信息的示例,因为可以在不知道要在轿车还是掀背车中使用地板平面图。

如本示例可以看出,信息隐藏提供了灵活性。这种灵活性使程序员可以在更改计算机程序以更好地满足用户需求时修改正常演化过程中计算机程序的功能。当计算机程序经过精心设计时,使用信息隐藏的原理将源代码解决方案分解为模块时,进化更改要容易得多,因为这些更改通常是本地的,而不是全局更改。

汽车在它们与驾驶员的接口方面提供了另一个例子。他们提出了对人们进行培训和许可的标准接口(踏板,轮子,移位器,信号,仪表等)。因此,人们只需要学习开车。他们不需要学习每次开车新型号的完全不同的驾驶方式。(当然,有手动和自动传输以及其他此类差异,但总的来说,汽车保持统一的界面。)

也可以看看

笔记

  1. ^罗杰斯,Wm。保罗(2001年5月18日)。“封装不是信息隐藏”.Javaworld。检索2020-07-20.
  2. ^一个bBooch,Grady(2007)。带有对象的分析和设计。Addison-Wesley。pp。51–52。ISBN 978-0-201-89551-3.
  3. ^帕纳斯(David L.)(1972)。“在将系统分解为模块中的标准”.ACM的通信.15(12):1053–58。doi10.1145/361598.361623.S2CID 53856438.
  4. ^斯科特,迈克尔·L。(2009)[2000]。布洛伊,曼弗雷德;恩特,恩斯特(编辑)。编程语言语用学(第三版)。摩根·考夫曼(Morgan Kaufmann)出版商。p。173。doi10.1007/978-3-642-59412-0.ISBN 978-3-540-43081-0.S2CID 2698265.

参考

  • 帕纳斯(David L.)(1971)。“设计方法的信息分布方面”(PDF)。在查尔斯·弗雷曼(Charles V. Freiman)和约翰·格里菲斯(John E. Griffith)和杰克·罗森菲尔德(Jack L. Rosenfeld)中。信息处理,1971年IFIP大会论文集,第1卷 - 基础和系统,卢布尔雅那,南斯拉夫,1971年8月23日至28日,1971年8月23日至28日。IFIP大会1971年。1.北部。pp。339–344。doi10.1184/r1/6606470.v1.
  • 帕纳斯(David L.)(2002)。“信息隐藏的秘密历史”。在Manfred Broy和Ernst Denert(编辑)中。软件开拓者。 Springer-Verlag Berlin Heidelberg。ISBN 978-0-12-374514-9.