封装与抽象
在 Unix、Linux 系统中,有一句经典的话:“Everything is a file”,翻译成中文就是:“一切皆文件”。这句话的意思就是,在 Unix、Linux 系统中,很多东西都被抽象成文件
这样一个概念,比如 Socket、驱动、硬盘、系统信息等。它们使用文件系统的路径作为统一的命名空间(namespace),使用统一的 read、write 标准函数来访问。比如,我们要查看 CPU 的信息,在 Linux 系统中,我们只需要使用编辑器像打开其他文件一样,打开 /proc/cpuinfo,就能查看到相应的信息。除此之外,我们还可以通过查看 /proc/uptime 文件,了解系统运行了多久,查看 /proc/version 了解系统的内核版本等。
封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能基于统一的访问方式,来访问底层不同类型的设备。这样做的好处是,隔离底层设备访问的复杂性,统一的访问方式能够简化上层代码的编写,并且代码更容易复用。除此之外,抽象和封装还能有效控制代码复杂性的蔓延,将复杂性封装在局部代码中,隔离实现的易变性,提供简单、统一的访问接口让其他模块来使用。其他模块基于抽象的接口而非具体的实现编程,代码会更加稳定。