À présent, nous sommes capables de concevoir des programmes très complexes pouvant effectuer plusieurs opérations différentes. Nos programmes comportent un très grand nombre d'instructions. Il est temps à présent d'introduire un nouveau paradigme de programmation permettant de structurer nos programmes : la programmation orientée objet. Un objet est une structure de données comportant ses propres variables et ses propres fonctions.

Tout au long de ce cours, nous avons utilisé différents objets Python. On peut citer par exemple les listes, contenant elles-mêmes différentes variables (les éléments qu'elles contiennent) et différentes fonctions propres (len, sort, …) qui agissent sur les listes en question.

Dans ce chapitre et le suivant, nous allons modéliser nos propres objets et les mettre en œuvre en Python. Pour la modélisation, nous allons utiliser la représentation UML, largement utilisée en génie logiciel.

Présentation d'un objet

Une classe est une description des caractéristiques d'un objet. Elle décrit les variables que comportent tous les objets de la même classe. On parle d'une instance de la classe en question pour tout objet créé à partir de cette classe. La classe est donc une sorte de "moule" pour les instances d'objets. Une classe peut également comporter des fonctions agissant sur les instances de celles-ci appelées méthodes. On représente le type de données retournées par une méthode en terminant le nom de la méthode avec deux points suivis du type de données. Si la méthode ne retourne rien, on inscrit void.

La représentation UML représente une classe par un rectangle divisé horizontalement en trois parties dont le premier tiers renseigne le nom de la classe, le second décrit les variables de celle-ci et le troisième tiers liste les méthodes de la classe.

Pour illustrer le concept d'objet, nous allons prendre pour exemple la modélisation d'une personne. Cette personne a un nom, un prénom, une date de naissance et un lieu de résidence. La classe comporte également la méthode demenager qui permet de changer de lieu de résidence, ainsi que la méthode {calculerAge} retournant l'âge sous forme d'un entier. Nous allons modéliser cela sous la forme d'une classe :

uml-personne

Il existe en programmation orientée objet une méthode que l'on retrouve dans tous les objets, à savoir le constructeur. Cette méthode spéciale exécutée lors de l'instanciation de la classe permet de créer l'objet en créant les variables que contient l'objet, en définissant leur valeur initiale ou en effectuant certaines opérations. De manière analogue, il existe le destructeur appelé lors de la destruction de l'objet.

L'héritage

Une classe, que nous nommerons ici classe fille peut récupérer les variables et les méthodes d'une classe mère. On parle ici d'héritage. L'intérêt de cette opération est de partager des variables et des méthodes communes à différentes classes. Une classe fille peut alors ajouter des éléments pour compléter l'héritage de la classe mère ou peut écraser certaines méthodes ou variables avec son contenu propre.

On parle d'héritage simple dans le cas où une classe fille a recours à une seule classe mère. Par extension, on parle d'héritage multiple si une classe fille hérite des attributs de plusieurs classes mères.

L'héritage a plusieurs propriétés :

Transitivité
Si une classe B hérite de la classe A, et que C hérite de B, alors C hérite de A.
Non réflexif
Une classe ne peut hériter d'elle-même.
Non symétrique
La classe fille hérite de la classe mère mais la classe mère n'hérite pas de la classe fille.
Sans cycle
Il n'est pas possible que la classe B hérite de la classe A, que la classe C hérite de la classe B et que la classe A hérite de la classe C.

Nous allons illustrer ce mécanisme avec l'exemple de la classe Chien et la classe Poule qui héritent tous deux de la classe Animaux. La flèche terminée par un triangle indique l'héritage.

uml-animaux

Pour illustrer l'héritage multiple, nous allons prendre l'exemple d'une imprimante multifonction permettant à la fois de scanner et d'imprimer (nous considérons que la photocopie est une combinaison des deux opérations précédentes) .

uml-printer

L'encapsulation

Le principe d'encapsulation est un des concepts clés de la programmation objet. Cette technique permet de regrouper des données au sein d'une classe et de pouvoir les lire et les manipuler par le biais de méthodes qui forment une interface pour les éléments environnant l'objet. De ce fait, les variables et les méthodes contenues au sein d'une classe peuvent être placées dans trois niveaux de visibilité en fonction de la portée que vous souhaitez :

Public
La variable ou fonction est accessible à tous.
Protégé
Les attributs sont accessibles uniquement à la classe et les classes filles.
Privé
Les attributs ne sont visibles que par la classe elle-même.

Pour respecter le principe fondamental de l'encapsulation, toutes les variables doivent être privées et ne sont accessibles qu'à travers des méthodes conçues pour les modifier qu'après les avoir vérifiées ou les retourner formatées. Cela se représente dans un diagramme UML par un caractère précédant le nom de l'attribut ou de la méthode tel que décrit dans le tableau suivant.

CaractèreRôle
+Accès public
#Accès protégé
-Accès privé

Nous allons illustrer cela avec notre exemple précédent de classe Personnes.

uml-personne-visibilite

L'association

Enfin, il est naturellement possible d'utiliser certains objets dans les variables d'autres objets. On modélise l'association entre les classes par un trait et on fait figurer le type de l'objet en vis-à-vis du nom de la variable, séparés par deux points. On peut faire figurer une association monodirectionnelle avec une flèche.

uml-assoc

L'agrégation et la composition

L'agrégation et la composition désignent le fait qu'un objet soit composé d'autres objets. La composition entraîne l'appartenance du sous-objet à l'objet alors que l'agrégation non. Nous allons illustrer par exemple le cas d'une université composée de départements qui agrègent des professeurs. Lors de la destruction de l'université, les départements sont détruits, mais pas les professeurs. L'agrégation est représentée par un lien terminé par un losange vide (♢) et la composition est un lien terminé par un losange plein (♦). Nous allons représenter notre université par un diagramme UML.

uml-universite

Exercices

  1. Modélisez en UML, un programme permettant de représenter les atomes de la table périodique des éléments. On y stockera son symbole, son nom complet et son numéro atomique.

  2. corrige-0801
  3. Modélisez en UML, un programme permettant de représenter un cercle, un cylindre et une sphère. Le cercle aura une méthode retournant son périmètre et son aire. Le cylindre et la sphère hériteront du cercle et ajouteront la méthode volume.

  4. corrige-0802
  5. Modélisez en UML, un programme permettant de représenter des banques contenant plusieurs comptes bancaires. Chaque compte permet le dépôt, le retrait, le transfert vers un autre compte et peut retourner l'historique des opérations et le solde.

  6. corrige-0803