Les templates d'Eclipse pour unifier l'équipe

Comment faire lorsque vous devez imposer de nouvelles contraintes de développement à votre équipe mais qu'elles peuvent être perçues comme une perte de temps au premier abord ou qu'elles peuvent être implémentées différemment suivant les habitudes de chacun ?

Je prends deux exemples rapides :

  1. Dans le cadre des projets Java dont j'ai la charge chez mon client, notre système de logging, basé sur log4j, n'a pas été mis en place pleinement dès le début des développements. Résultat : les traces dont nous disposions il y a encore quelques semaines étaient parfois trop justes pour nous permettre de gérer correctement le suivi d'un appel, directement sur nos serveurs. Nous avons donc demandé à nos développeurs d'ajouter des logs un peu partout dans le code, avec certaines règles précises (on signale le début de la méthode, on loggue les paramètres envoyés à un web service...). Pour ces développeurs, n'assurant pas la maintenance des projets, l'ajout de logs est une véritable gageure qu'ils réduisent au minimum.
  2. Lors de la vérification des paramètres à l'entrée d'une méthode, nous demandons à nos développeurs de vérifier que les String ne soient ni nulles ni vides (uniquement des espaces ou aucun caractère). C'est une règle qui s'applique à la très grande majorité de nos méthodes, et qui demande systématiquement les mêmes vérifications, qui peuvent être faites de manières différentes suivant les habitudes de chacun.
Nous voyons bien ici les problèmes qui peuvent se poser : dans un premier temps, les développeurs vont éluder la question en en faisant le moins possible (ce qui peut se comprendre sur certaines tâches fastidieuses et peu valorisantes). Dans un second temps, les habitudes de chacun risquent de conduire à des comportements métier différents, difficilement repérables.

L'une des solutions consiste à contrôler le code produit par les développeurs. Il existe pour cela des solutions que nous aborderons dans un autre billet. Le contrôle implique cependant que vous mettiez en place des métriques, que vous passiez du temps à les analyser, que vous demandiez les rectifications et que les développeurs appliquent vos corrections. Et chaque fois, il faut recommencer...

La deuxième solution consiste à expliquer l'intérêt de ces contraintes, afin qu'elles soient comprises et mieux acceptées. Si vous travaillez avec des gens ayant un minimum de conscience professionnelle et que vous avez un sens pédagogique dépassant celui du babouin nain, vous devriez avoir un minimum de résultats.

Une autre solution consiste à fournir à vos développeurs le moyen d'en faire le moins possible, et le plus facilement possible. Nous sommes tous humains : moins l'on en fait, mieux l'on se porte. Et c'est là que les templates d'Eclipse viennent à notre secours...

Pour les présenter rapidement, les templates d'Eclipse, accessibles via l'assistant contextuel, permettent de générer du code (de quelques mots à plusieurs dizaines de lignes), tout en permettant au développeur de remplir rapidement les vides, configurés par vos soins.

Exemple : vous devez logguer le début d'une méthode avec le code suivant :

if(LOGGER.isDebugEnabled()) {
LOGGER.debug("Starting method...");
}

Il vous suffit pour cela de déclarer un template, nommé lstart, qui génère automatiquement le code précédent. Vous souhaitez saisir le message ? Pas de problème vous définissez le template ldebug, qui aura la tête suivante :

if(LOGGER.isDebugEnabled()) {
LOGGER.debug("${message}");
}${cursor}

Lorsque le développeur appliquera ce template, son curseur se placera automatiquement au niveau du message, ce qui lui permettra de le saisir. En tapant ensuite sur "entrée", son curseur se déplacera après les accolades, lui permettant de poursuivre son code sans toucher à sa souris.

Je vous laisse regarder un peu toutes les possibilités des templates d'Eclipse :
  1. Import automatique des classes pré-configurées,
  2. Saisie unique du nom de variable et remplacement automatique de toutes les occurences de cette variable dans le template,
  3. ...
Vous voyez bien là l'intérêt des templates : en saisissant simplement un nom, vous générez un code précis, répondant aux règles définies à l'avance, sans que les développeurs aient à y réfléchir. En tant que référent technique de votre équipe, il vous suffit ainsi de créer les templates que vous jugez utiles (Windows/Preferences/Java/Editor/Templates) et de les exporter dans un fichier XML. Vos développeurs pourront ensuite les importer facilement dans leur propre environnement pour les réutiliser rapidement et facilement.

Pour que l'utilisation des templates soit réellement efficace, il faut cependant que les noms de ceux-ci soient logiques (pour que l'on puisse s'en souvenir facilement) et courts (pour inciter les développeurs à les utiliser).

Attention également à ne pas créer des templates pour tout et n'importe quoi. Les templates doivent être simples et d'utilisation évidente. Il ne faut pas qu'il y en ait une multitude.

Quelques liens rapides sur le sujet:

http://eclipse.developpez.com/faq/?page=developpement#creerTemplates

