Correction Execice2, TD4
Exercice 2 Question 1 - Analyse de la cohésion du code C1 Problèmes de cohésion identifiés dans le code C1 : La méthode circonferenceCercle() souffre d'un problème majeur de cohésion car elle accomplit trois tâches complètement indépendantes au sein du même bloc de code : La lecture et la validation de l'entrée utilisateur (le rayon). Le calcul mathématique de la circonférence.
D'après le document Correction Execice2, TD4
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Programming, Cohesion, Coupling · PDF · 2 pages
Afficher l'aperçu du document
Exercice 2
Question 1 - Analyse de la cohésion du code C1
Problèmes de cohésion identifiés dans le code C1 :
La méthode circonferenceCercle() souffre d'un problème majeur de cohésion car elle accomplit trois tâches complètement indépendantes au sein du même bloc de code :
- La lecture et la validation de l'entrée utilisateur (le rayon).
- Le calcul mathématique de la circonférence.
- L'affichage du résultat à l'écran.
Une méthode qui fait trop de choses à la fois pose de sérieux problèmes de réutilisation (il est impossible d'utiliser le calcul sans lancer l'interface console) et de maintenabilité.
Solution proposée : Pour corriger cela, il faut fractionner le code initial en trois méthodes distinctes, chacune étant fortement cohésive (c'est-à-dire dédiée à une seule tâche précise).
Voici le code corrigé :
// Lit le rayon (positif) d'un cercle au clavier.
public static double lireRayon() {
System.out.print("Entrer le rayon du cercle: ");
double rayon = Keyboard.readDouble();
while(Keyboard.error() || rayon < 0) {
System.err.println("Mauvaise valeur de rayon.");
System.out.print("Entrer le rayon du cercle: ");
rayon = Keyboard.readDouble();
}
return rayon;
}
// Calcule la circonference d'un cercle de rayon donne.
public static double circonferenceCercle(double rayon) {
return 2 * Math.PI * rayon;
}
// Affiche la circonference d'un cercle
public static void afficheCirconference(double circonference) {
System.out.println("La circonference est " + circonference);
}
Question 2 - Analyse du couplage du code C2
Problèmes de couplage identifiés dans le code C2 :
Le code de la classe Triangle présente un couplage fort et problématique, principalement dû à l'utilisation de variables globales (les variables statiques colonne, ligne et total).
- Mauvaise maintenabilité : Le changement d'une méthode ou d'une variable affecte directement le comportement d'autres méthodes.
- Absence de réutilisabilité : Les méthodes
afficheEspaces()etafficheLettres()dépendent entièrement de l'état des variables globales modifiées parafficheTriangle(). - Dépendances cachées :
afficheEspaces()dépend implicitement de l'exécution deafficheTriangle(), etafficheLettres()dépend à la fois deafficheEspaces()et deafficheTriangle().
Solution proposée : Pour résoudre ce problème de couplage, il faut supprimer l'utilisation des variables globales. Les méthodes doivent devenir indépendantes en recevant les informations nécessaires sous forme de paramètres (arguments). De plus, on peut généraliser l'affichage pour éviter la duplication de code.
Note : Lors de la transcription, les guillemets typographiques du code source ont été remplacés par des apostrophes standards pour que le code compile correctement en Java.
public class Triangle {
// 1. Réécriture de afficheEspaces() pour enlever son couplage avec les variables globales
public static void afficheEspaces(int combien) {
int i;
for(i = 0; i < combien; ++i) {
System.out.print(' ');
}
}
// 2. Généralisation : on remplace afficheLettres() par une méthode plus utile
// qui peut répéter n'importe quel caractère, un nombre de fois donné.
public static void repeteCaracteres(char c, int combien) {
int i;
for(i = 0; i < combien; ++i) {
System.out.print(c);
}
}
// 3. Réécriture de afficheTriangle() pour utiliser les paramètres et la nouvelle méthode
public static void afficheTriangle(int nbLignes) {
int ligne;
for(ligne = 0; ligne < nbLignes; ++ligne) {
// Utilisation de la méthode généralisée au lieu des variables globales
repeteCaracteres(' ', ligne);
repeteCaracteres((char)('a' + ligne), nbLignes - ligne);
System.out.println();
}
}
}
Méthode
Pour aborder les exercices d'architecture logicielle portant sur la cohésion et le couplage, appliquez toujours ces deux principes directeurs :
- Viser une forte cohésion : Posez-vous la question "Est-ce que cette méthode ou cette classe fait une seule chose ?". Si vous devez utiliser le mot "et" pour décrire ce que fait votre méthode (ex: "elle lit l'entrée et calcule la valeur"), c'est qu'elle manque de cohésion. Découpez-la en plusieurs sous-méthodes.
- Viser un faible couplage : Traquez systématiquement les variables globales (comme les attributs
staticqui servent d'intermédiaires entre les fonctions). Les données doivent circuler de manière explicite : elles entrent dans la fonction par ses arguments, et le résultat en sort par l'instructionreturn. Une fonction bien conçue doit pouvoir être copiée-collée dans un autre projet et fonctionner immédiatement sans avoir besoin d'importer le reste de la classe.
Commentaires
Aucun commentaire pour le moment. Posez la première question.