Почему файлы и каталоги не имеют отдельных пространств имен? - PullRequest
1 голос
/ 31 мая 2009

Файлы и каталоги могут иметь разные пространства имен и при этом использоваться для идентификации конкретных файлов, поскольку файл и каталог с одинаковым именем могут различаться по типу вещей.

Поле примитива и поле ссылки также могут иметь разные пространства имен (в Java), потому что, если поле примитива и ссылка имеют одно и то же имя, они могут быть идентифицированы как разные вещи.

Отдельные пространства имен используются в других местах, подобных этому. Например, в Java у вас может быть метод exampleName() и поле exampleName, и хотя они имеют одно и то же имя, они различаются по типу вещей.

Ответы [ 3 ]

2 голосов
/ 31 мая 2009

Во-первых, этот вопрос зависит от языка. В чистых языках ООП нет различия между атомарными и составными элементами. Все является объектом. По аналогичной причине в чисто функциональном языке нельзя иметь одинаковые функции и переменные.

Во-вторых, если у вас есть полиморфные операции, невозможно определить, на какую переменную вы ссылались. Например, вы не можете иметь разные пространства имен для файлов и каталогов из-за полиморфных операций, таких как

cp foo bar

cp работает с файлами и директориями, и если у вас разные пространства имен, вы не сможете понять, что вы имели в виду.

1 голос
/ 31 мая 2009

Я не верю, что это было бы хорошей идеей. Я полагаю, что причины связаны с такими вещами, как производительность и простота кода файловой системы. Если список каталога должен идти по 2 или 3 или более различным путям в зависимости от того, сколько разных пространств имен вы считаете нужным, это, вероятно, усложнит код.

Кроме того, учтите возможную путаницу у конечного пользователя. В настоящее время у нас есть своего рода пространство имен, доступное в файловых системах с использованием расширений файлов. Вы можете иметь file.txt, file.dll и file.exe, все они существуют в одном каталоге. То, что происходит, когда эти файлы присутствуют одновременно, вызывает беспокойство - это был один из способов для вирусописателей использовать форму социальной инженерии, чтобы заставить вас щелкнуть не тот файл. Представьте себе, если бы вы могли перепутать каталог с файлом с таким же именем?

0 голосов
/ 31 мая 2009

Каталоги и файлы не обязательно такие разные. Они обе являются записями в своем родительском каталоге, просто с флагом, указывающим, является ли запись каталогом или нет. Вы можете открыть каталог и прочитать его так же, как если бы это был файл, просто некоторые другие операции с ним возможны - символические ссылки работают точно так же. (Это описание смещено в сторону представления файловой системы Unix, но я думаю, что представление DOS / Windows работает почти так же). В любом каталоге есть набор имен членов, и файловая система применяет ограничение уникальности, согласно которому в каталоге может быть только один член с заданным именем.

Думая об именах методов Java по сравнению с именами полей - в C вы не могли иметь глобальную функцию и глобальную переменную с одинаковыми именами, потому что все символы в объектном файле находятся в одном пространстве имен. Но вы могли бы с C ++, потому что функция "void foo ()" была сопоставлена ​​с искаженным именем символа ("foo__vv" или что-то). Таким образом, это не так, что у них есть отдельное пространство имен, так как ключ к пространству имен отличается для поля «foo» и метода «foo ()». Учитывая то, что вы не можете получить столкновения клавиш, они выглядят как отдельные пространства имен, но действительно ли это так реализовано?

...