Article de reference

Encapsulation (programmation informatique)

Dans les systèmes logiciels, l'encapsulation consiste à regrouper les données avec les mécanismes ou méthodes qui les manipulent. Elle peut également désigner la limitation de l...

classe . Ceci empêche les clients d'accéder directement à ces informations, évitant ainsi de révéler des détails d'implémentation cachés ou de violer l'invariance d'état garantie par les méthodes.

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

objet en dehors de sa définition. En règle générale, seules les méthodes propres à l'objet peuvent accéder directement à ses champs ou les manipuler. Masquer le fonctionnement interne de l'objet protège son intégrité en empêchant les utilisateurs de modifier ses données internes pour les rendre invalides ou incohérentes. L'encapsulation présente l'avantage supposé de réduire la complexité du système et, par conséquent, d'accroître sa robustesse , en permettant au développeur de limiter les interdépendances entre les composants logiciels.Smalltalk et Ruby, n'autorisent l'accès que via les méthodes d'objet, tandis que la plupart des autres (par exemple, C++ , C# , Delphi ou Java ) offrent au programmeur un certain contrôle sur les informations masquées, généralement via des mots-clés comme `private` 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é :

* mais elle ne peut pas manipuler la valeur de "accountBalance" */ } }

Voici un exemple en Java :

C , par exemple, une structure peut être déclarée dans l’API publique via le fichier d’en-tête d’un ensemble de fonctions qui opèrent sur un élément de données contenant des membres de données qui ne sont pas accessibles aux clients de l’API avec le externmot-clé.

type de données opaque . Le contenu de ce type est connu et accessible uniquement à l'implémentation des fonctions de l'API ; les clients ne peuvent pas y accéder directement. Le code source de ces fonctions définit le contenu effectif de la structure.

typedef struct Entity { int ent_id ; // Numéro d'identification char ent_name [ 20 ]; // Nom ... et autres membres ... } Entity ;// Implémentations de fonctions API Entité * openEntity ( int id ) { // ... }int processEntity ( Entity * e ) { // ... }void closeEntity ( Entity * e ) { // ... }

Déformation de noms

Python , qui ne prend pas en charge les restrictions d'accès aux variables. Cependant, par convention, une variable dont le nom est préfixé par un trait de soulignement doit être considérée comme privée.

None: self._maxspeed = 200 def drive(self) -> None: print(f\"Maximum speed is {self._maxspeed}.\") redcar: Car = Car() redcar.drive() # This will print 'Maximum speed is 200.' redcar._maxspeed = 10 redcar.drive() # This will print 'Maximum speed is 10.' "
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. '