Analyse de la qualité du code Java avec JDepend
Présentation
Objectifs
JDepend est un outil, sous licence "BSD license" développé en Java par Mark Clark.
JDepend traverse les répertoires contenant des classes Java à partir desquels il génère des métriques de qualité pour chacun des packages rencontrés. Il permet de mesurer automatiquement la qualité d'une conception logicielle en terme d'extensibilité, de réutilisabilité et de maintenance pour gérer les dépendances entre les packages de façon efficace. Ces métriques sont au nombre de 7.
Métriques de qualité
Nombre de classes et d'interfaces
Le nombre de classes concretes et abstraites (incluant les interfaces) dans un package est un indicateur de l'extensibilité d'un package.
Couplage par dépendance ascendante (Ca ou Afferent Coupling)
Le nombre de packages tiers utilisant un package donné est un indicateur de la responsabilité d'un package, c'est à dire qu'il peut mettre en évidence qu'un package est au centre de l'application ou mettre en relief une mauvaise gestion des packages.
Couplage par dépendance descendante (Ce ou Efferent Coupling)
Le nombre de packages tiers utilisés par un package donné est un indicateur d'indépendance du code.
Degré d'abstraction (A ou Abstractness)
Le degré d'abstraction correspond au pourcentage entre le nombre de classes abstraites (plus les interfaces) dans le package analysé par rapport au nombre total de classes de ce package.
Instabilité (I ou Instability)
L'instabilité correspond â un ratio entre les couplages efférents (Ce) et afférents (Ca) de telle sorte que I = Ce / (Ce + Ca). Cette métrique est un indicateur de stabilité par rapport ˆ la mise ˆ jour d'autres packages.
Cette métrique peut varier de 0 à 1. 0 indique qu'un package est complètement stable, tandis que 1 indique un package complètement instable.
Distance normale (D ou Distance from the main sequence)
Cette métrique correspond à la distance de la droite perpendiculaire à la droite idéale A + I = 1. C'est un indicateur d'équilibre d'un package entre l'abstraction et l'instabilité.
Les packages supposés idéaux sont soient complètement abstraits et stables (A=0,I=1) soient complètement concrets et instables(A=0,I=1).
Dépendance cyclique (Package Dependency Cycles)
Ce critère indique s'il existe des cycles de dépendances entre les packages.
Pourquoi utiliser JDepend
Pré requis
Avant d'utiliser JDepend, il est important de comprendre que de bonnes métriques de qualité du code n'indiquent pas nécessairement une bonne conception logicielle. De même, des métriques de qualité du code qui pourraient apparaître mauvaises n'indiquent pas nécessairement une mauvaise conception logicielle.
Ainsi, les métriques de qualité générées par JDepend ne servent pas vraiment à mesurer la qualité d'un produit fini, mais sert plutôt aux développeurs à maîtriser les programmes qu'ils créent en vérifiant qu'ils respectent des conditions pré-établies. Les métriques leur permettent de pouvoir effectuer rapidement des réajustements du code.
Mesure de la qualité du code
La qualité de la conception peut être mesurée en partie en quantifiant ses degrés d'extensibiilité, de réutilisabilité et de maintenance. Ces qualités sont toutes influencées par les dépendances inter-package liées à la conception.
Les programmes sont plus extensibles quand ils sont le plus indépendant possinle des détails d'implémentation, c'est à dire s'ils sont capables de s'adapter à de nouvelles implémentations sans que le code existant en soit modifié.
La maintenance des programmes est améliorée quand des changements peuvent être facilement effectués sans avoir d'effets de bord sur le reste du système. JDepend permet notamment grâce à ses métriques de gérer et de contrôler les dépendances entre les packages
Inversion des dépendances
L'objectif d'utilisation de JDepend est finalement d'inverser les dépendances de package afin que les packages de forte abstraction puissent être réutilisés indépendemment des autres packages tout en étant le plus extensible possible. En général, des dépendances entre des packages stables est bien entendu préconisé.
Extreme Programming
Les packages stables sont sensés être des pierres angulaires des application fortement couplées, de sorte que la rapidité de programmation ne soit pas défavorablement affectée par la propagation des changements dans un logiciel.
Dans le cas de l'extreme programming, les packages stables constituent une façade entre un programme et les sous-systèmes associés, de sorte que les développeurs puissent coder sans se préoccuper du couplage des packages.
Dans ce cas, JDepend permet aux équipes de développement d'identifier et d'utiliser des dépendances jugées désirables pour le système, ce qui évite d'avoir des dépendences problématiques.
Isolation des dépendances de packages avec des packages tiers
Les dépendances avec packages tiers peuvent facilement être identifiées et isolées par l'examen des dépendances descendantes de ces packages. Une fois que le package tiers provoquant une dépendance non souhaitée a été trouvé grâce à JDepend, son implémentation est généralement encapsulée dans des packages abstraits et stable prévus à cet effet.
Identification des dépendances cycliques
Les packages participant à une dépendance cyclique sont facilement identifiables par JDepend. Après, il suffit aux développeurs d'employer des techniques de programmation spécifiques pour casser ces cycles.