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.

Correction Execice2, TD4

Document source

Correction Execice2, TD4

Programming, Cohesion, Coupling · PDF · 2 pages

Afficher l'aperçu du document

Consulter le document original →

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() et afficheLettres() dépendent entièrement de l'état des variables globales modifiées par afficheTriangle().
  • Dépendances cachées : afficheEspaces() dépend implicitement de l'exécution de afficheTriangle(), et afficheLettres() dépend à la fois de afficheEspaces() et de afficheTriangle().

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 :

  1. 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.
  2. Viser un faible couplage : Traquez systématiquement les variables globales (comme les attributs static qui 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'instruction return. 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.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions