Encapsulation (programmation)

Un article de Wikipédia, l'encyclopédie libre.

Pour les articles homonymes, voir Encapsulation.

En programmation orientée objet, l’encapsulation est l'idée de cacher l'information contenue dans un objet et de ne proposer que des méthodes de manipulation de cet objet. Ainsi, les propriétés et axiomes associés aux informations contenues dans l'objet seront assurés/validés par les méthodes de l'objet et ne seront plus de la responsabilité de l'utilisateur extérieur. L'utilisateur extérieur ne pourra pas modifier directement l'information et risquer de mettre en péril les axiomes et les propriétés comportementales de l'objet.

L'objet est ainsi vu de l'extérieur comme une boîte noire ayant certaines propriétés et ayant un comportement spécifié. La manière dont ces propriétés ont été implémentées est alors cachée aux utilisateurs de la classe. On peut changer cette implémentation sans changer le comportement extérieur de l'objet. Cela permet donc de séparer la spécification du comportement d'un objet de l'implémentation pratique de ces spécifications.

En principe, l'encapsulation permet à l'instance d'une classe d'accéder aux attributs d'une super-classe. Par contre deux instances d'une même classe ne peuvent accéder à leurs états.

[modifier] L'encapsulation dans les langages

Les principes de l'encapsulation sont appliqués de manières très diverses suivant les langages. Mais on peut quand même trouver deux courants principaux.

Premièrement une application relativement stricte des principes dans les langages objet purs (pour autant que ce terme ait un sens) comme dans SmallTalk ou Eiffel. Dans ce cadre les attributs ne sont souvent disponibles qu'en lecture en général dans le programme et en écriture aussi depuis l'intérieur de la classe d'objet. On trouve ensuite différents moyens pour adapter ce cadre à des classes amies ou à des catégories et des hiérarchies d'objets.


Deuxièmement les langages tels que C++, Java, Ruby ou Python et plus généralement tous les langages influencés par la syntaxe du C++ qui a proposé trois niveaux de visibilité :

  • public : les attributs dits publics sont accessibles à tous,
  • protégé : les attributs dits protégés sont accessibles seulement aux classes dérivées,
  • privé : les attributs privés sont accessibles seulement par l'objet lui-même.

Ce type d'encapsulation propose en fait une autre approche de l'encapsulation qui ne fait pas la distinction entre la lecture et l'écriture d'un attribut. Dans ce cadre on utilise en plus des méthodes d'accès et de modifications définies dans une des trois catégories suivant l'effet que l'on souhaite obtenir. Souvent ces deux types de méthodes sont définies en plus de l'attribut qui contient réellement la donnée.

De plus, dans ces langages, l'instance d'une classe a un accès complet à l'état d'une autre instance de la même classe. Des contraintes peuvent limiter l'accès des instances d'une classe aux attributs d'une super-classe. Enfin, des moyens autorisent certaines instances et fonctions à avoir un accès public total à d'autres instances même si elles ne sont pas de la même classe, comme c'est le cas avec les instances friend sous C++.