L'encapsulation encourage également les programmeurs à regrouper tout le code relatif à un ensemble de données donné dans une même classe, ce qui facilite sa compréhension par d'autres programmeurs. L'encapsulation est une technique qui favorise le découplage .
Tous les systèmes de programmation orientée objet (POO) prennent en charge l'encapsulation , mais l'encapsulation n'est pas propre à la POO. Les implémentations de types de données abstraits , de modules et de bibliothèques offrent également l'encapsulation. Cette similarité a été expliquée par les théoriciens des langages de programmation en termes de types existentiels .
les langages de programmation orientés objet et dans d'autres domaines connexes, l'encapsulation fait référence à l'une des deux notions liées mais distinctes, et parfois à leur combinaison :- Un mécanisme de langage permettant de restreindre l'accès direct à certains composants de l' objet .
- Une construction du langage qui facilite le regroupement des données avec les méthodes (ou autres fonctions) qui opèrent sur ces données.
Certains chercheurs et universitaires en langages de programmation utilisent la première signification seule ou en combinaison avec la seconde comme une caractéristique distinctive de la programmation orientée objet , tandis que certains langages de programmation qui fournissent des fermetures lexicales considèrent l'encapsulation comme une caractéristique du langage orthogonale à l'orientation objet.
La seconde définition tient compte du fait que, dans de nombreux langages orientés objet et autres domaines connexes, les composants ne sont pas masqués automatiquement et que ce comportement peut être modifié. Par conséquent, le masquage d'informations est défini comme une notion distincte par ceux qui privilégient la seconde définition.
La plupart des langages orientés objet prennent en charge les fonctionnalités d'encapsulation grâce aux classes , bien que d'autres alternatives existent également.
L’encapsulation peut également désigner le fait de contenir un processus répétitif ou complexe dans une seule unité à invoquer. La programmation orientée objet facilite cela tant au niveau des méthodes qu’à celui des classes. Cette définition est également applicable à la programmation procédurale .
Encapsulation et héritage
Les auteurs de Design Patterns abordent en détail la tension entre héritage et encapsulation et constatent que, d'après leur expérience, les concepteurs abusent de l'héritage. Ils affirment que l'héritage compromet souvent l'encapsulation, car il expose une sous-classe aux détails d'implémentation de sa classe parente. Comme l'illustre le problème du yo-yo , le recours excessif à l'héritage, et par conséquent à l'encapsulation, peut engendrer une complexité excessive et rendre le débogage difficile.
Cacher l'information
publicet `private` private. La norme ISO C++ qualifie `private` protected, `private` privateet public`private` de « spécificateurs d'accès » et précise qu'ils ne « masquent aucune information ». Le masquage d'informations est réalisé en fournissant une version compilée du code source, interfacée via un fichier d'en-tête.Il existe presque toujours un moyen de contourner cette protection , généralement via l'API de réflexion (Ruby, Java, C#, etc.), parfois par des mécanismes comme la modification de noms ( Python ) ou l'utilisation de mots-clés spéciaux comme frienden C++. Les systèmes qui offrent une sécurité basée sur les capacités au niveau de l'objet (conformément au modèle objet-capacité ) constituent une exception et garantissent une encapsulation forte.
Exemples
Restriction des champs de données
Des langages comme C++ , C# , Java , PHP , Swift et Delphi offrent des moyens de restreindre l'accès aux champs de données.
![]()
Voici un exemple en C# qui montre comment l'accès à un champ de données peut être restreint grâce à l'utilisation d'un privatemot-clé :
Voici un exemple en Java :
externmot-clé. Déformation de noms
classe Voiture : def __init__ ( self ) -> None : self . _maxspeed = 200def drive ( self ) -> None : print ( f " La vitesse maximale est { self._maxspeed } . " )redcar : Car = Car () redcar . drive () # Ceci affichera 'La vitesse maximale est de 200.'redcar._maxspeed = 10 redcar.drive () # Ceci affichera 'La vitesse maximale est de 10. '