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?
la source
using
un espace de noms particulier et que vous n'avez pas à placer le préfixe au début des identifiants dans cet espace de noms.using
, parimport xxxxxxxxx as yyy
, etc.using SDL;
ou devoir taperSDL_*
partout?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.
la source
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.
la source
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 a
relations ainsi que desis a
relations (d'héritage).la source