Après avoir traité de pratique de gestions de projet, revenons aux pratiques de programmation avec les règles de codage.
Ces règles furent discutées lors d’une réunion de l’équipe, en suivant les principes de simplicité et la contrainte suivante : moins de 10 pages pour les règles complètes, et la possibilité d’une version compacte tenant sur 2 pages que l’on placerait sur chaque poste de développement. L’expérience montrant que les règles trop complexes et nombreuses ne sont jamais suivit, ces contraintes sur la taille réduite en rendaient l’application plus probable. Il est vrai qu’aujourd’hui de nombreux outils permettent de valider automatiquement le respect de règles lors de la compilation ou avant la réintégration de fichier dans le système de gestion de source, mais nous devions faire avec les moyens du bord, à savoir l’équipe (ce qui est d’ailleurs conforme à l’esprit XP, qui privilégie les hommes plutôt que les outils).
A l’issue de la réunion, un document récapitulatif a été rédigé, ainsi qu’un guide synthétique de 2 pages. Placé dans un protège document transparent, ce guide sera utilisé en référence par tous les développeurs.
Mais voyons plus en détails les règles issues de la réunion.
Style de codage
Ce terme désigne la manière de présenter le code dans un but de faciliter la compréhension. Il comprend les méthodes d’indentation et de déclaration de variables.
Indentation
On choisi d’utiliser le style dit « côte ouest », par opposition à K&R. C’est-à-dire le style supporté par défaut par Visual studio. Et nous utilisions une tabulation de 2 espaces configurée dans l’éditeur (plutôt qu’avec le caractère tabulation) afin d’avoir une présentation identique sur tous les postes.
Ce qui donne quelque chose comme ceci :
try
{
line = unputStream.ReadLine();
}
catch (Exception e)
{
throw e;
}
-
try
-
-
{
-
-
line = unputStream.ReadLine();
-
-
}
-
-
catch (Exception e)
-
-
{
-
-
throw e;
-
-
}
Longueur des lignes et césure
Plutôt que de définir une stratégie de césure des lignes trop longues, nous décidons de remanier systématiquement ces lignes.
Ainsi
if (val = 52 && val1 = 5 || (val1 = 3 && val2 = 1) … )
-
if (val = 52 && val1 = 5 || (val1 = 3 && val2 = 1) … )
Sera remplacé par :
De même une fonction possédant une grande collection de paramètre sera traité en regroupant les paramètres dans une classe. Naturellement ce principe ne s’applique que pour des fonctions ayant une grande collection de paramètre. Il s’agit d’une certaine façon d’un remaniement qui consiste à regrouper des paramètres liés entre eux dans une structure ayant un sens, le nombre de paramètre élevé étant un indicateur (code smell) de ce remaniement nécessaire.
public String formatMessage(string message, int val1, int val2,
int val3);
public String formatMessage(formatMessage, ValuesBag vals);
-
public String formatMessage(string message, int val1, int val2,
-
-
int val3);
-
-
public String formatMessage(formatMessage, ValuesBag vals);
Déclaration des variables
Les noms des variables devront avoir une signification claire. De plus la déclaration d’une variable devra se faire au début du bloc de code l’utilisant. Ceci est un bon compromis entre la lisibilité (déclaration des variables regroupé) et la performance (il faut éviter de déclarer des variables qui pourrait ne pas être utilisé).
Conventions de nommages
Il s’agit ici de définir la manière dont on nommera un élément en fonction de son type ou son usage. Il existe de nombreuses conventions, notamment la notation hongroise qui consiste à utiliser un préfixe définissant le type d’une variable. Cette notation peut vite devenir lourde à gérer, et surtout n’est plus vraiment adapté à des langages objet, puisque la plupart des variables seront d’un type non prévue par la notation. De plus avec les éditeurs modernes on trouve très facilement le type d’une variable si nécessaire.
Notre convention portera donc surtout sur la capitalisation des noms en fonction de l’objet nommé.
Classes et interface
Le nom commencera par une majuscule, et chaque mot accolé au premier commencera aussi par une majuscule.
Une classe n’aura pas de préfixe particulier, alors qu’une interface commencera par la lettre I.
On essayera de ne pas utiliser d’abréviation, sauf pour des termes très répandu.
Par exemple :
MyClass
IMailManager
MailManagerSMTP
-
MyClass
-
-
IMailManager
-
-
MailManagerSMTP
Méthodes
Comme pour une classe, le nom commencera par une majuscule, et chaque mot accolé au premier commencera aussi par une majuscule.
On utilisera plutôt un verbe indiquant l’action que la méthode effectue.
Pour faciliter la compréhension, on inclura dans le nom des paramètres une information sur l’unité utilisé si nécessaire.
Par exemple :
Est plus clair que :
Variables membres d’une classe et variables globales
On utilisera une minuscule pour le premier mot, et une majuscule sur les mots suivant.
Variable locale et paramètre d’une méthode
Le nom sera entièrement en minuscule.
Constantes et Macro C
Le nom sera entièrement en majuscule. On séparera les noms par un caret : _.
Enumérations
Les noms des énumérations utiliseront la règle s’appliquant aux classes, et les valeurs celle des constantes.
Documentation
L’un des principes de XP est que la documentation est dans le code. Plutôt que d’avoir un code obscur nécessitant une documentation pour le comprendre, on s’appliquera à obtenir un code simple et clair. Par contre dans le cas ou une documentation est nécessaire, notamment pour les APIs, on utilisera un outil de génération de documentation (comme XMLDoc pour C# ou doxygen pour C++) pour maintenir la documentation dans le code source. Cette pratique limite fortement le risque de divergence entre la documentation et la réalité du code.
Bilan
Même si les règles n’étaient pas toujours respectées, le fait d’avoir un consensus sur l’objectif s’est avéré très positif sur l’évolution du code. On a ainsi évité les discussions lié à la responsabilité collective du code sans que des règles claires soit définis (les fameux : « qui a foiré mon indentation ». et autres joyeusetés). On en reparlera bientôt en traitant justement de la responsabilité collective du code.
A suivre.