Introduction à la programmation orientée objet

Que vous utilisiez R depuis quelques jours ou depuis des années, aucun doute : vous avez fait de la programmation orientée objet (ou POO, pour les intimes). Ce concept, membre de la grande famille des paradigmes de programmation, est central à votre utilisation du logiciel. Mais en clair, de quoi s’agit-il ?

La POO : qu’est-ce que c’est ?

« Un paradigme de programmation, encore une nouvelle notion complexe ! » vous dites-vous ? Eh non : un paradigme de programmation, c’est tout simplement une « famille » dans laquelle vous pouvez classer un ou plusieurs langage(s), en fonction de leurs caractéristiques. Aujourd’hui, ces étiquetages sont nombreux, et la famille des paradigmes est amenée à s’agrandir, rendant difficile l’arrêt à une liste fixe… d’autant plus que certains langages peuvent être multiparadigmes (c’est le cas de R).

Bref, nous ne sommes pas là pour discuter philosophie, mais pour vous présenter ce qu’est la programmation orientée objet. Pour vous faire comprendre en quoi consiste la POO, mettons-la en perspective avec les autres grandes familles « historiques » de langages, qui sont au nombre de trois :

  • La programmation déclarative : on décrit l’application avec des composants indépendants, qui ne sont pas liés système d’exécution. Le HTML appartient à ce paradigme : quels que soient le moment et le contexte d’exécution du code, le résultat restera le même.
  • La programmation impérative : des séquences d’instructions sont rédigées, puis exécutées à la suite pour changer l’état du programme ou de la machine. On retrouve dans ce groupe C, C++, ou encore Java.
  • La programmation orientée objet, qui consiste en la création de briques logiciels appelées… « objets », qui contiennent des attributs et des méthodes, et appartiennent à une ou plusieurs classe(s).

La POO : les concepts clés

Si vous codez en R depuis un certain temps, vous avez déjà mis en pratique la programmation orientée objet, sans même le savoir.

Et donc, comment ça marche ? La POO consiste en la création et l’utilisation d’objets, qui se composent d’attributs et de méthodes liés à des classes. Les premiers renvoient aux variables contenues dans l’objet — ce sont les données. Les secondes (les méthodes) sont les éléments qui permettent d’interagir avec les attributs. La notion de classe fait quant à elle référence aux « familles » qui définissent les objets. En clair, chaque objet est une instance d’une classe, c’est-à-dire qu’il hérite des attributs et des méthodes génériques de sa classe.

Ce qui nous amène au concept suivant, fondamental en POO : l’héritage. Lorsque vous créez un objet, vous lui assignez un classe (explicitement sur certains langages, ou implicitement, le comportement de R par défaut), celui-ci « hérite » des caractéristiques de sa classe. En R, un objet peut être de classe « data.frame »,  « character », « list », « matrix » et bien d’autres…

C’est cette appartenance qui permet de définir le comportement d’une fonction face à un objet — par exemple, vous pouvez sélectionner avec $ sur un objet de classe « data.frame », mais vous obtiendrez « $ operator is invalid for atomic vectors » si vous tentez de faire la même chose sur une chaine de caractères. Autrement dit, la fonction $ est accessible aux objets de la classe data.frame ou list, pas aux objets de la classe characters.

Une illustration avec R ?

b <- c(plop = "plop", poum = "poum")
print(b)
>  plop   poum 
"plop" "poum" 

class(b)
> [1] "character"

b$plop
> Error in b$plop : $ operator is invalid for atomic vectors

class(b) <- "list" 

print(b)
> $plop
[1] "plop"

$poum
[1] "poum"

class(b)
> [1] "list"

b$poum
> [1] "poum"

b$plop
> [1] "plop"

Comme on peut le voir ici, en transformant la classe de b de character vers list, b hérite de la méthode $, et vous pouvez maintenant l’utiliser sur l’objet ! À noter ici également, le comportement spécifique de print pour chaque classe. À noter qu’un objet n’est pas « fermé » : il est toujours possible de changer sa classe, ou encore de redéfinir une ou plusieurs de ses méthodes — une spécificité que l’on appelle polymorphisme.

Enfin, dernier concept clé de la POO : l’encapsulation, qui désigne le principe de créer un objet comme une « boite noire », c’est-à-dire que les utilisateurs peuvent voir et interagir avec un objet sans avoir un accès direct à ses rouages.

R et la POO

« Mais franchement, ça va me servir à quelque chose de savoir ça ? » Rassurez-vous, lecteurs, si nous vous en parlons aujourd’hui, c’est que ce concept est central à la programmation en R, et vous l’utilisez au quotidien. Car, n’oubliez pas que l’opérateur <-  est un opérateur orientée objet ! Et au final, le point fort de R étant que vous pouvez définir vos propres classes, qui auront leurs propres attributs, et leurs propres méthodes. Comment faire ? Ça, c’est une autre histoire… mais nous sommes là pour vous en dire plus 😉


À propos de l'auteur

Colin Fay

Colin Fay

Data scientist & R Hacker


Commentaires


À lire également