1

文件和目录可以有不同的命名空间,但仍然可以用来标识特定的文件,因为同名的文件和目录可以通过不同的事物来区分。

原始字段和引用字段也可以具有不同的名称空间(在 Java 中),因为如果原始字段和引用字段具有相同的名称,则可以通过不同种类的事物来识别它们。

像这样在其他地方使用单独的名称空间。例如,在 Java 中,您可以拥有一个方法exampleName()和一个字段exampleName,尽管它们具有相同的名称,但它们是通过不同种类的事物来区分的。

4

3 回答 3

2

首先,这个问题是特定于语言的。在纯 OOP 语言中,原子元素和复合元素之间没有区别。一切都是对象。出于类似的原因,在纯函数式语言中,您不能将函数和变量命名相同。

其次,如果您有多态操作,则无法判断您引用的是哪个变量。例如,由于多态操作,您不能为文件和目录使用不同的命名空间,例如

cp foo bar

cp 适用于文件和目录,如果您有不同的名称空间,则无法说出您的意思。

于 2009-05-31T09:04:50.570 回答
1

我不相信这是个好主意。我想原因涉及文件系统代码的性能和简单性。如果目录列表必须走 2 或 3 或更多不同的路径,具体取决于您认为应该拥有多少不同的命名空间,这可能会使代码复杂化。

此外,考虑可能出现的最终用户混淆。目前,我们通过使用文件扩展名在文件系统中提供了一种命名空间。您可以让 file.txt 和 file.dll 和 file.exe 都存在于同一目录中。当这些文件同时存在时会发生什么是一个值得关注的问题 - 这是病毒编写者使用某种社会工程形式让您点击错误文件的一种方法。想象一下,如果您也可以将目录与同名文件混淆?

于 2009-05-31T09:05:48.710 回答
0

目录和文件不一定如此不同。它们都是父目录中的条目,只是带有一个标志来指示条目是否是目录。您可以打开一个目录并像读取文件一样读取它,只是可以对其进行某些其他操作-符号链接的工作方式相同。(此描述偏向于 Unix 文件系统视图,但我认为 DOS/Windows 视图的工作方式大致相同)。在任何目录中,都有一组成员名称,并且文件系统强制执行唯一性约束,即目录只能有一个具有给定名称的成员。

考虑 Java 方法名称与字段名称的比较——回到 C 语言中,您不能拥有同名的全局函数和全局变量,因为目标文件中的所有符号都在一个命名空间中。但是你可以使用 C++,因为函数“void foo()”被映射到损坏的符号名称(“foo__vv”或其他东西)。所以与其说它们有一个单独的命名空间,不如说对于字段“foo”和方法“foo()”来说,进入命名空间的键是不同的。鉴于您无法获得键冲突,它们看起来像是单独的命名空间,但它真的是这样实现的吗?

于 2009-05-31T13:19:23.160 回答