乔治于2021年04月29日 命名空间 作用域 文件路径 资源 文件系统

编程语言的中命名空间非常重要,提供了语言层面的隔离,使得不同的人可以放心的写代码而不用担心名字冲突的问题。 编程语言写成的源代码都是写到文件里存储的,不同的文件本身也是一个隔离手段。

源代码都是按照文件的方式存储的,用文件可以实现基本的隔离。但是为了多个文件之间共享代码,文件的方式就不太够用了,起不到隔离的作用的,就需要实现语言层面的隔离。

为了实现语言层面的隔离,该命名空间发挥作用了。命名空间可以认为是物理文件之上更抽象的一个概念,保证在一个命名空间内名字不冲突。

像Java语言大概只知道命名空间,也就是package。然后使用默认的类名必须和文件名一样的规则,package对应各个层次的文件夹,这种一一对应的好处就是你基本感觉不到文件系统的存在。所以在import的过程中只见package,不见文件路径。能感受到路径的是获取资源的时候,这相当于还是基于文件系统找资源。这时候又没有了命名空间的意思了。

像Protobuf则是文件路径和命名空间同时存在。在一个文件引入另一个文件的时候使用的是文件路径。引入之后的,在需要使用具体的Message解析依赖的时候使用命名空间来隔离的。这两个可以是各自独立的。Ruby 也是一样的。

文件系统的使用都有一个开始路径,选定这个锚点,从这个路径开始查找资源。这就衍生出一个绝对路径和相对路径。所谓绝对路径就是整个应用最顶层的文件路径开始查找。相对路径则是根据当前文件所在的路径作为基点开始查找资源。

Java中查找资源常见的有2种方式:

String path = "";
SomeClass.class.getResource(path);   (1)
ClassLoader.getSystemResource(path); (2)

第一种方式可以使用绝对或者相对路径查找,使用绝对路径的时候以/开始,其他情况就是使用相对路径,也就从当前SomeClass的位置开始查找。相对路径实现起来也简单,就是把当前SomeClass的路径加到待查找路径的前面,形成新的路径去查找就可以了。

第二种方式则只是用绝对路径查找,也就是从根目录开始查找。指定的查找资源路径也需要从根路径开始的路径,但是路径不需要以/开始。