Почему файлы и каталоги не имеют отдельных пространств имен?

StackOverflow https://stackoverflow.com/questions/931672

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

cp foo bar

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top