Objet, classe, et encapsulation...
Les objets
Beaucoup de mystères sont faits autours de la programmation orientée objet, mais en réalité la notion d'objet est une notion naturelle que nous utilisons quotidiennement sans même le savoir. Il s'agit de modéliser en entités informatique des éléments du monde réel. Ces éléments sont appelés des objets.
Nous pouvons observer 3 caractéristiques des objets :
- L'état de l'objet : quels sont les attributs qui qualifient notre objet ?
- Le comportement de l'objet : que pouvons nous faire avec cet objet, quelles méthodes pouvons nous lui appliquer ? Les méthodes sont les actions que l'objet est capable de réaliser, et sont liées aux attributs car elles permettent par exemple d'interagir avec ces derniers. L'objet peut réagir aux stimuli extérieurs gràce aux méthodes.
- L'identité de l'objet : comment pouvons-nous le différencier des autres objets qui ont le même comportement et le même état ? Nous devrons donc utiliser un identifiant pour désigner l'objet.
Un logiciel orienté objet peut donc se comprendre comme une collection d'objets distincts, qui comportent chacun des structures de données (attributs) et une série de comportements (méthodes) dans une entité (encapsulation).
Comme dans la vie réelle, chaque objet possède sa propre identité : deux livres parfaitement identiques sont deux objets distincts. Ils possèdent la même couverture, les mêmes pages, les mêmes phrases, mais je peux exercer une action sur un des deux, par exemple en donner un des deux et garder l'autre.
Comme ils appartiennent tous deux au même groupe, nous préfèrerons en orienté objet le terme classe d'objets au terme groupe.
De même, nous parlerons d'instance pour désigner un objet en particulier.
Les classes
Considérons l'exemple des voitures...
Une voiture possède une série d'attributs (elle possède généralement 4 roues et une roue de secours, un volant, un moteur, etc.) et une série de méthodes (démarrer, rouler, freiner, etc.).
Nous pouvons créer une multitude d'instances de l'objet voiture, mais il serait peu rentable de redéfinir par exemple la méthodes démarrer, vu que la manière de démarrer est identique.
Nous pouvons donc déclarer une seule fois les attributs et les méthodes pour toutes les voitures au sein d'une classe Voiture.
Nous pouvons rapprocher la relation qui existe entre la classe et les objets avec celle qui existe entre un type de données et des variables de ce type. Nous pouvons dire que l'objet est une instance (variable) de sa classe (type).
Nous pouvons aussi considérer la classe comme un moule qui sert à fabriquer des objets (un moule à gaufres par exemple), et les instances comme étant les objets créés (chaque gaufre).
Comme notre classe sert à définir des objets, elle sera composée d'attributs et de méthodes.
L'encapsulation
Si nous décidons d'implémenter des objets "Voiture" avec certaines méthodes comme freiner ou accélérer, celui qui utilisera la voiture devra seulement savoir que freiner entraîne une diminution de sa vitesse. Peu lui importe de savoir par quels mécanismes la voiture freine, ce qui lui importe c'est le résultat : la diminution de la vitesse.
Le fait de ne pas lui montrer quels procédés la voiture utilise pour freiner nous permet de modifier en toute liberté le mécanisme de freinage, par exemple pour l'optimiser, du moment que le résultat final soit identique.
Nous allons donc rassembler les attributs et les méthodes d'une classe en une structure qui nous permet de garder un contrôle sur la visibilité des différentes parties de la classe. C'est le principe d'encapsulation.
L'encapsulation permet donc de protéger l'objet de toute malveillance externe. Nous prendrons alors la bonne habitude d'interdire l'accès direct aux attributs, pour privilégier l'accès par les méthodes qui modifient indirectement les attributs.
Par exemple : si nous souhaitons modifier l'attribut couleur d'une voiture, nous devrons passer par tout un processus (décaper, poncer, passer plusieurs couches, etc...), et dans ce cas de figure l'attribut couleur ne doit pas être accessible directement, mais bien au travers de méthodes appropriées.
A chaque fois que nous définirons un membre d'une classe (attribut ou méthode), nous devrons indiquer les droits d'accès pour l'utilisation de ce membre.
Restreindre l'accès
Java propose quatre niveaux de protection : public , private , protected et package.
Les trois premiers correspondent à des mots clés utilisés au début de la déclaration d'un attribut ou d'une méthode.
Le niveau de protection package est associé à un attribut ou une méthode quand aucun des trois mots clés (public, private ou protected) n'a été indiqué.
public
- Tous les membres (attributs ou méthodes) d'une classe définis avec le mot clé public sont utilisables par tous les objets. Ce type de protection est employé pour indiquer que nous pouvons utiliser sans contrainte les attributs et méthodes d'une classe. Il s'agit du niveau de protection le plus bas.
Nous éviterons de déclarer les donnée publiques : nous utiliserons des méthodes pour y accéder en lecture ou en modification.
package
- Les packages (ou paquets) permettent de regrouper des classes Java. Cela signifie dans ce cas que tous les membres d'une classe définis avec ce niveau de protection peuvent être utilisés par les autres classes du même package.
Lorsque nous ne spécifions pas d'accès particulier, c'est ce type de niveau d'accès qui sera utilisé par défaut. Nous retrouvons parfois la notion de "package" sous le nom friendly.
protected
- Tous les membres d'une classe définis avec le mot clé protected sont utilisables uniquement par les méthodes de la classe, par les méthodes des classes dérivées et par les méthodes des classes appartenant au même package. Cette technique de protection est fortement associée à la notion d'héritage.
On ne peut pas qualifier une classe avec le mot clé protected.
private
- Niveau de protection le plus élevé. La visibilité ne porte qu'à l'intérieur de la classe. Tous les membres d'une classe définis avec le mot clé private sont utilisables uniquement par les méthodes de la classe. C'est pour cette raison que nous utiliserons des méthodes définies dans la classe pour contrôler l'accès à ces données.
Les variables appartenant à une classe sont généralement déclarées comme privées.
English translation
You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.
Thank you in advance.
Document created the 13/04/2005, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/oriente-objet.php
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.