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 :

Dois-je supprimer ces méthodes ? [Débutant]


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Dois-je supprimer ces méthodes ?
    Bonjour tout le monde,

    Je suis en train de faire l'activité sur le site du cours « Programmez en orienté objet avec C# » de Monsieur Nicolas Hilaire c'est la suite du cours « Apprenez à développer en C# »

    Voici le code complet que j'ai fait pour répondre au problème de cette activité :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace ActiviteOrienteObjet
    {
        class Program
        {
            private static Random random = new Random();
     
            static void Main(string[] args)
            {
                AfficheMenu();
                ConsoleKeyInfo consoleKeyInfo = Console.ReadKey(true);
                while (consoleKeyInfo.Key != ConsoleKey.D1 && consoleKeyInfo.Key != ConsoleKey.D2 && consoleKeyInfo.Key != ConsoleKey.NumPad1 && consoleKeyInfo.Key != ConsoleKey.NumPad2)
                {
                    AfficheMenu();
                    consoleKeyInfo = Console.ReadKey(true);
                }
                if (consoleKeyInfo.Key == ConsoleKey.D1 || consoleKeyInfo.Key == ConsoleKey.NumPad1)
                    Jeu1();
                else
                    Jeu2();
            }
     
            private static void AfficheMenu()
            {
                Console.Clear();
                Console.WriteLine("Veuillez choisir votre mode de jeu :");
                Console.WriteLine("\t1 : Contre les monstres");
                Console.WriteLine("\t2 : Contre le boss de fin");
            }
            private static void Jeu1()
            {
                Joueur nicolas = new Joueur(150);
                int cptFacile = 0;
                int cptDifficile = 0;
                while (nicolas.EstVivant)
                {
                    MonstreFacile monstre = FabriqueDeMonstre();
                    while (monstre.EstVivant && nicolas.EstVivant)
                    {
                        nicolas.Attaque(monstre);
                        if (monstre.EstVivant)
                            monstre.Attaque(nicolas);
                    }
     
                    if (nicolas.EstVivant)
                    {
                        if (monstre is MonstreDifficile)
                            cptDifficile++;
                        else
                            cptFacile++;
                    }
                    else
                    {
                        Console.WriteLine("Snif, vous êtes mort...");
                        break;
                    }
                }
                Console.WriteLine("Bravo !!! Vous avez tué {0} monstres faciles et {1} monstres difficiles. Vous avez {2} points.", cptFacile, cptDifficile, cptFacile + cptDifficile * 2);
            }
     
            private static MonstreFacile FabriqueDeMonstre()
            {
                if (random.Next(2) == 0)
                    return new MonstreFacile();
                else
                    return new MonstreDifficile();
            }
     
     
            private static void Jeu2()
            {
                Joueur nicolas = new Joueur(150);
                BossDeFin boss = new BossDeFin(250);
                while (nicolas.EstVivant && boss.EstVivant)
                {
                    nicolas.Attaque(boss);
                    if (boss.EstVivant)
                        boss.Attaque(nicolas);
                }
                if (nicolas.EstVivant)
                    Console.WriteLine("Bravo, vous avez sauvé la princesse (ou le prince !)");
                else
                    Console.WriteLine("Game over...");
            }
        }
     
        public static class De
        {
            private static Random random = new Random();
     
            public static int LanceLeDe()
            {
                return random.Next(1, 7);
            }
     
            public static int LanceLeDe(int valeur)
            {
                return random.Next(1, valeur);
            }
        }
        // Cette classe Personnage est en "abstract" car d'après l'énoncé de cette activité, elle devait avoir des méthode abstraite.  
        public abstract class Personnage
        {
            public abstract bool EstVivant
            {
                get;
            }
     
            public abstract void Attaque(Personnage perso);
     
            public abstract void SubitDegats(int degats);
     
            public int LanceLeDe()
            {
                return De.LanceLeDe();
            }
     
     
        }
        // J'ai mis cette classe PersonnageAPointDeVie en "abstract" même si cette classe n'a pas de méthode abstraite car je pense que cela a plus de 
        // sens qu'elle soit en "abstract" étant donné que d'instancier une telle classe ne sert pas à grands choses. il me semble qu'elle a plus vocation à 
        // être dérivé.
        public abstract class PersonnageAPointDeVie : Personnage
        {
     
            public override void Attaque(Personnage perso)
            {
                LanceLeDe();          
            }
            public int PtsDeVies { get; set; }
            public PersonnageAPointDeVie(int point)
            {
                PtsDeVies = point;
            }
     
            public override bool EstVivant
            {
                get { return PtsDeVies > 0; }
            }
     
            public int LanceLeDe(int valeur)
            {
                return De.LanceLeDe(valeur);
            }
     
        }
     
     
        public class MonstreFacile : Personnage
        {
            private const int degats = 10;
            protected bool estEnVie = true;
            public override bool EstVivant
            {
                get
                {
                    return estEnVie;
                }
            }
     
            // Implémentation obligatoire et substitution de la méthode abstraite "Attaque" hérité de la classe Personnage 
            public override void Attaque(Personnage perso) 
            {
                int lanceMonstre = LanceLeDe();
                int lanceJoueur = perso.LanceLeDe();
                if (lanceMonstre > lanceJoueur)
                    perso.SubitDegats(degats);
            }
            // Surcharge de la méthode "Attaque" ci-dessous et cette méthode a été mise en "virtual" en vue d'une substitution dans la classe dérivé " MonstreDifficile"
            public virtual void Attaque(Joueur joueur)
            {
                int lanceMonstre = LanceLeDe();
                int lanceJoueur = joueur.LanceLeDe();
                if (lanceMonstre > lanceJoueur)
                    joueur.SubitDegats(degats);
            }
     
     
            // Ci-dessous implémentation obligatoire et substitution de la méthode abstraite "SubitDegats" hérité de la classe Personnage 
     
            public override void SubitDegats(int deg)
            {
                estEnVie = false;
            }
     
            // Surcharge de la méthode "SubitDegats" ci-dessous
            public void SubitDegats()
            {
                estEnVie = false;
            }
     
     
     
        }
     
        public class MonstreDifficile : MonstreFacile
        {
            private const int degatsSort = 5;
            // Substitution de la méthode " Attaque(Joueur joueur)" hérité de la classe MonstreFacile
            public override void Attaque(Joueur joueur)
            {
                base.Attaque(joueur);
                joueur.SubitDegats(SortMagique());
            }
     
            private int SortMagique()
            {
                int valeur = De.LanceLeDe();
                if (valeur == 6)
                    return 0;
                return degatsSort * valeur;
            }
        }
     
        public class Joueur : PersonnageAPointDeVie
        {
            public Joueur(int point) : base(point)
            {
            }
     
     
            // Surcharges de la méthode "Attaque" ci-dessous
            public void Attaque(MonstreFacile monstre)
            {
                int lanceJoueur = LanceLeDe();
                int lanceMonstre = monstre.LanceLeDe();
                if (lanceJoueur >= lanceMonstre)
                    monstre.SubitDegats();
            }
     
            public void Attaque(BossDeFin boss)
            {
                int nbPoints = LanceLeDe(26);
                boss.SubitDegats(nbPoints);
            }
            // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
            public override void SubitDegats(int degats)
            {
                if (!BouclierFonctionne())
                    PtsDeVies -= degats;
            }
     
            private bool BouclierFonctionne()
            {
                return De.LanceLeDe() <= 2;
            }
        }
     
        public class BossDeFin : PersonnageAPointDeVie
        {
            public BossDeFin(int point) : base(point)
            {
            }
            // Surcharge de la méthode "Attaque" ci-dessous
            public void Attaque(Joueur personnage)
            {
                int nbPoints = LanceLeDe(26);
                personnage.SubitDegats(nbPoints);
            }
            // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
            public override void SubitDegats(int valeur)
            {
                PtsDeVies -= valeur;
            }
        }
    }
    On m'a dit dans une discussion de forums d'OC qui fallait supprimer les méthodes Attaque(Joueur joueur) et SubitDegats() surchargé de la classe MonstreFacile.

    *Dans cette discussion j'ai mis qu'un code partiel étant donné qu'un code complet serai une solution à une activité du site qui est noté.

    Qu'en pensez-vous?

    Je vous pose cette question pour avoir d'autres avis.

    Personnellement j'ai des réserves à propos de la suppression de ces méthodes car pour Attaque(Joueur joueur) : Un objet de type MonstreFacile a pour vocation attaquer seulement un objet de type
    Joueur ; donc il me semble que sur le principe c'est mieux d'avoir la méthode Attaque avec un paramètres de type Joueur même si Attaque(Personnage personnage) seul, techniquement, pourrait faire l'affaire.
    Je suis aussi tenter de garder SubitDegats() car c'est plus élégant de l'utiliser sous cette forme dans la méthode Attaque( MonstreFacile) de la classe Joueur. Si on ne l'avait pas sous cette forme on serait obligé de mettre un paramètres int aléatoires à SubitDegats(int degats).

    Je vous remercie pour votre aide par avance.

    Je vous souhaite une très bonne soirée.

    Bien cordialement.
    Aclanto

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonsoir,

    Je serais aussi d'avis de les supprimer aussi pour les raisons suivantes :

    - Attaque(Joueur) :

    Déjà le code est quasi rigoureusement le même que Attaque(Personnage), mais surtout en faisant ça tu perds un peu l'intérêt du polymorphisme. Que se passe t-il si tu ajoutes plus tard le fait que montre peut être confus, et s'attaquer lui-même ou bien un autre monstre ? Qu'importe ce que le monstre attaque, ici la clé est l'appel à la méthode SubitDegats() qui saura faire la différence. En gros ta méthode ne change rien, ni lors de son appel, ni lors de son exécution, elle est superflue.

    - SubitDegats() :

    Là aussi c'est un problème, bien que Monstre ne possède pas de points de vie, il faut quand même utiliser celle qui a pour paramètre les dégâts. Encore une fois pour une question de polymorphisme.
    En gros l'idée est que quoi que le joueur attaque, tu n'as pas à gérer ce que c'est en amont. Surtout que si tu rajoutes un autre type de monstre, il te faudra alors surcharger cette méthode aussi car elle sera disponible pour toutes les classes héritées.

    Je profite de ton poste pour signaler que je trouve l'énoncé de cet exercice assez bancale. Il est assez bon dans son ensemble mais c'est au niveau des classes que vient mon soucis. MonstreFacile devrait plutôt s’appeler Monstre tout court sinon ça implique que la difficulté est géré par l'héritage et ça pourrait induire les débutants en erreur (ce qui me fait pensé a pourquoi tu as voulu rajouter SubitDegats() sans valeur). Et le fait que BossDeFin découle de PersonnageAPointDeVie au lieu de Monstre c'est vraiment pas fou-fou niveau flexibilité, il serait largement préférable de gérer la vie autrement. Je comprends l'idée derrière tout ça mais bon. Si un jour tu fais un jeu, ne reprends pas cette architecture .

    Voilà désolé pour le petit grain de sel mais tu n'es pas la première personne que je vois qui a des problèmes à cause de son énoncé.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonsoir PixelJuice,

    Je te remercie pour ton message qui m'a beaucoup aidé.

    J'ai supprimé de mon code les surcharges des méthodes Attaque(Joueur) et SubitDegats() superflux.

    Je suis même allé plus loin puisque j'ai même la méthode Attaque(Personnage) de la classe PersonnageAPointDeVie par contre j'ai du rajouté une variable int dégats en protected pourvoir remplacer SubitDegats() et paramétré SubitDegats(int degats) je ne suis pas sure d'avoir coder avec bonne syntaxe.
    A l'origine si j'avais rajouter SubitDegats(), je pense ce n'était pas tellement à cause de la mauvaise organisation des classes de l'énoncer cet exercice, c'était principalement pour éviter d'avoir un paramètre dont, dans certain cas, je ne saurais pas quelle valeur lui donner. Ce paramètre, je le trouvais embarrassant ceci dit une méthode en trop est plus embarrassante

    Voici ce que le nouveau code donne :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace activite1Tuto2CdiezeFinal
    {
        class Program
        {
     
                private static Random random = new Random();
     
                static void Main(string[] args)
                {
                    AfficheMenu();
                    ConsoleKeyInfo consoleKeyInfo = Console.ReadKey(true);
                    while (consoleKeyInfo.Key != ConsoleKey.D1 && consoleKeyInfo.Key != ConsoleKey.D2 && consoleKeyInfo.Key != ConsoleKey.NumPad1 && consoleKeyInfo.Key != ConsoleKey.NumPad2)
                    {
                        AfficheMenu();
                        consoleKeyInfo = Console.ReadKey(true);
                    }
                    if (consoleKeyInfo.Key == ConsoleKey.D1 || consoleKeyInfo.Key == ConsoleKey.NumPad1)
                        Jeu1();
                    else
                        Jeu2();
                }
     
                private static void AfficheMenu()
                {
                    Console.Clear();
                    Console.WriteLine("Veuillez choisir votre mode de jeu :");
                    Console.WriteLine("\t1 : Contre les monstres");
                    Console.WriteLine("\t2 : Contre le boss de fin");
                }
                private static void Jeu1()
                {
                    Joueur nicolas = new Joueur(150);
                    int cptFacile = 0;
                    int cptDifficile = 0;
                    while (nicolas.EstVivant)
                    {
                        MonstreFacile monstre = FabriqueDeMonstre();
                        while (monstre.EstVivant && nicolas.EstVivant)
                        {
                            nicolas.Attaque(monstre);
                            if (monstre.EstVivant)
                                monstre.Attaque(nicolas);
                        }
     
                        if (nicolas.EstVivant)
                        {
                            if (monstre is MonstreDifficile)
                                cptDifficile++;
                            else
                                cptFacile++;
                        }
                        else
                        {
                            Console.WriteLine("Snif, vous êtes mort...");
                            break;
                        }
                    }
                    Console.WriteLine("Bravo !!! Vous avez tué {0} monstres faciles et {1} monstres difficiles. Vous avez {2} points.", cptFacile, cptDifficile, cptFacile + cptDifficile * 2);
                }
     
                private static MonstreFacile FabriqueDeMonstre()
                {
                    if (random.Next(2) == 0)
                        return new MonstreFacile();
                    else
                        return new MonstreDifficile();
                }
     
     
                private static void Jeu2()
                {
                    Joueur nicolas = new Joueur(150);
                    BossDeFin boss = new BossDeFin(250);
                    while (nicolas.EstVivant && boss.EstVivant)
                    {
                        nicolas.Attaque(boss);
                        if (boss.EstVivant)
                            boss.Attaque(nicolas);
                    }
                    if (nicolas.EstVivant)
                        Console.WriteLine("Bravo, vous avez sauvé la princesse (ou le prince !)");
                    else
                        Console.WriteLine("Game over...");
                }
            }
     
            public static class De
            {
                private static Random random = new Random();
     
                public static int LanceLeDe()
                {
                    return random.Next(1, 7);
                }
     
                public static int LanceLeDe(int valeur)
                {
                    return random.Next(1, valeur);
                }
            }
            // Cette classe Personnage est en "abstract" car d'après l'énoncé de cette activité, elle devait avoir des méthode abstraite.  
     
            public abstract class Personnage
            {
     
                public abstract bool EstVivant
                {
                    get;
                }
     
                public abstract void Attaque(Personnage perso);
     
                public abstract void SubitDegats(int degats);
     
                public int LanceLeDe()
                {
                    return De.LanceLeDe();
                }
     
     
            }
            // J'ai mis cette classe PersonnageAPointDeVie en "abstract" même si cette classe n'a pas de méthode abstraite car je pense que cela a plus de 
            // sens qu'elle soit en "abstract" étant donné que d'instancier une telle classe ne sert pas à grands choses. Il me semble qu'elle n'a pas vocation à 
            // être dérivé.
     
            public abstract class PersonnageAPointDeVie : Personnage
            {
            protected int degats = 1;
     
            // méthode supprimé :
            //public override void Attaque(Personnage perso)
            //{
            //    LanceLeDe();
            //}
     
            public int PtsDeVies { get; set; }
                public PersonnageAPointDeVie(int point)
                {
                    PtsDeVies = point;
                }
     
                public override bool EstVivant
                {
                    get { return PtsDeVies > 0; }
                }
     
                public int LanceLeDe(int valeur)
                {
                    return De.LanceLeDe(valeur);
                }
     
            }
     
     
            public class MonstreFacile : Personnage
            {
                private const int degats = 10;
                protected bool estEnVie = true;
                public override bool EstVivant
                {
                    get
                    {
                        return estEnVie;
                    }
                }
     
                // Implémentation obligatoire et substitution de la méthode abstraite "Attaque" hérité de la classe Personnage 
     
                public override void Attaque(Personnage perso)
                {
                    int lanceMonstre = LanceLeDe();
                    int lanceJoueur = perso.LanceLeDe();
                    if (lanceMonstre > lanceJoueur)
                        perso.SubitDegats(degats);
                }
     
     
     
                // Ci-dessous implémentation obligatoire et substitution de la méthode abstraite "SubitDegats" hérité de la classe Personnage 
     
                public override void SubitDegats(int deg)
                {
                    estEnVie = false;
                }
     
                // Surcharge de la méthode "SubitDegats" ci-dessous
                public void SubitDegats()
                {
                    estEnVie = false;
                }
     
     
     
            }
     
            public class MonstreDifficile : MonstreFacile
            {
                private const int degatsSort = 5;
     
            // Surcharge de la méthode "Attaque" ci-dessous
     
            public void Attaque(Joueur joueur)
                {
                    base.Attaque(joueur);
                    joueur.SubitDegats(SortMagique());
                }
     
                private int SortMagique()
                {
                    int valeur = De.LanceLeDe();
                    if (valeur == 6)
                        return 0;
                    return degatsSort * valeur;
                }
            }
     
            public class Joueur : PersonnageAPointDeVie
            {
     
                public Joueur(int point) : base(point)
                {
                }
     
     
            // Surcharges de la méthode "Attaque" ci-dessous
     
            public override void Attaque(Personnage personnage)
            {
                    int lanceJoueur = LanceLeDe();
                    int lanceMonstre = personnage.LanceLeDe();
                    if (lanceJoueur >= lanceMonstre)
                        personnage.SubitDegats(degats);
                }
     
                public void Attaque(BossDeFin boss)
                {
                    int nbPoints = LanceLeDe(26);
                    boss.SubitDegats(nbPoints);
                }
                // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
     
                public override void SubitDegats(int degats)
                {
                    if (!BouclierFonctionne())
                        PtsDeVies -= degats;
                }
     
                private bool BouclierFonctionne()
                {
                    return De.LanceLeDe() <= 2;
                }
            }
     
            public class BossDeFin : PersonnageAPointDeVie
            {
                public BossDeFin(int point) : base(point)
                {
                }
                // Surcharge de la méthode "Attaque" ci-dessous
     
                public override void Attaque(Personnage personnage)
                {
                    int nbPoints = LanceLeDe(26);
                    personnage.SubitDegats(nbPoints);
                }
                // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
     
                public override void SubitDegats(int valeur)
                {
                    PtsDeVies -= valeur;
                }
            }
        }
    L'énoncé de cet exercice ne précise pas qu'il faut mettre la classe PersonnageAPointDeVie en abstract je me suis permis de le faire car je trouve cela plus logique. Qu'en penses-tu ?

    Pour conclure, cela enseigne qu'un bon code de programmation doit être synthétique et concis et doit être écris en un nombre minimum de lignes.

    PixelJuice, je te remercie encore ton aide.

    Très bonne soirée à toi.
    Bien cordialement.
    Aclanto

  4. #4
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonsoir,

    Je n'ai pas eu le temps de tout regardé mais oui ça peut être pas mal de passer PersonnageAPointDeVie en abstract. Même si dans ton cas cela ne gênerait pas le bon fonctionnement d'un objet de cette classe (comme ça peut l'être pour une classe abstraite quelques fois), tu peux t'assurer qu'aucune instance de ce type ne soit générer.

    Citation Envoyé par aclanto Voir le message
    Pour conclure, cela enseigne qu'un bon code de programmation doit être synthétique et concis et doit être écris en un nombre minimum de lignes.
    Effectivement, c'est bien dit. D'ailleurs tu découvriras tout au long de ton apprentissage qu'il y a une multitudes de principes et de règles à suivre pour écrire du code élégant, robuste, et performant. Mais s'il fallait en retenir deux, pour moi, ça serait le principe KISS (Keep It Simple, Stupid) et le SRP (Single Responsability Principle). Respecter une certaine simplicité dans la conception de son logiciel, mais surtout, faire en sorte qu'une méthode ne fasse qu'une seule et même tâche, tout comme une classe ne représente qu'une seule et même chose. Ça peut paraître évident ou peu important mais crois moi c'est crucial.

    Bonne continuation en tout cas.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonsoir PixelJuice,

    Je te remercie beaucoup pour ton dernier message et pour tes conseils dans celui-ci.

    Excuses-moi d'avoir mis un peu de temps pour répondre j'ai été pas mal pris ces derniers jours.

    A propos du principe KISS et SRP, j'ai un dernier doute par rapport à la méthode SubirDegats (int dégats) car j'ai créer une variable « int deg » dans Personnage (anciennement « int degats » dans PersonnageAPointDeVie) que mis en protected et je lui attribuée une valeur de 1 au harsard. Cette variable me sert quand j'ai justement pas besoin du paramètre de SubirDegats Comme dans ce cas*:
    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
    // * J'ai ôter des lignes de ce code pour montrer juste ma problématique avec SubirDegats (int dégats)
     
    public abstract class Personnage
        {
     
    	// ajout de cette variable pour le paramatre de SubirDegats (int dégats) quand n'a pas besion de celui-ci
     
            protected int deg = 1;
     
    	//  [Code enlevé pour plus de clarté]
     
            public abstract void SubitDegats(int degats);
     
    	//  [Code enlevé pour plus de clarté]
        }
     
     
     public class Joueur : PersonnageAPointDeVie
        {
    	//  [Code enlevé pour plus de clarté]
     
            // Surcharges de la méthode "Attaque" ci-dessous
            public override void Attaque(Personnage personnage)
            {
                int lanceJoueur = LanceLeDe();
                int lanceMonstre = personnage.LanceLeDe();
                if (lanceJoueur >= lanceMonstre)
     
    		  // J'utilise la variable int deg de Personnage car je n'ai pas besoin du paramètre de  SubitDegats
                    personnage.SubitDegats(deg);
            }
     
    	//  [Code enlevé pour plus de clarté]
     
            // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
            public override void SubitDegats(int degats)
            {
                if (!BouclierFonctionne())
                    PtsDeVies -= degats;
            }
     
    	//  [Code enlevé pour plus de clarté]
        }
    Aurais-je dû créer la variable int deg ou adopté la solution ci-dessous sans créer cette variable int deg ?
    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
    // J'ai ôter des lignes de ce code pour montrer juste ma problématique avec SubirDegats (int dégats) comme dans l'extrait précédent.
     
    public abstract class Personnage
        {
     
    	//  [Code enlevé pour plus de clarté] et suppression de int deg
            public abstract void SubitDegats(int degats);
     
    	//  [Code enlevé pour plus de clarté]
        }
     
     
     public class Joueur : PersonnageAPointDeVie
        {
    	//  [Code enlevé pour plus de clarté]
     
            // Surcharges de la méthode "Attaque" ci-dessous
            public override void Attaque(Personnage personnage)
            {
                int lanceJoueur = LanceLeDe();
                int lanceMonstre = personnage.LanceLeDe();
                if (lanceJoueur >= lanceMonstre)
    		  //J'enlève la variable int deg de Personnage et je met un paramètre au harzard.
                    personnage.SubitDegats(1);
            }
     
    	//  [Code enlevé pour plus de clarté]
     
            // Substitution de la méthode " SubitDegats(int degats)" hérité de la classe Personnage
            public override void SubitDegats(int degats)
            {
                if (!BouclierFonctionne())
                    PtsDeVies -= degats;
            }
     
    	//  [Code enlevé pour plus de clarté]
        }
    En plus je suis surpris de pouvoir utiliser personnage.SubitDegats(int degats) alors que je n'ai pas encore implémenter SubitDegats.

    Merci encore pour ton aide précieuse.

    Je souhaite une très bonne soirée ainsi qu'une très bonne fin de week-end.

    Bien cordialement.
    Aclanto

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer une méthode générée par Matisse
    Par Babaôrom dans le forum NetBeans
    Réponses: 2
    Dernier message: 21/11/2006, 09h13
  2. "Impossible de supprimer ces enregistrements"
    Par emmablue dans le forum Access
    Réponses: 6
    Dernier message: 26/07/2006, 12h54
  3. [Select()/Focus()] Pb dans l'utilisation de ces méthodes
    Par Kylen dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/06/2005, 14h54
  4. [DOM] d'où viennent ces méthodes ?
    Par Kendael dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 02/06/2005, 14h05

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