IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de couplage trop nombreux POO


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2020
    Messages : 23
    Par défaut Problème de couplage trop nombreux POO
    Bonjour !

    Je traîne depuis quelques semaines sur ce forum, et j'apprend le dev sous C# depuis le 27 janvier dernier et j'ai bien progressé je penses. Dernièrement j'ai refait le programme du nombre mystère en POO de a à z tout seul.

    Alors avant de vous donner mon code, je vous explique le problème posé. Mon ami qui est dans la progra depuis 20 ans, m'a félicité pour mon travail mais me fait une remarque tout de même :
    mon programme comporte beaucoup trop de couplage et donc d'interaction entre les classes. C'est pas souhaitable. En gros d'après lui, un bon développeur, va maximiser son découpage du programme et à contrario minimiser le nombre d'interaction entre elles.

    Je veux donc améliorer ça mais j'avoue que je n'ai aucune idée de comment faire sans trop coupler les classes quoi?

    Voici le code :

    Classe de messages à afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Messages
        {
            string nombre_max = "20";
            public Messages()
            {
     
            }
     
            public void Afficher_Bonjour()
            {
                Console.WriteLine("Bonjour! Bienvenue dans le jeu FindMyNumber.\n");
                Afficher_Espace();
                Console.WriteLine($"Il s'agit de deviner un nombre entre 1 et {nombre_max}.\n");
                Afficher_Espace();
            }
     
            public void Afficher_Espace()
            {
                Console.WriteLine("---------------------------------------------");
            }
     
            public void Afficher_Demande_De_Saisie()
            {
                Console.Write($"Saisissez un nombre entre 1 et {nombre_max} : ");
            }
     
            public void Afficher_Victoire()
            {
                Console.WriteLine("Bravo, tu as gagné ! Rejoues encore !");
            }
     
            public void Afficher_PlusGrand()
            {
                Console.WriteLine("C'est plus grand ! ");
            }
     
            public void Afficher_PlusPetit()
            {
                Console.WriteLine("C'est plus petit ! ");
            }
     
            public void Afficher_Saisie_Hors_Intervalle(Saisie_utilisateur saisie_utilisateur)
            {
                Console.WriteLine($"Oups, {saisie_utilisateur.saisie} n'est pas dans l'intervalle demandée. Essaie encore.");
            }
     
            public void Afficher_Saisie_Incorrecte()
            {
                Console.WriteLine("Oups, ceci n'est pas un nombre! Essaie encore.");
            }
     
            public void Afficher_Nombre_Dessais(Nombre_Dessais nombre_dessais)
            {
                Console.WriteLine($"\nLe nombre d'essais est de {nombre_dessais.nb_saisie}");
            }
        }
    }
    Classe pour générer un nombre aléatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Nombre_aléatoire
        {
            public int nombre_aléatoire;
            public int min = 1, max = 20;
            public Nombre_aléatoire()
            {
     
            }
     
            public int Generer_Nombre_Aleatoire()
            {
                return nombre_aléatoire = new Random().Next(min, max);
            }
        }
    }
    Classe de saisie utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Saisie_utilisateur
        {
            public int saisie;
            public string nouvelle_saisie;
            public bool nombre_correcte = false;
            public Saisie_utilisateur()
            {
     
            }
     
           public int Demander_Saisie_NombreEntier(Messages message)
           {
                message.Afficher_Demande_De_Saisie();
                nouvelle_saisie = Console.ReadLine();
                nombre_correcte = int.TryParse(nouvelle_saisie, out saisie);
                return saisie;
           }
        }
    }
    Classe de vérification de saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Vérification_saisie
        {
            public Vérification_saisie()
            {
     
            }
     
            public int Vérifier_Saisie(Saisie_utilisateur saisie_utilisateur, Nombre_aléatoire nombre_aléatoire, Messages message)
            {
                int nombre_saisie;
     
                do
                {
                    nombre_saisie = saisie_utilisateur.Demander_Saisie_NombreEntier(message);
                    if (!saisie_utilisateur.nombre_correcte)
                    {
                        message.Afficher_Saisie_Incorrecte();  
                    }
                    else if (saisie_utilisateur.saisie > nombre_aléatoire.max || saisie_utilisateur.saisie < nombre_aléatoire.min)
                    {
                        message.Afficher_Saisie_Hors_Intervalle(saisie_utilisateur);
                    }
                } while (saisie_utilisateur.nombre_correcte == false || saisie_utilisateur.saisie > nombre_aléatoire.max || saisie_utilisateur.saisie < nombre_aléatoire.min);
                return nombre_saisie;
            }       
        }
    }
    Classe de comparaison Saisie vs Nombre aléatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Vérification_nombre
        {
            public Vérification_nombre()
            {
     
            }
     
            public int Comparer_Saisie_Et_NombreAleatoire(Saisie_utilisateur saisie_utilisateur, Nombre_aléatoire nombre_aléatoire, Messages message, Nombre_Dessais nombre_dessais, Vérification_saisie vérification_saisie, Nouvelle_Partie nouvelle_partie)
            {
                int nombre_saisie;
     
                do
                {
                    nombre_saisie = vérification_saisie.Vérifier_Saisie(saisie_utilisateur, nombre_aléatoire, message);
                    if (saisie_utilisateur.saisie == nombre_aléatoire.nombre_aléatoire)
                    {
                        nouvelle_partie.Generer_Nouvelle_Partie(saisie_utilisateur, nombre_aléatoire, message, nombre_dessais);
                    }
                    if (saisie_utilisateur.saisie < nombre_aléatoire.nombre_aléatoire)
                        message.Afficher_PlusGrand();
                    else
                        message.Afficher_PlusPetit();
     
                    nombre_dessais.Afficher_Nombre_De_Saisie(message, nombre_dessais);
                } while (saisie_utilisateur.saisie != nombre_aléatoire.nombre_aléatoire);
                return nombre_saisie;
            }   
        }
    }
    Classe Compter Nombre D'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Nombre_Dessais
        {
            public int nb_saisie = 0;
            public Nombre_Dessais()
            {
     
            }
     
            public void Afficher_Nombre_De_Saisie(Messages message, Nombre_Dessais nombre_dessais)
            {
     
     
                nb_saisie = ++nb_saisie;
                message.Afficher_Nombre_Dessais(nombre_dessais);
                message.Afficher_Espace();
            }
        }
    }
    Une classe Nouvelle Partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace JeuNombrePOO
    {
        class Nouvelle_Partie
        {
            public Nouvelle_Partie()
            {
     
            }
     
            public void Generer_Nouvelle_Partie(Saisie_utilisateur saisie_utilisateur, Nombre_aléatoire nombre_aléatoire, Messages message, Nombre_Dessais nombre_dessais)
            {
                message.Afficher_Espace();
                message.Afficher_Victoire();
                nombre_aléatoire.Generer_Nombre_Aleatoire();
                nombre_dessais.nb_saisie = 0;
                message.Afficher_Espace();
                saisie_utilisateur.Demander_Saisie_NombreEntier(message);
            }
     
        }
    }
    Le Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    using System;
     
    namespace JeuNombrePOO
    {
        class Program
        {
            static void Main(string[] args)
            {
                Nombre_aléatoire nombre_aléatoire = new Nombre_aléatoire();
                Saisie_utilisateur saisie_utilisateur = new Saisie_utilisateur();
                Vérification_nombre vérification_nombre = new Vérification_nombre();
                Messages message = new Messages();
                Nouvelle_Partie nouvelle_partie = new Nouvelle_Partie();
                Vérification_saisie vérification_saisie = new Vérification_saisie();
                Nombre_Dessais nombre_dessais = new Nombre_Dessais();
     
                nombre_aléatoire.Generer_Nombre_Aleatoire();
                message.Afficher_Bonjour();
                vérification_nombre.Comparer_Saisie_Et_NombreAleatoire(saisie_utilisateur, nombre_aléatoire, message, nombre_dessais, vérification_saisie, nouvelle_partie);
            }
        }
    }
    Je sais que je vous envoi un pavé , mais si vous pouvez me guider un peu dans cette quête du couplage = quasi null, je veux bien de votre aide !

    Par avance merci et au plaisir de vous lire !

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Oui on dirait que t'a découpé en classe juste pour le principe de découpler, tu aurai pu très bien crée ton jeu sans crée d'autre classe.

    Rien que pour la gestion de l'affichage de message une fonction qui prend en entrée une enum et qui retourne une string aurait été plus intéressant et encore pqs sur que t'en es besoin.

    Tu pourrais faire une simple boucle do/while pour gérer tes parties.

  3. #3
    Membre Expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Par défaut
    On m'a toujours limite interdit d'utiliser ça et je m'efforce de ne pas l'utiliser .

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Citation Envoyé par DuyBinh Voir le message
    On m'a toujours limite interdit d'utiliser ça et je m'efforce de ne pas l'utiliser .
    C'est quoi ces conneries ne pas utiliser de do/while ?

    D'accord pour ne pas utiliser de While(true) mais c'est une grosse connerie de ne pas utiliser la boucle while qui est la meilleure solution dans certains cas sinon pourquoi elle serait là ? (après le Goto est là mais lui faut éviter de l'utiliser )

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    ne pas utiliser de While(true)
    et pourquoi ne pas utiliser les while true ?
    (et en vrai perso j'en utilise pas mal ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    et pourquoi ne pas utiliser les while true ?
    (et en vrai perso j'en utilise pas mal ...)
    Bein pour les tests ça se fait mais t'as vite fait de l'oublier et d'avoir un blocage sur ton appli

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2020
    Messages : 23
    Par défaut
    Alors excusez mon ignorance mais je ne comprends pas vraiment ce qui va pas dans ce que j'ai fait?

    Moi je pensais que mon codage était bon, mais juste je couplais trop les classes, mais finalement cette phrase m’interpelle :
    "Oui on dirait que t'a découpé en classe juste pour le principe de découpler, tu aurai pu très bien crée ton jeu sans crée d'autre classe."

    Cela voudrait-il dire qu'il y a une manière de coder pour que les classes soient vraiment des classes?

    Du coup je suis un peu paumé là?

    EDIT : et pourquoi "do/while" ne doit jamais être utilisé? :O

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Il faut que ta classe est une utilité réelle, réponde à une problématique, mais n'est pas la pour juste scinder ton code. (J'avoue je ne suis pas très clair)
    Tu crée la classe générer code aléatoire mais ça ne fait rien de plus qu'appeler la classe Random, pourquoi ne pas utiliser directement cette classe, pareille ta classe message à quoi sert-elle, tu aurais écris moins de ligne de code en écrivant tout dans le main.
    Tu aurai eu l'utilité d'une classe si par exemple tu veut stocker le score, les infos de la partie.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2020
    Messages : 23
    Par défaut
    Ok je vois mieux maintenant où tu voulais en venir !

    Je reconnais que pour le coup j'ai scindé en fonction des thèmes : messages, nombre aléatoire, saisie, saisie vs nombre aléatoire etc.

    Mais ce que tu me dis est super intéressant, donc un développeur, ne va créer une classe que si il juge que s'est nécessaire.

    Alors la question qui me vient, c'est à partir de quoi vous jugez qu'une classe à part entière devient nécessaire? Peut-être que cette question est trop vague car trop de cas particuliers qui demande une foultitude de réponse?

    EDIT : en fait tu y réponds avec les exemples... Dur dur les débuts dans la POO xD Bon au moins, j'ai appris à manipuler les classes c'est déjà pas mal. Maintenant je vais faire en sorte de créer des programmes avec des classes qui ont du sens

Discussions similaires

  1. Problème commandes shell-trop d'arguments
    Par SuperCed dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/12/2006, 12h57
  2. Erreur compilation: fichiers Include trop nombreux
    Par Pierrick584 dans le forum C++
    Réponses: 5
    Dernier message: 21/10/2006, 00h24
  3. methode fill,erreur ! arguments trop nombreux
    Par getule dans le forum Accès aux données
    Réponses: 2
    Dernier message: 13/10/2006, 21h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo