Mesure de la qualité du code source - Algorithmes et outils

Complexité cyclomatique

Définition

La complexité cyclomatique d'une méthode est définie par le nombre de chemins linéairement indépendants qu'il est possible d'emprunter dans cette méthode.

Plus simplement, il s'agit du nombre de points de décision de la méthode (if, case, while, ...) + 1 (le chemin principal).

La complexité cyclomatique d'une méthode vaut au minimum 1, puisqu'il y a toujours au moins un chemin.

Interprétation

La complexité cyclomatique d'une méthode augmente proportionnellement au nombre de points de décision. Une méthode avec une haute complexité cyclomatique est plus difficile à comprendre et à maintenir.

Une complexité cyclomatique trop élevée (supérieure à 30) indique qu'il faut refactoriser la méthode.

Une complexité cyclomatique inférieure à 30 peut être acceptable si la méthode est suffisament testée.

La complexité cyclomatique est liée à la notion de "code coverage", c'est à dire la couverture du code par les tests. Dans l'idéal, une méthode devrait avoir un nombre de tests unitaires égal à sa complexité cyclomatique pour avoir un "code coverage" de 100%. Cela signifie que chaque chemin de la méthode a été testé.

Calcul

Considérons le code source suivant :

package banque;

public class Banque {
	private Double solde;
	
	public void faireOperation(String type, double montant) {
		System.out.println("Début d'opération.");
		if(solde != null) {
			if(type.equals("+") || type.equals("-")) {
				if(type.equals("+")) {
					solde += montant;
				}
				if(type.equals("-")) {
					if(montant > solde) {
						System.err.println("Solde insuffisant !");
					}
					else {
						solde -= montant;
					}
				}
			}
			else {
				System.err.println("Type d'opération invalide.");
			}
		}
		else {
			System.err.println("Solde non initialisé.");
		}
    System.out.println("Fin d'opération.");
	}
}

Il s'agit d'une simple opération de calcul d'un nouveau solde en fonction d'une opération d'ajout ou de retrait d'un montant.

Voici le graphe correspondant à cette méthode :

Arbre de
        décomposition de la méthode faireOperation.

Si on compte le nombre de chemins linéairement indépendant qu'il est possible de suivre, on trouve 6. C'est également le nombre de if de la méthode + 1. La complexité cyclomatique de cette méthode vaut donc 6.

Cette complexité cyclomatique n'est pas très élevée. Cependant, pour obtenir un code coverage de 100%, il faudrait que cette méthode compte six tests unitaires.

<<< Distance from the main sequence

Outils - Introduction >>>