andre.connes@toulouse.iufm.fr
v 0.1 6 mai 2002
v 0.2 29 décembre 2002
Il ne s'agit pas de contraintes dans le but d'ennuyer le développeur bénévole.
Il s'agit de respecter quelques règles simples qui, dans le passé, ont permis une relecture aisée du code produit.
Car une application naît, vit par la volonté de différents développeurs.
Mais elle meurt si elle est illisible.
Enfin, la lisibilité est source d'apprentissage.
Développer un programme c'est écrire du code avec l'intention de communiquer avec des personnes plutôt qu'avec des machines !
Les commentaires donnent des indications au lecteur mais sont ignorées du calculateur (sauf si ce sont des directives pour l'interpréteur).
Bien documenter le code par des commentaires est difficile mais c'est une nécessité.
Commentons sans excès, mais commentons, les parties difficiles à comprendre.
Evitons les commentaires
set i [expr $i - 1] ;# passer à l'élément suivant
set i [expr $i + 1] ;# ajouter 1 à la variable i
Préférons donc
set i [expr $i + 1] ;# passer à l'individu suivant
encore mieux
incr $i ;# passer à l'individu suivant
Tout programme contient deux sortes de symboles : les premiers appartiennent au langage, les seconds sont les identifieurs.
Les premiers peuvent être un caractère spécial ou une paire de caractères comme
+ - ! == != > < { } [ ] # ;# etc.
ou un mot réservé comme
if else elsif while proc etc.
Les identifieurs peuvent être des identifieurs standard comme
puts gets set pack frame etc.
ou des identifieurs définis par l'utilisateur.
Le choix des identifieurs définis par l'utilisateur est fondamental : un bon choix rend le programme plus facile à lire, à comprendre, à modifier, à corriger. Un identifieur long n'est pas nécessairement le meilleur. Si un identifieur n'est utilisé que peu de fois, dans une partie réduite du programme, une lettre peut être un bon identifieur, mais une lettre ne sera pas un bon choix pour un identifieur utlisé fréquemment dans différentes parties du programme.
noPage numPage
sont des identifieurs plus compréhensibles que NP ou XXX pour désigner un numéro de page.
pi
est surement mieux que A pour désigner le nombre 3,141592...
60, 3.141592 et "fin" sont des littéraux. Nous pouvons nommer les littéraux. Un littéral nommé est une constante.
Après les instructions :
set maxLignes 60 set pi 3.141592 set consigneFin fin
nous pouvons écrire :
for { i = 0; $i <= $MaxLignes; incr $i } {
faire un traitement
sur la ligne numéro i
}
set circonference [expr 2 * $pi * $r]
while { $consigne != $consigneFin } {
quelque chose à faire
}
L'utilisation des constantes rend le programme plus facile à lire, à comprendre, à modifier, à corriger.
Les indications concernant les constantes s'appliquent aux variables d'autant plus que TclTk ne fait pas de différence entre les deux ! Il n'existe pas de constante en TclTk mais l'utilisateur doit faire comme si afin d'améliorer le code écrit.
Evitons
a, i, n, a20, n7, toto, zorro, etc.
Peu de temps après l'écriture d'un code utilisant de telles variables, nous ne saurons plus à quoi elles peuvent bien servir.
La règle générale est la suivante :
##########################################
A développer
condition boucle fonction etc.
voir Brent B.Welch pour des exemples de code
##########################################
Par exemple :
#************************************************************************* # Copyright (C) 2002 Eric Seigne <erics@rycks.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # #************************************************************************** # File : $$$ # Author : davidlucardi@aol.com # Modifier: andre.connes@toulouse.iufm.fr # Date : 24/04/2002 # Licence : GNU/GPL Version 2 ou plus # # Description: # ------------ # # @version # @author David Lucardi # @modifier Andre Connes # @project Le terrier # @copyright Eric Seigne 24/04/2002 # # *************************************************************************
Il est souhaitable de penser à l'internationalisation des logiciels pour l'utilisateur (peu importe le programmeur).
Les fichiers de traduction se trouvent dans le dossier msgs
Ouvrez le fichier fr.msg avec un editeur de texte.
Enregistrez-le sous le nom xx.msg, où xx désigne le code de la langue (le même que celui que vous avez choisi à l'install de la distribution).
Le fichier présente une succession de lignes de même format :
::msgcat::mcset fr "Editeur"
::msgcat::mcset fr "Reglages" "R\360glages"
Si je veux traduire en Anglais , cela devient
::msgcat::mcset en "Editeur" "Editor"
::msgcat::mcset en "Reglages" "Settings"
Inclure le fichier msg.tcl (ex : source msg.tcl) dans l'application en développement
Mouliner toutes les chaînes de caractères selon les principes suivants :
| Chaîne de caractères | Codage |
| "Mon texte" | [mc {Mon texte}] |
| "Gagné en $nb essais sur $total." | [format [mc {Gagne en %1$s sur %2$s.}] $nb $total] |
%1 et %2 permettent de "positionner" les variables, si la traduction nécessite de les inverser, par exemple.
Les applications doivent être relogeables, c'est à dire qu'elles doivent
pouvoir être installées et exécutées dans n'importe quel répertoire.
Les chemins vers des fichiers et des sous dossiers devront donc être relatifs
au répertoire de base de l'application (Basedir).
Soit Home le dossier personnel de l'utilisateur, Basedir le répertoire courant de l'application et Mon_appli le nom de l'application concernée.
Nommage : mon_fichier.conf
Ils devront être installés dans Home/leterrier/Mon_appli/ ou dans un sous dossier de cette branche (ex : Home/leterrier/Mon_appli/Reglages)
Si le dossier Home n'est pas défini, ils devront être installés dans Basedir/leterrier/Mon_appli/ ou dans un sous dossier de cette branche (ex : Basedir/leterrier/Mon_appli/Reglages)
Nommage : mon_fichier.log
Ils devront être installés dans Home/leterrier/Mon_appli/ ou dans un sous dossier de cette branche (ex : Home/leterrier/Mon_appli/Images)