Tcl / Tk
Les namespace
Auteur :
Arnaud LAPREVOTE
Linox Free&Alter Soft
152, rue de Grigy
57070 METZ
tel: 03 87 50 87 90 - 06 11 36 15 30
fax : 03 87 75 19 26
Email : arnaud.laprevote@linbox.com
1. Introduction
Une fois de plus j'ai été piqué des informations sur le wiki de La Rochelle Innovation.Les "namespace" (espaces de nommage) permettent d'organiser de manière simple des collections très importantes de fonction. Le problème est le suivant. Imaginez que vous ayez un programme avec des centaines de milliers de fonctions, comment être sûr qu'il n'y a pas 2 fonctions ayant le même nom ou 2 variables globales identiques ?
Les namespace permettent de résoudre ce problème en créant un "espace de nommage" dans lequel des fonctions et des variables seront définies. A l'intérieur de l'espace de nommage on pourra accéder aux fonctions et variables sans se poser de questions, à l'extérieur il faudra "qualifier" le nom de la variable ou de la fonction.
2. Un exemple, un exemple, un exemple
Nous allons donc créer un namespace contenant des fonctions de debug.
#!/usr/bin/tclsh
namespace eval mon_debug {
set DEBUG 0
proc mon_puts { message } {
puts $message
}
proc debug { message } {
variable DEBUG
if $DEBUG {
mon_puts $message
}
}
proc debug_parray { current_array } {
upvar $current_array array_to_debug
variable DEBUG
if $DEBUG {
foreach name [array names array_to_debug] {
mon_puts "${current_array}\($name\)=$array_to_debug($name)"
}
}
}
}
::mon_debug::debug "Premier test - rien n'apparait"
set ::mon_debug::DEBUG 1
::mon_debug::debug "Deuxième message - lui apparaît"
On peut définir des namespace dans des namespace, dans des namespaces, .... et l'on y accède en séparant par :: les namespaces de manière hiérarchique.
Le namespace global est ::. Donc si vous écrivez global toto, vous pouvez aussi écrire ::toto pour accéder à la variable.
Ce qu'il faut retenir :
| Nom | Définition |
| namespace eval nom { code } | Création d'un namespace |
| variable | Strictement comme global, mais à l'intérieur d'un namespace pour une variable du namespace |
| ::nom::variable ou ::nom::ma_procedure | Accès à une variable ou appel d'une fonction d'un espace de nommage |
Il y a ensuite moyen "d'exporter" une fonction d'un namespace dans le namespace global, tout cela pour économiser quelques lignes de code, mais franchement, pour moi l'intérêt est limité. Vous écrirez toujours les noms qualifiés et voila tout.



