Espace de noms (programmation)
En programmation, les espaces de noms aident à la construction de programmes modulaires. Par exemple, le symbole de fonction sin pourrait renvoyer au calcul d'une sinusoïde dans un espace de noms regroupant des fonctions mathématiques et au péché (le mot anglais sin en est une traduction) dans un autre espace de nom traitant de problèmes religieux. Cela préserve des inévitables conflits entre symboles homonymes.
Espaces de noms explicites
[modifier | modifier le code]Absence de possibilité de manipuler les espaces de nommage
[modifier | modifier le code]De nombreux langages offrent un espace de nom commun pour les identifiants de variables, de fonctions et d'opérateurs spéciaux et n'offrent pas la possibilité de manipuler (utiliser, créer) de nouveaux espaces de noms. Des conventions sur les noms des identifiants doivent alors être adoptées par les programmeurs.
Par exemple, l'API C de GTK+ est orientée objet, bien que le C ne soit pas un langage orienté objet. Pour parvenir à ce résultat, les noms des fonctions de GTK suivent une convention de nommage. En voici un échantillon[1]:
void gtk_window_set_destroy_with_parent (GtkWindow *window, gboolean setting);
void gtk_container_add (GtkContainer *container, GtkWidget *widget);
void gtk_container_add_with_properties (GtkContainer *container, GtkWidget *widget, const gchar *first_prop_name, ...);
void gtk_widget_show (GtkWidget *widget);
void gtk_widget_show_now (GtkWidget *widget);
void gtk_widget_show_all (GtkWidget *widget);
Le nom d'une fonction se décompose comme suit :
- Le premier terme, désigne la bibliothèque à laquelle la fonction appartient (ex: gtk)
- le deuxième terme, désigne la classe des objets sur lequel la fonction peut agir (ex: window, signal, widget, etc.)
- Le troisième terme est un verbe d'action qui décrit l'opération effectuée (ex: set, add, show, etc.)
- Enfin, d'autres termes peuvent être ajoutés optionnellement pour mieux spécifier ce que fait la fonction.
L'inconvénient principal est que les noms de fonctions peuvent devenir très longs. C'est pourquoi certains langages offrent des espaces de nommage permettant au développeur d'éviter les collisions de noms facilement et permettent donc d'utiliser des noms de fonctions plus courts.
Manipulation des espaces de nommage
[modifier | modifier le code]Certains langages offrent les espaces de nom au programmeur. Ils s'appellent: namespace pour le C++ et Microsoft .NET, package pour Java et Common Lisp ou module pour Python ou encore OCaml.
Common Lisp fournit également des packages, qui sont des collections de symboles, en plus de la dizaine d'espaces de noms fournis en standard par le langage.
Espaces de noms implicites
[modifier | modifier le code]Dans certains cas, la grammaire du langage permet de définir des espaces de noms implicites. Par exemple dans le langage C, le code suivant est valide :
struct address {
int number;
const char* road;
};
struct phone {
const char* number;
const char* prefix;
};
struct address myaddress;
struct phone myphone;
myaddress.number = 23;
myphone.number = "67 45 00 23";
Le compilateur possède en effet suffisamment d'informations pour résoudre l'homonymie du symbole number.
Espaces de noms locaux
[modifier | modifier le code]Les langages de programmation modernes créent un espace de nom dédié pour chaque appel de fonction. Ils supportent donc l'usage de variable locale qui permettent l'implémentation d'algorithmes récursifs. Cette notion est appelée la fermeture d'un identifiant, on parle aussi de visibilité ou de portée.
De nombreux langages permettent un contrôle plus complexe des fermetures: les variables globales sont visibles dans l'ensemble du programme, on peut également trouver des variables qui sont limitées au fichier courant ou à un bloc arbitraire (par exemple en C à l'aide des symboles accolades ).
La méthode utilisée pour résoudre les problèmes d'homonymie parmi les différents espaces de nom revient à ordonner ces différents espaces de noms locaux pour choisir le premier qui contient le symbole recherché. On distingue généralement deux grandes méthodes de classement: la portée lexicale, utilisée dans un langage comme le C et la portée dynamique utilisée par exemple en Perl.
Voir aussi
[modifier | modifier le code]Article connexe
[modifier | modifier le code]Références
[modifier | modifier le code]- (en) Documentation développeur de la classe GtkContainer de GTK+