3.6 KiB
Compte rendu du TD de complexité cyclomatique
Le but du TD est de calculer la complexité cyclomatique des fonctions en C, Java et Python. On utilise M = nombre de décisions + 1. Les fonctions main et les constructeurs ne sont pas analysés.
Calculs
Classement du cours : simple de 1 à 10, modéré de 11 à 20, complexe de 21 à 50 et très risqué au-delà de 50. Dans les tableaux, ET et OU désignent les opérateurs logiques.
C
| Fonction | Détail du calcul | M | Classement |
|---|---|---|---|
C1 carre |
1, aucune décision | 1 | Simple |
C2 moyenne |
1 + 1 for + 1 ternaire | 3 | Simple |
C3 est_bissextile |
1 + 1 ET + 1 OU | 3 | Simple |
C4 nom_jour |
1 + 7 case | 8 | Simple |
C5 compter_mots |
1 + 1 while + 2 if + 4 OU | 8 | Simple |
C6 date_valide |
1 + 4 if + 6 OU | 11 | Modéré |
Java
| Méthode | Détail du calcul | M | Classement |
|---|---|---|---|
J1 nombreDeLivres |
1, aucune décision | 1 | Simple |
J2 estDisponible |
1 + 2 ET | 3 | Simple |
J3 peutEmprunter |
1 + 6 if + 1 ET + 1 ternaire | 9 | Simple |
J4 calculerPenalite |
1 + 5 if + 1 for + 1 OU + 1 ternaire | 9 | Simple |
J5 rechercher |
1 + 5 if + 1 for + 2 ET + 2 OU | 11 | Modéré |
J6 importer avant refactorisation |
1 + 3 if + 1 for + 1 ET + 1 OU + 1 catch | 8 | Simple |
J6 importer après refactorisation |
1 + 1 for + 1 if | 3 | Simple |
importerLigne |
1 + 2 if + 1 OU | 4 | Simple |
importerLivre |
1 + 1 if + 1 OU + 1 catch | 4 | Simple |
Python
| Fonction | Détail du calcul | M | Classement |
|---|---|---|---|
P1 celsius_vers_fahrenheit |
1, aucune décision | 1 | Simple |
P2 signe |
1 + 1 if + 1 elif | 3 | Simple |
P3 notes_valides |
1 + 1 for + 1 if | 3 | Simple |
P4 mention |
1 + 1 for + 1 if | 3 | Simple |
P5 analyser_mot_de_passe |
1 + 10 if/elif + 2 for + 2 ET + 1 ternaire | 16 | Modéré |
Graphes
Avec M = E − N + 2P, E est le nombre d'arêtes, N le nombre de nœuds et P vaut 1 pour chaque fonction.
| Fonction | E | N | Calcul de M |
|---|---|---|---|
| C2 | 8 | 7 | 8 − 7 + 2 = 3 |
| C4 | 16 | 10 | 16 − 10 + 2 = 8 |
| J2, avec la sortie commune | 6 | 5 | 6 − 5 + 2 = 3 |
| J6, avant refactorisation | 22 | 16 | 22 − 16 + 2 = 8 |
| P2, avec deux tests et trois retours | 7 | 6 | 7 − 6 + 2 = 3 |
| P3 | 5 | 4 | 5 − 4 + 2 = 3 |
Cas particuliers
- Les opérateurs
&&,||,andetorajoutent chacun une décision, même sansif, car ils peuvent éviter l'évaluation de la suite. - Un
switchajoute une décision parcase. Ledefaultn'ajoute rien. - La compréhension de P3 contient une boucle et un filtre. Les comparaisons chaînées Python sont comptées ici comme un seul test.
- Un
catchet un ternaire ajoutent chacun une décision. else,return,continueetbreakn'ajoutent pas de décision.
Refactorisation de importer
La méthode a été séparée en trois parties : importer parcourt les lignes, importerLigne vérifie leur format et importerLivre vérifie l'année puis ajoute le livre.
La méthode importer passe de M = 8 à M = 3. Les deux méthodes auxiliaires ont chacune M = 4. Les décisions sont réparties entre des méthodes plus courtes et plus faciles à lire.
Les deux versions compilent. Les imports ont donné les mêmes résultats et messages d'erreur sur les cas testés : lignes vides, commentaires, formats incorrects, années invalides et livres valides.
- Adrien Rabot
- Théo Anastasio
