2009-05-31 12 views
1

Les fichiers et les répertoires peuvent avoir des espaces de noms différents et être toujours utilisés pour identifier des fichiers spécifiques, car un fichier et un répertoire portant le même nom peuvent être distingués en étant différents types de choses.Pourquoi les fichiers et répertoires n'ont-ils pas d'espaces de noms distincts?

Les champs de champ et de référence primitifs peuvent également avoir des espaces de noms différents (en Java), car si une primitive et un champ de référence portent le même nom, ils peuvent être identifiés par différents types de choses.

Les espaces de noms distincts sont utilisés ailleurs comme ceci. Par exemple, en Java, vous pouvez avoir une méthode exampleName() et un champ exampleName, et bien qu'ils aient le même nom, ils se distinguent en étant différents types de choses.

+0

le texte de la méthode et le test de terrain n'ont pas le même nom –

+0

@ 1800 merci! Je tape souvent du texte et test. Je les ai changé pour un meilleur nom ("exampleName"), BTW: J'ai marqué cela comme un wiki, donc je pense que cela signifie que vous pouvez le modifier directement (?IIUC) – 13ren

+0

@ 1800. euh, le commutateur wiki ne semblait pas rester allumé - c'est maintenant. – 13ren

Répondre

1

Je ne crois pas que ce serait une bonne idée. J'imagine que les raisons impliquent des choses comme la performance et la simplicité du code du système de fichiers. Si une liste de répertoires devait descendre 2 ou 3 chemins différents ou plus selon le nombre d'espaces de noms différents que vous pensez avoir, cela compliquerait probablement le code.

En outre, considérez la confusion de l'utilisateur final qui pourrait survenir. Actuellement, nous avons une sorte d'espace de noms disponible dans les systèmes de fichiers en utilisant les extensions de fichiers. Vous pouvez avoir file.txt et file.dll et file.exe tous existants dans le même répertoire. Ce qui se passe lorsque ces fichiers sont présents simultanément est un sujet de préoccupation - cela a été une méthode pour les auteurs de virus d'utiliser une forme d'ingénierie sociale pour vous inciter à cliquer sur le mauvais fichier. Imaginez si vous pouviez aussi confondre un répertoire avec un fichier du même nom?

+0

Pour la performance, je ne pense pas que ce serait un problème: le système doit savoir quel type vous recherchez avant de le rechercher (si deux ont le même nom), il devrait savoir dans quel espace de noms il doit regarder avant de faire la recherche. – 13ren

2

D'abord, cette question est spécifique à la langue. Dans les langages OOP purs, il n'y a pas de distinction entre les éléments atomiques et composés. Tout est un objet. Par une raison similaire dans un langage fonctionnel pur, vous ne pouvez pas avoir une fonction et une variable nommées de la même manière. Deuxièmement, si vous avez des opérations polymorphes, vous ne pouvez pas dire à quelle variable vous vous êtes référé. Par exemple, vous ne pouvez pas avoir des espaces de noms pour les fichiers et répertoires, en raison des opérations polymorphes, comme

cp foo bar 

cp fonctionne sur les fichiers et répertoires, et si vous avez différents espaces de noms, il n'y a aucun moyen de dire ce vouliez-vous dire.

+0

Oui, ceci est un facteur: s'il y a différents espaces de noms, vous devez indiquer quel espace de noms vous voulez dire. Dans mon exemple de champs vs. méthodes, le "()" distingue joue ce rôle. Pour votre exemple "cp", cela pourrait être fait en ajoutant un "/ pour les répertoires, par exemple: cp foo/bar/Cela vaut la peine de se tracasser le problème – 13ren

0

Les répertoires et les fichiers ne sont pas nécessairement si différents. Ce sont deux entrées dans leur répertoire parent, juste avec un drapeau pour indiquer si une entrée est un répertoire ou non. Vous pouvez ouvrir un répertoire et le lire comme s'il s'agissait d'un fichier, juste que certaines autres opérations sont possibles - les liens symboliques fonctionnent de la même manière. (Cette description est orientée vers la vue du système de fichiers Unix, mais je pense que la vue DOS/Windows fonctionne de la même manière). Dans tout répertoire, il existe un ensemble de noms de membres, et le système de fichiers impose la contrainte d'unicité qu'un répertoire ne peut avoir qu'un seul membre avec un nom donné. En pensant aux noms de méthodes Java comparés aux noms de champs --- en C, vous ne pouviez pas avoir une fonction globale et une variable globale avec le même nom, car tous les symboles dans le fichier objet sont dans un espace de noms unique. Mais vous pourriez avec C++, parce qu'une fonction "void foo()" a été mappée au nom de symbole mutilé ("foo__vv" ou quelque chose). Donc ce n'est pas tellement qu'ils ont un espace de noms séparé, car la clé dans l'espace de noms est différente pour un champ "foo" vs une méthode "foo()". Étant donné que vous ne pouvez pas obtenir d'affrontements de clé, ils ressemblent à des espaces de noms distincts, mais est-ce vraiment la façon dont il est implémenté?

+0

J'utilise namespacing pour faire référence à un effet, pas à une implémentation spécifique.Les noms fournis dans différents espaces de noms ne s'affichent pas, alors ils sont dans des espaces de noms séparés.Vous pouvez l'implémenter avec le nom munging (comme " foo_w "), ou avec des hashtables séparés, ou probablement d'autres façons – 13ren

+0

Je suis d'accord que les répertoires et les fichiers ne sont pas si différents - ils peuvent être placés dans le même espace de nommage mais ils peuvent aussi être placés dans des espaces de noms différents libéré om - un fichier et dir peuvent avoir le même nom). Ma question est, quelles sont les raisons de faire le premier? – 13ren