Salut! Consacrons la leçon d'aujourd'hui à l'encapsulation et commençons tout de suite par des exemples :) Principes d'encapsulation - 1Ici, vous avez une machine à soda ordinaire . J'ai une question pour vous : comment ça marche ? Essayez de fournir une réponse détaillée : d'où vient la tasse, comment la température interne est-elle maintenue, où est stockée la glace, comment la machine sait-elle quel sirop ajouter, etc. ? Vous n'avez probablement pas de réponses à ces questions. Assez juste, puisque tout le monde n'utilise pas de telles machines. Ils ne sont pas si populaires de nos jours. Essayons de donner un autre exemple. Quelque chose que vous utilisez certainement plusieurs fois par jour. Ah, voilà une idée ! Principes d'encapsulation - 2Dites-nous comment le moteur de recherche Googletravaux. Comment recherche-t-il exactement les informations liées aux mots que vous saisissez ? Pourquoi certains résultats sont-ils bien classés et pas d'autres ? Même si vous utilisez Google tous les jours, il y a de fortes chances que vous ne le sachiez pas. Mais cela n'a pas d'importance. Vous n'avez pas besoin de le savoir. Vous pouvez entrer des requêtes dans un moteur de recherche sans vous soucier de son fonctionnement. Vous pouvez acheter du soda à une machine sans savoir comment cela fonctionne. Vous pouvez conduire une voiture sans comprendre le fonctionnement d'un moteur à combustion interne et sans connaître du tout la physique, même au niveau de l'école primaire. Tout cela est possible grâce à l'un des grands principes de la programmation orientée objet : l'encapsulation. En lisant divers articles sur la programmation orientée objet (POO), vous devez être tombé sur le fait que la programmation implique deux concepts communs : encapsulation et masquage . Et les auteurs utilisent le mot "encapsulation" pour signifier une chose, puis une autre. Nous allons explorer les deux termes afin que vous acquériez une compréhension complète. En programmation, la signification originale de l'encapsulation est le regroupement de données, ainsi que les méthodes qui opèrent sur ces données, en une seule unité (c'est-à-dire une "capsule"). En Java, la classe est l'unité d'encapsulation. Une classe contient à la fois des données (champs) et des méthodes pour travailler avec ces données.Principes d'encapsulation - 3Cela peut sembler être l'approche évidemment correcte pour vous, mais dans d'autres paradigmes de programmation, tout est arrangé différemment. Par exemple, dans la programmation fonctionnelle, les données sont strictement séparées des opérations sur celles-ci. En POO, les programmes sont constitués de capsules, ou classes, composées à la fois de données et de fonctions permettant de travailler avec ces données. Parlons maintenant de la dissimulation . Comment se fait-il que nous utilisions toutes sortes d'appareils complexes sans comprendre comment ils sont organisés ou comment ils fonctionnent ? C'est simple : leurs créateurs nous ont fourni une interface simple et pratique. Sur une machine à soda, l'interface est constituée des boutons du panneau. En appuyant sur un bouton, vous choisissez la taille de bonnet. En appuyant sur un autre, vous choisissez la saveur. Un troisième est chargé d'ajouter de la glace. Et c'est tout ce que vous devez faire. L'organisation interne de la machine n'a pas d'importance. Ce qui compte, c'est qu'il est conçu de manière à obliger l'utilisateur à appuyer sur trois boutons pour obtenir du soda . Il en est de même pour les voitures. Peu importe ce qui se passe à l'intérieur. Ce qui compte, c'est que lorsque vous appuyez sur la pédale de droite, la voiture avance, et lorsque vous appuyez sur la pédale de gauche, elle ralentit. C'est à cela que se cache. Tous les "intérieurs" d'un programme sont cachés à l'utilisateur. Pour l'utilisateur, ces informations superflues et inutiles. L'utilisateur a besoin du résultat final, pas du processus interne. Prenons Autol'exemple de la classe :

public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();
      
       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
Voici à quoi ressemble le masquage d'implémentation dans un programme Java. C'est comme dans la vraie vie : l'utilisateur dispose d'une interface (méthodes). Si l'utilisateur a besoin d'une voiture dans un programme pour effectuer une action, il appelle simplement la méthode souhaitée. Ce qui se passe à l'intérieur de ces méthodes est superflu. Ce qui compte, c'est que tout fonctionne comme il se doit. Ici, nous parlons de masquage d'implémentation . En plus de cela, Java cache également des données . Nous avons écrit à ce sujet dans la leçon sur les getters et les setters , mais revoir le concept ne fera pas de mal. Par exemple, nous avons une Catclasse :

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

  
}
Peut-être vous souvenez-vous du problème avec cette classe de la dernière leçon ? Si ce n'est pas le cas, rappelons-le maintenant. Le problème est que ses données (champs) sont ouvertes à tous — un autre programmeur peut facilement créer un chat sans nom avec un poids de 0 et un âge de -1000 ans :

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Vous pouvez peut-être surveiller de près si l'un de vos collègues a créé des objets avec un état invalide, mais il serait bien préférable d'exclure même la possibilité de créer de tels "objets invalides". Principes d'encapsulation - 4Les mécanismes suivants nous aident à masquer les données :
  1. modificateurs d'accès ( privé , protégé , paquet par défaut )
  2. getters et setters
Par exemple, nous pouvons y mettre une coche pour voir si quelqu'un essaie d'attribuer un nombre négatif à l'âge du chat. Comme nous l'avons dit précédemment, les auteurs de divers articles sur l'encapsulation veulent parfois dire combiner des données et des méthodes, ou les cacher, ou les deux (les combiner et les cacher). Java a les deux mécanismes (ce n'est pas nécessairement vrai pour les autres langages POO), donc la dernière signification est la plus correcte. L'encapsulation nous offre plusieurs avantages importants :
  1. Contrôle de l'état correct d'un objet. Il y avait des exemples de cela ci-dessus. Un passeur et le modificateur privé garantissent que notre programme n'aura pas de chats dont le poids est de 0.

  2. Convivialité grâce à une interface. Seules les méthodes sont laissées "exposées" au monde extérieur. Il suffit d'appeler des méthodes pour obtenir un résultat — il n'est absolument pas nécessaire de se plonger dans les détails de leur fonctionnement.

  3. Les changements de code n'affectent pas les utilisateurs. Nous apportons toutes les modifications à l'intérieur des méthodes. Cela n'affecte pas l'utilisateur de la méthode : si le bon code était auparavant "auto.gas()" pour appliquer la pédale d'accélérateur, alors il continuera à l'être. Le fait que nous ayons changé quelque chose à l'intérieur de la méthode gas() reste invisible pour l'utilisateur : comme précédemment, l'appelant reçoit simplement le résultat souhaité.