4.3 抽象
抽象这个词与模块化设计的理念密切相关。抽象是一个实体的简化视图,它省略了不重要的细节。抽象是有用的,因为它们使我们更容易思考和掌控复杂的事物。
在模块化编程中,每个模块都以其接口的形式提供一个抽象。接口展示了模块功能的简化视图;从模块抽象的角度来看,实现的细节并不重要,所以它们在接口中被省略了。
在抽象的定义中,“不重要”这个词很关键。从抽象中省略的不重要的细节越多越好。然而,一个细节只有在不重要的情况下才可以从抽象中省略掉。抽象可能在两个方面出错。首先,它可能包括那些并不真正重要的细节;当这种情况发生时,它使抽象变得比必要的还要复杂,这就增加了使用该抽象的开发者的认知负荷。第二个错误是当一个抽象省略了真正重要的细节。这导致了模糊性:只看抽象的开发者不会获得正确使用抽象所需的所有信息。一个省略了重要细节的抽象是一个虚假的抽象(false abstraction):它可能看起来很简单,但实际上它并不简单。设计抽象的关键是了解什么是重要的,并寻求能将重要的信息量降到最低的设计。
作为一个例子,考虑一下文件系统。文件系统提供的抽象省略了许多细节,例如选择存储设备上的哪些块用于给定文件中的数据的机制。这些细节对文件系统的用户来说并不重要(只要系统提供足够的性能)。然而,文件系统实现的一些细节对用户来说是重要的。大多数文件系统将数据缓存在主存中,它们可能会延迟将新数据写入存储设备以提高性能。一些应用程序,如数据库,需要确切地知道数据何时被写入存储设备,这样它们才能确保系统崩溃后数据将被保留。因此,将数据刷新到辅存的规则必须在文件系统的接口中可见。
我们依靠抽象来管理复杂性,不仅在编程中,在我们的日常生活中也很普遍。微波炉包含复杂的电子装置,将交流电转换为微波辐射,并将这种辐射分布在整个烹饪腔中。幸运的是,用户看到的是一个简单得多的抽象,包括几个按钮来控制微波的时间和强度。汽车提供了一个简单的抽象,使我们能够在不了解电机、电池电源管理、防抱死制动、巡航控制等机制的情况下驾驶它们。
Last updated