http://www.programmez.com/tutoriels.php?titre=Eclipse-et-les-templates-Java-par-l-exemple&tutoriel=82

9 commentaires:

Tanguy 14 janvier 2009 21:42

hooray !! :)

Est-ce qu'une annotation bien sentie derrière les oreilles permettrait de faire cela ?

Je me pose la question car je n'ai jamais codé d'annotation, mais ca m'intrigue...

Thomas Huguerre 14 janvier 2009 22:06

Une annotation (de mes souvenirs de dotNet) permettrait éventuellement de vérifier automatiquement certains types de paramètres.

En revanche, il n'y a pas : pour le logging, il faut se coltiner les lignes de code pour bien suivre la trace. Les annotations ne rentrent pas en jeu dans ce problème...

Tanguy 16 janvier 2009 15:56

Plutôt que de copier coller n fois ton code, tu peux utiliser une annotation et de l'aop pour triggerer et ajouter du log à la volée.

Mais c'est vrai que le plus propre et qui évite de toucher le code existant c'est plutôt de faire un fichier de config.

Thomas Huguerre 16 janvier 2009 16:07

Copier-Coller == Template Eclipse
Copier-Coller != Annotations

Attention, quand je parles de tracer les appels dans les fonctions à l'aide de logs, il s'agit de mettre des logs partout : au début, à la fin, au milieu.

Tu parcours une boucle: tu mets un log debug.
Tu renvoie une valeur: tu mets un log info pour signaler que tout est ok.

Aucune annotation, dont le rôle est plus de personnaliser un élément (classe/méthode...), ne permettra de faire ça.

Tanguy 19 janvier 2009 01:19

On est d'accord, une annotation ce n'est rien qu'un simple flag. Mais avec de l'AOP tu peux modeler ça comme tu veux.

Dans le cas du log "j'entre dans une méthode avec les paramètres XXX + valeur de retour", il n'y a besoin ni d'annotation ni de code templaté, tu peux faire un interceptor Spring qui s'en charge.

Pour les logs + spécifiques tu vas en effet devoir rajouter du code dans tes classes, je ne vois pas d'autre solution.

Thomas Huguerre 19 janvier 2009 09:07

Ah oui bien sûr : entrée et sortie de fonction peuvent se faire via AOP ou Annotation. Mais c'est en réalité une bien petite partie des logs.

De plus l'AOP ne peut pas se mettre partout: il faut, dans le cas où l'on utilise Spring, que ce soit un bean chargé par Spring. Ce n'est pas toujours faisable (typiquement pour les objets chargés par Hibernate).

L'annotation permet effectivement de pallier à ça, et enlève un peu du travail.

Damien 4 février 2009 11:41

Concernant les templates Eclipse, je suis assez dubitatifs, car comment fais tu pour déployer les même templates sur tous les postes de travail des développeurs. Même question, le jour où tu voudras les faire évoluer.

Je ne suis pas un spécialiste de l'AOP mais j'avais découvert que ça pouvait aller assez loin (au delà, je crois, de l'entrée/sortie de méthodes). Donc j'aurais un avis assez similaire à Tanguy d'utiliser l'AOP et les annotations pour à la fois uniformiser le code et le rendre évolutif.

Pour les logs personnalisés, de toute façon, je ne vois pas non plus comment automatiser tout ça. Par contre, on pourrait sans doute contrôler le "taux de logging" avec des métriques et l'audit de code

Thomas Huguerre 4 février 2009 21:33

Le partage des templates entre les différents développeurs est largement facilitée par la fonctionnalité d'export des templates vers un fichier XML (possibilité de n'exporter qu'une partie des templates présents dans un workspace), fournie par Eclipse. Cependant, rien n'oblige les développeurs à les importer. L'audit de code (avec la bonne règle CheckStyle par exemple) peut alors rentrer en ligne de compte... Un code n'utilisant pas les templates peut être rapidement identifié et sa livraison refusée.

En ce qui concerne l'utilisation de l'AOP pour logguer dans les fonctions, tous les frameworks que j'ai pu rencontrer (Spring AOP en premier) ne permettent que 3 types de greffes:
- Avant la méthode,
- Après la méthode,
- Autour de la méthode (avant + après).

Plus d'explications au lien suivant (section II-B/Points de Jonction):
http://ewawszczyk.developpez.com/tutoriel/java/spring/aop/

De plus l'AOP oblige généralement (mais le futur nous réserve probablement de nouvelles surprises) à ce que les classes soumises à la greffe soient chargées via ce même framework (c'est le cas chez Spring), ce qui impose d'avoir la main sur l'instantiation de la classe, ce qui n'est pas toujours le cas.

Thomas Huguerre 4 février 2009 21:35

D'autres outils que la simple utilisation de templates permettent également de favoriser l'uniformisation des loggins.

C'est notamment le cas de ce plugin pour Eclipse, se basant d'ailleurs sur un système similaire aux templates:
http://log4e.jayefem.de/content/view/8/4/