- 编程与类型系统
- (美)弗拉德·里斯库迪亚
- 666字
- 2025-03-31 19:45:05
1.2.3 封装
封装指的是隐藏代码内部机制的能力,这里的代码可以是函数、类或者模块。你可能知道,我们希望利用封装,是因为它可以帮助我们处理复杂性:将代码拆分为更小的组件,每个组件只向外界公开严格需要的项,而其实现细节则被隐藏并隔离起来。
在程序清单1.6中,我们将安全除法的示例扩展为一个类,让该类确保不会出现除数为0的情况。
程序清单1.6 封装程度不足

在本例中,我们不能让除数不可变,因为我们想让调用这个API的人能够更新除数。问题在于,因为divisor成员对调用者是可见的,所以它们可以直接将divisor设为任意值,绕过对0的检查。要解决这个问题,可以将divisor标记为private,使其只能在类中使用,如程序清单1.7所示。
程序清单1.7 封装

public和private成员的内存表示是一样的,在第二个示例中,有问题的代码之所以无法编译,是因为我们提供的类型表示。事实上,public、private和其他可见性都是包含它们的类型的属性。
封装或信息隐藏使我们能够将逻辑和数据拆分到一个公有接口和一个非公有实现中。在大型系统中,这种拆分非常有帮助,因为使用接口(或抽象)使理解一段特定代码的作用变得更加简单。我们只需要理解组件的接口,而不必理解其全部实现细节。封装也有助于将非公有信息限制在一个边界内,并保证外部代码不能修改这些信息—因为它们根本就访问不了这些信息。
封装出现在多个层次,例如,服务将其API公开为接口,模块导出其接口并隐藏实现细节,类只公开公有成员,等等。与嵌套娃娃一样,代码两部分之间的关系越弱,共享的信息就越少。这样一来,组件对其内部管理的数据能够做出的保证就得到了强化,因为如果不经过该组件的接口,外部代码将无法修改这些数据。