Partage
  • Partager sur Facebook
  • Partager sur Twitter

Blocage sur l'encapsulation

    22 mars 2020 à 13:34:08

    Bonjour,

    J'essaie actuellement de réaliser le TP en C# POO du cours mais je bloque réellement sur le terme "encapsuler".

    En quoi cela consiste vraiment ? Je n'arrive pas à comprendre à quoi cela sert et comment l'incorporer au code...

    Voici les 2 consignes qui me gênent :

    - possède une propriété en lecture seule permettant de savoir si le joueur est vivant, et encapsule le nombre de points de vie.

    - possède une propriété en lecture seule qui encapsule le fait de savoir si le monstre est vivant

    et ma classe "Joueur" (car je crois déjà avoir encapsulé le nombre de points de vie) :

    Merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
    Maxime PETRE
      22 mars 2020 à 13:41:16

      Il me semble que ceci répond plutôt bien à la question : https://fr.m.wikipedia.org/wiki/Encapsulation_(programmation)#Motivations

      Si c'est pas le cas, faudrait voir à préciser la question.

      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.
        22 mars 2020 à 14:47:39

        Merci pour cette réponse !

        Qu'est-ce que ça donnerait avec un exemple de code ?? Si c'est trouvable ?

        Merci !

        • Partager sur Facebook
        • Partager sur Twitter
        Maxime PETRE
          22 mars 2020 à 21:23:22

          Salut,

          Un exemple qui ne correspond pas exactement avec ce que tu dois faire, mais qui illustre :

          class Personnage
          
          {
          
               public int NombrePointsDeVie { get; private set; }
          
          
               public Personnage()
          
               {
          
                    this.NombrePointsDeVie = 100;
          
               }
          
          
               public bool EstVivant
          
               {
          
                    get => this.NombrePointsDeVie > 0;
          
               }
          
          
               public void CoupDeLance()
          
               {
          
                    this.NombrePointsDeVie -= 20;
          
               }
          
          }

          Dans cet exemple, tu ne souhaites pas qu'un autre programmeur puisse accéder directement en écriture au nombre de points de vie, car ça n'a aucun sens ! Tu veux qu'il reste accessible en lecture. En revanche tu veux savoir si le personnage est vivant (donc combien de points il lui reste), et également tu ne souhaites pas que ce soit directement modifiable, car ça n'a aucun sens. Enfin, ces variables vont être influencées par l'interaction qui, elle, est rendue accessible :

          Personnage monPerso = new Personnage();
          
          monPerso.CoupDeLance();
          
          monPerso.CoupDeLance();
          
          monPerso.CoupDeLance();
          
          Console.WriteLine(monPerso.EstVivant); // affiche True
          
          monPerso.CoupDeLance();
          
          monPerso.CoupDeLance();
          
          Console.WriteLine(monPerso.EstVivant); // affiche False

          Tu as donc encapsulé certaines valeurs et certains procédés, et tu ne rends accessible à l'utilisateur qu'une partie des informations. Vois ça comme une interface homme-machine, l'homme n'a pas besoin de tous les engrenages mais seulement de quelques boutons basiques pour déclencher des actions parfois très complexes (comme ce que je fais en ce moment, je tape sur un clavier, je n'ai pas besoin de connaître le détail de l'algorithme derrière le fait d'appuyer sur "espace").

          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2020 à 8:53:17

            Merci beaucoup pour ce superbe exemple !

            Mais n'avais-je déjà pas encapsulé la valeur du nombre de points de vie dans mon code ?

            • Partager sur Facebook
            • Partager sur Twitter
            Maxime PETRE
              24 mars 2020 à 0:24:47

              Si, c'est exactement ce que tu as fait !

              Petite aide pour "simplifier" ton code (ça fait exactement la même chose, mais en 3 fois moins de lignes) :

              public class Joueur
              {
              // En utilisant les propriétés, tu simplifies drôlement tes accès aux champs qui sont même "cachés" dans ce cas précis public int VieHeros { get; private set; } public bool HerosAlive { get => VieHeros > 0; } public Joueur() { VieHeros = 150; } static void Attaque(object pMonstre) { } }



              D'ailleurs je suis sceptique quant à la nécessité d'avoir une méthode statique pour lancer une attaque, et que celle-ci prenne en argument ou object (c'est-à-dire n'importe quoi, même pourquoi pas un boolean, ce qui n'a aucun sens).

              • Partager sur Facebook
              • Partager sur Twitter
                24 mars 2020 à 1:00:24

                Super, merci pour toutes ces précisions !

                En effet, j'ai enlevé "static" et mis "public" afin de pouvoir y accéder en dehors sans pour autant y avoir accès n'importe comment (avec le "static" si j'ai bien compris) !

                • Partager sur Facebook
                • Partager sur Twitter
                Maxime PETRE

                Blocage sur l'encapsulation

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown