Avantages des espaces de noms / packages

14

Certains langages de programmation (par exemple Java et C ++) ont des fonctionnalités de langage appelées "packages" ou "espaces de noms". Est-il vraiment utile d'avoir des espaces de noms? Il est possible de marquer des fonctions et des classes comme appartenant à une bibliothèque particulière sans utiliser une telle fonctionnalité de langage, comme le fait SDL (par exemple SDL_BlitSurface()). Les espaces de noms ne sont-ils pas assez utiles pour valoir la peine? Sont-ils utiles dans les bibliothèques mais pas dans les applications? Sont-ils utiles partout sauf dans les petits projets? Pensées?

compman
la source

Réponses:

16

Les préfixes de nom ne sont-ils pas la même chose que l' espacement de noms , sauf que c'est fait d'une manière moins utile et plus difficile à lire / à analyser? La question ne se répond-elle pas?

Nicole
la source
Le simple fait de mettre un préfixe au début du nom d'un identifiant n'est pas la même chose que d'utiliser une fonction de langage comme les espaces de noms. Par exemple, en C ++, vous pouvez dire que vous êtes usingun espace de noms particulier et que vous n'avez pas à placer le préfixe au début des identifiants dans cet espace de noms.
compman
2
@ user9521 - c'est mon point ...
Nicole
+1 Le grand avantage des espaces de noms est que vous pouvez ignorer / raccourcir le préfixe lorsqu'il n'est pas nécessaire - dans l'espace de noms où la chose particulière référencée est définie, par using, par import xxxxxxxxx as yyy, etc.
1
Puisque la plupart des programmeurs sont paresseux, préférez-vous déclarer using SDL;ou devoir taper SDL_*partout?
Berin Loritsch
2
+1, mais je pense que vous vouliez vraiment dire "moins utile, plus difficile à lire et non vérifié par le compilateur".
Larry Coleman
5

La plupart (toutes?) Des langues avec des espaces de noms ont tendance à être orientées objet. Plusieurs fois, un nom lisible par l'homme pour un type est approprié, même s'il existe plusieurs implémentations incompatibles. (cela soulève d'autres problèmes de réutilisation orientée objet, mais ce n'est pas de cela qu'il s'agit). Par exemple, en Java, vous disposez d'un temporisateur utilisé pour les tâches d'interface utilisateur en arrière-plan et d'un temporisateur utilisé pour les tâches d'application en arrière-plan (non liées à AWT / Swing). L'espace de noms vous permet d'avoir ces objets du même nom vivant dans différentes sous-API.

La raison pour laquelle les espaces de noms ont vu le jour était liée à la tâche déraisonnable d'anticiper ce que les autres développeurs nommeront leurs objets. C ++ a introduit le concept (ou du moins était le premier langage auquel j'ai été exposé avec le concept), et il a été utile même s'il n'y avait pas de directives sur les meilleures pratiques d'utilisation. Java a adapté le concept et ajouté quelques "meilleures pratiques" qui incluaient le nom de votre entreprise dans l'espace de noms. De cette façon, vous n'aviez qu'à vous soucier de votre propre entreprise.

Le préfixe peut devenir assez compliqué. Quand l'appliquez-vous? Quand ne l' appliquez -vous pas ? Les structures / classes / méthodes globales obtiennent-elles le préfixe? Et les méthodes? Qu'en est-il des propriétés dans la structure. J'ai vu toutes ces choses dans le code, mais heureusement pas tout à la fois. Les espaces de noms offrent une certaine prévisibilité à toutes ces questions et en font une fonctionnalité de langue plutôt qu'une «meilleure pratique» personnelle.

Berin Loritsch
la source
Haskell a des espaces de noms (modules) et n'est pas orienté objet.
Jeremy Heiler
3

Je pense que les espaces de noms sont une excellente idée. Ils aident à prévenir les conflits de noms en limitant la portée d'un nom. Dans les packages Java, la convention de dénomination des packages suggérée est basée sur les noms de domaine, qui doivent être uniques, ce qui permet d'éviter les conflits de noms sur les bibliothèques personnalisées. Dans l'ensemble, ils rendent le nommage un peu plus unique au sens large, tout en laissant au programmeur un peu plus de liberté pour nommer ses morceaux sans avoir à suivre une convention de nommage obscure.

Michael K
la source
1
Cependant, dans le cas de la convention spécifique de Java, tout le monde n'a pas de site Web. De plus, si jamais vous déplacez votre programme d'un site Web à un autre (par exemple, Sourceforge vers Github), il serait logique mais peu pratique de modifier les packages si d'autres choses dépendent de votre code.
compman
1
La convention de Java s'applique à votre organisation, pas à l'endroit où elle est hébergée. Vous pouvez simplement vous déclarer une organisation et en finir avec elle. Il y a aussi le problème des URL autorisant les caractères qui ne peuvent pas être utilisés dans les noms de package. Mais nous n'irons pas là-bas. Donc pour vous, utilisez simplement "me.user9521" comme nom de package et vous êtes prêt.
Berin Loritsch
1
La convention ne concerne pas les noms de sites Web, mais les noms de domaine. Vous pouvez avoir un domaine sans site Web.
David Thornley
1

Les espaces de noms / modules / packages sont utiles pour éviter les conflits de noms. Il en va de même pour le préfixe de nom, mais les espaces de noms ont l'avantage supplémentaire de pouvoir importer des symboles dans l'espace de noms actuel afin que vous n'ayez pas à vous soucier de l'ensemble de Namespace :: *.

Certaines langues (comme Python) étendent cette capacité en vous permettant d'importer uniquement des symboles spécifiques dans votre module actuel ou d'importer des symboles sous un nom différent. Ceci est utile si vous n'êtes intéressé que par quelques classes / fonctions / constantes ou si certains des symboles entrent en conflit avec les symboles de votre espace de noms mais d'autres non.

Certains langages (comme Ruby) vous permettent d'inclure les méthodes d'un module dans votre classe. Ceci est utile pour le polymorphisme et les génériques. Par exemple, si vous avez plusieurs classes qui ont des itérateurs qui agissent de la même manière, vous pouvez mélanger des méthodes dans toutes ces classes à partir d'un module distinct qui fournit des méthodes pour trier et filtrer les données dans l'objet. Cela permet des has arelations ainsi que des is arelations (d'héritage).

david4dev
la source