Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Eclipse : organiser son code avec les Catégories

Je viens de découvrir une fonctionnalité méconnue d'Eclipse : les catégories.
Grâce à l'annotation javadoc @category, il est possible de définir des groupes virtuels de méthodes et de propriétés au sein des classes Java. Il est ensuite possible de les filtrer dans les vues Outline et Members, afin de n'afficher que ce qui vous intéresse.

Cette astuce peut être très pratique lorsque vous naviguez dans une classe imposante, et que vous cherchez à en comprendre la structure.
Pour peu que le code soit mal organisé, il se peut très bien que des méthodes métiers soient perdues au milieu des accesseurs, et que vous passiez à côté par inadvertance.

Un exemple, un exemple !

Puisque vous insistez, prenons l'exemple d'un simple POJO décrivant une Personne. Il est composé de deux constructeurs, trois propriétés et leurs six accesseurs, et une méthode métier pour calculer l'âge de la personne.

Voici ce que propose la vue Outline par défaut :

Outline1.png

Avez-vous remarqué la méthode métier calculerAge au milieu de tous les accesseurs ? Probablement pas.
Et c'est le problème de cette vue : elle montre trop de choses, et il est difficile de s'y retrouver.

Les catégories à la rescousse !

Maintenant, appliquons des annotations @category à nos champs et méthodes.
Il n'y a pas de catégories prédéfinies, vous pouvez donc vous organiser comme bon vous semble. Vous pouvez même associer plusieurs catégories à un même élément.

Certaines catégories basiques émergent naturellement :

  • Les propriétés : @category Property
  • Les constructeurs : @category Constructor
  • Les accesseurs : @category Accessor
  • Les méthodes utilitaires (equals(), hashCode(), toString(), clone()...) : @category System

Pour ces catégories, je pense qu'il est intéressant de standardiser leur nom et d'automatiser leur génération dans le code grâce aux templates d'Eclipe. Vous trouverez donc en annexe de ce billet un fichier de templates prêt à être importé dans Eclipse (Préférences -> Java -> Code style -> Code templates).

Mais concrètement ?

Mais revenons à notre exemple.
Voici un extrait du POJO annoté :

  1. /**
  2.  * L'année de naissance de la personne
  3.  * @category Property
  4.  */
  5. private int anneeNaissance;
  6.  
  7. /**
  8.  * @category Constructor
  9.  * @param nom Le nom de la personne
  10.  * @param prenom Le prénom de la personne
  11.  * @param dateNaissance La date de naissance de la personne
  12.  */
  13. public Personne(String nom, String prenom, int dateNaissance) {
  14. this.nom = nom;
  15. this.prenom = prenom;
  16. this.anneeNaissance = dateNaissance;
  17. }
  18.  
  19. /**
  20.  * @return the anneeNaissance
  21.  * @category Accessor
  22.  */
  23. public int getAnneeNaissance() {
  24. return anneeNaissance;
  25. }
  26.  
  27. /**
  28.  * @return L'âge de la personne (année courante - année de naissance)
  29.  */
  30. public int calculerAge() {
  31. Calendar cal = Calendar.getInstance();
  32. int annee = cal.get(Calendar.YEAR);
  33. return annee - this.anneeNaissance;
  34. }
  35.  
  36. /**
  37.  * @category System
  38.  */
  39. @Override
  40. public String toString() {
  41. return "Personne [nom=" + nom + ", prenom=" + prenom
  42. + ", anneeNaissance=" + anneeNaissance + "]";
  43. }

La vue Outline affiche maintenant les catégories à côté des éléments :

Outline2.png

Mais ce qui est réellement intéressant, c'est qu'il est désormais possible de filtrer l'affichage des catégories :

Outline3.png

On peut donc masquer les constructeurs, accesseurs et méthodes systèmes. Ainsi, il ne reste plus que les informations réellement importantes :

Outline4.png

Conclusion

