1. Introduction

Nous voulons consacrer la leçon d'aujourd'hui à l'encapsulation . Vous savez déjà ce que c'est en termes généraux.

Encapsulation

Quels sont les avantages de l'encapsulation ? Il y en a plusieurs, mais je peux en citer quatre qui, à mon avis, sont les principaux :


2. État interne valide

Dans les programmes, des situations surviennent souvent lorsqu'un objet interagit avec plusieurs autres classes. Ces interactions avec l'objet peuvent corrompre les données à l'intérieur de l'objet, empêchant l'objet de continuer à fonctionner comme prévu.

Par conséquent, l'objet doit suivre toutes les modifications apportées à ses données internes ou, mieux encore, effectuer les modifications lui-même.

Si nous ne voulons pas qu'une variable soit modifiée par d'autres classes, nous la déclarons privée. Une fois que nous avons fait cela, seules les méthodes de sa propre classe peuvent y accéder. Si nous voulons que les variables soient en lecture seule, nous devons ajouter un public getterpour les variables pertinentes.

Par exemple, supposons que nous voulions que tout le monde puisse connaître le nombre d'éléments de notre collection, mais nous ne voulons pas qu'ils puissent modifier la collection sans notre permission. Ensuite, nous déclarons une private int countvariable et une public getCount()méthode.

L'utilisation appropriée de l'encapsulation garantit qu'aucune classe ne peut accéder directement aux données internes de notre classe, ce qui empêche donc toute modification indépendante de notre volonté. Ces modifications ne sont possibles qu'en appelant les méthodes de la même classe que les variables modifiées.

Il est préférable de supposer que les autres programmeurs utiliseront toujours vos classes de la manière qui leur convient le mieux, et non de la manière la plus sûre pour vous (pour votre classe). Ce comportement est la source des bogues ainsi que des tentatives pour les empêcher.


3. Validation des arguments de méthode

Parfois, nous devons valider les arguments passés à nos méthodes. Par exemple, disons que nous avons une classe qui représente une personne et vous permet de définir une date de naissance. Nous devons vérifier toutes les données d'entrée pour nous assurer qu'elles sont cohérentes avec la logique du programme et la logique de notre classe. Par exemple, pour interdire une date de naissance dans un 13e mois ou le 30 février, etc.

Pourquoi quelqu'un indiquerait-il le 30 février comme date de naissance ? Tout d'abord, il peut s'agir d'une erreur de l'utilisateur lors de la saisie des données. Deuxièmement, un programme peut contenir de nombreuses erreurs avant de commencer à fonctionner comme sur des roulettes. Par exemple, la situation suivante est possible.

Un programmeur écrit un programme qui identifie les personnes dont l'anniversaire est après-demain. Par exemple, disons qu'aujourd'hui est le 3 mars. Le programme ajoute le chiffre 2 au jour du mois en cours et recherche toutes les personnes nées le 5 mars. Il semble que tout soit correct.

Mais lorsque le 30 mars arrive, le programme ne trouvera personne, car le calendrier n'a pas de 32 mars. Un programme a beaucoup moins d'erreurs si nous vérifions les données transmises aux méthodes.

Vous vous souvenez quand nous avons étudié ArrayListet analysé son code ? Nous avons vu que les méthodes getet setvérifiaient si indexest supérieur ou égal à zéro et inférieur à la longueur du tableau. De plus, ces méthodes lèvent une exception si l'index tombe en dehors des limites du tableau. Il s'agit d'un exemple classique de validation d'entrée.


4. Minimiser les erreurs lors du changement de code

Supposons que nous ayons écrit une classe super utile lorsque nous étions impliqués dans un grand projet. Tout le monde l'a tellement aimé que d'autres programmeurs ont commencé à l'utiliser à des centaines d'endroits dans leur code.

La classe était si utile que vous avez décidé de lui apporter quelques améliorations. Mais si vous supprimez des méthodes de la classe, le code de dizaines de personnes cessera de se compiler. Ils devront tout réécrire. Et plus vous apportez de modifications, plus vous créerez d'erreurs. Vous briserez plein d'assemblages et vous serez détesté.

Mais lorsque nous modifions des méthodes déclarées comme privées, nous savons qu'il n'y a pas une seule autre classe qui pourrait appeler ces méthodes. Nous pouvons les réécrire, modifier le nombre de paramètres et leurs types, et tout code externe dépendant continuera à fonctionner. Eh bien, au moins, il compilera.


5. Nous décidons comment notre objet interagit avec des objets externes

Nous pouvons restreindre certaines des actions pouvant être effectuées avec notre objet. Par exemple, supposons que nous voulions qu'un objet soit instancié une seule fois. Même s'il peut être créé à plusieurs endroits du projet. Et nous pouvons le faire grâce à l'encapsulation.

Encapsulation 2

L'encapsulation nous permet d'ajouter des restrictions supplémentaires , qui peuvent se transformer en avantages supplémentaires . Par exemple, la Stringclasse est implémentée comme un objet immuable . Un objet de la Stringclasse est immuable depuis le moment de sa création jusqu'au moment de sa mort. Toutes les méthodes de la Stringclasse ( remove, substring, ...), retournent une nouvelle chaîne sans apporter de modifications à l'objet sur lequel elles sont appelées.

L'encapsulation est une chose très intéressante.