Les catégories sont très pratiques pour filtrer rapidement les informations de la vue Outline.

Mais j'admets que, pour en tirer réellement parti, il est nécessaire de s'outiller afin d'automatiser leur usage. Pour cela, je vous recommande d'importer dans Eclipse le fichier de templates fourni en annexe de ce billet.


Commentaires

1. Le samedi 6 mars 2010, 16:31 par Piwaï

Pas mal ! Une vraie découverte :-) .

Quand on y réfléchit, est-ce que cette fonctionnalité de filtrage ne pourrait pas être proposée en standard dans Eclipse, sans avoir besoin d'ajouter de la javadoc partout ? En effet, Eclipse sait déjà identifier des accesseurs, des propriétés, des constructeurs, et des méthodes "système" (equals etc)...

Ceci dit, je me demande... vous servez-vous souvent de la vue Outline ? De mon côté, je n'y jette jamais le moindre coup d'oeil... mais c'est aussi probablement parce que je l'ai toujours trouvée trop fouillis. Et puis cette vue requiert d'utiliser la souris, berk ;-) !

J'ai plutôt tendance à utiliser Ctrl+T, Ctrl+O et Ctrl+O+O pour naviguer dans mes classes... (pour ces deux derniers, c'est surtout utile quand on connaît le début de noms de méthodes) Et vous ?

2. Le samedi 6 mars 2010, 16:59 par Olivier Croisier

C'est vrai qu'actuellement, je me sers assez peu de la vue Outline.
Je la configure en Fast View, et je n'y jette un oeil que pour scanner rapidement une grosse classe inconnue, en espérant que son créateur a rangé intelligemment les méthodes - en particulier, pas de méthode métier au milieu du code technique comme dans l'exemple...

Du coup, je pense sincèrement que l'usage généralisé des catégories rendrait un grand service aux futurs utilisateurs et mainteneurs des classes que l'on développe. Si Eclipse pouvait les intégrer dans ses templates, comme mon fichier joint permet de le faire...

Je me demande si IntelliJ et Netbeans offrent cette fonctionnalité de filtrage en standard ?

3. Le mardi 9 mars 2010, 15:58 par HollyDays

A noter que du côté du concurrent IntelliJ IDEA, le volet "Structure" ne supporte pas ce méta-attribut @category. Par contre, IDEA sait identifier les accesseurs, les propriétés de type JavaBean, les constructeurs, depuis très longtemps (de mémoire, au moins IDEA 4), et il présente séparément (si le programmeur le demande) les propriétés/attributs/méthodes définis dans la classe et de celles/ceux hérités. Il peut aussi les trier par ordre alphabétique plutôt que par ordre de définition dans la classe, et/ou les grouper par visibilité.

Pour conclure, je précise que, malgré tout ce qu'il propose, je n'utilise pas non plus ce volet "Structure" d'IDEA : comme Piwaï dans Eclipse, je préfère faire des "Find class", "Find file" et "Find symbol" (Ctrl+N, Ctrl+Shift+N, Ctrl+Shift+Alt+N ou Ctrl+F12 dans une seule classe), et, une fois dans la classe, jouer et abuser du "Collapse" pour en avoir une vue plus ou moins compacte du code, puis zoomer sur la partie qui m'intéresse.

4. Le vendredi 19 mars 2010, 15:13 par remarque inutile

@@public Personne(String nom, String prenom, int dateNaissance) {
this.nom = nom;
this.prenom = prenom;
this.anneeNaissance = anneeNaissance;
}@@

l'affectation à la variable anneeNaissance est sans effet

5. Le vendredi 19 mars 2010, 15:17 par Olivier Croisier

Oups, en effet.
Je corrige ça immédiatement, merci !

6. Le vendredi 2 juillet 2010, 13:59 par Vincent

C'est très bien, et reprend, comme souvent avec Java, les fonctionalités du grand ancien, mais toujours vert, Smalltalk 80.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.