3.2 : Objets simples et objets complexes
Les objets simples sont les objets des types que nous connaissons : vecteurs, fonctions, listes, etc. Ils sont dit simples car ils ont un type et une classe (quasiment) identiques. Pour comprendre ce qu'est un objet simple, le plus facile est de comprendre ce qu'est un objet complexe !
Créeons une classe date
Supposons que l'on veuille créer une nouvelle classe d'objet qui nous permettrait de manipuler des dates en R. quelles sont les attributs et méthodes dont nous aurions besoin ? En informatique il est courant de stocker les dates comme un nombre de jours depuis une année de référence. En général, cette année de référence est le 01 janvier 1970. On stockerai alors la date du 16 janvier 1970 sous la forme du nombre entier 16
. Les dates antérieures seraient stockées avec un nombre négatif : -2
désignerai le 30 décembre 1969. Nous donc au moins besoin d'un entier de type integer
.
Si un ordinateur peut facilement manipuler des dates sous forme de nombres de jours depuis un point de départ, ce n'est pas du tout intuitif pour nous humains. Nous voudrions plutôt écrire "16-01-1970"
ou "30-12-1969"
plutôt que les nombres 16
et -2
. Il nous faut alors écrire des fonctions de conversions : une fonction chaineToDate()
qui convertir une chaine de caractère du format "jj-mm-aaaa"
en integer
; et une fonction DatetoChaine()
qui ferait l'opération inverse. Ainsi nous pourrions manipuler des dates dans un format pratique, et les fonctions les transformeraient en nombres manipulables pour l'ordinateur.
Nous pourrions alors rassembler tous ceci dans un objet de classe date, qui aurait la structure suivante :
On retrouve principalement un attribut interne qui stock le nombre de jours sous forme d'un integer, et nos deux méthodes de conversions.
Type et classe d'un objet
Cette exemple de création d'un objet complexe de classe date
va nous permettre de bien comprendre la différence entre le type et la classe.
Le type fait référence à ce qu'est réellement l'attribut interne principal de notre objet. Ici, notre attribut interne est en réalité un entier, qui indique le nombre de jours entre le 01 janvier 1970 et la date représentée par notre objet. Le type de l'objet est bien integer
.
La classe indique elle le concept que représente l'objet. Notre nombre entier ne représente ainsi pas un nombre, mais une date. La classe est donc date
. Elle nous permet de comprendre que le type de l'attribut fondemental à été utilisé pour représenter un nouveau concept.
Objets simples et objets complexes
Les objets que nous connaissons de la partie II sont des objets dits simples car leurs classe est "identique" (ou presque) à leur type. Ces objets représente le même concept que le type de données stockées dans leur attributs internes.
Voyons dans un tableau les différentes classes et types des vecteurs en R :
Type de l'objet | Classe de l'objet |
---|---|
Integer | Integer |
Double | numeric |
complex | complex |
logicial | logical |
character | character |
On remarque que tous les types de vecteurs de base ont une classe identique à leur type... sauf pour les vecteurs réels qui ont la classe numeric
.
Le mode, ou pourquoi certains objets simples ont une classe différente de leur type
Il s'agit là d'un héritage du langage R. Avant la notion de type et la fonction typeof()
, R utilisait une autre façon de nommer les types de données, appellée le mode
. On ne parlait alors pas du type d'un objet, mais de son mode. Mode signifie "mode de stockage de la donnée". Il s'agit juste d'une typologie différente des types que nous connaissons. Par exemple, les doubles
sont considérés de mode numeric
:
mode(2) #affiche "numeric"
Dans les années 2000, la notion de mode à été remplacée et abandonnée, pour la notion de type. Mais beaucoup de vieux cours de R continuent à parler de mode au lieu de type et à utiliser cette ancienne typologie. Dans ce cours nous avons choisit de suivre l'approche moderne et donc de présenter uniquement la nouvelle typologie basée sur la fonction typeof()
.
Nous vous présentons ici la notion de mode simplement car vous pourrez la rencontrer dans des vieux cours et par ce qu'elle aide à comprendre pourquoi parfois dans les objets simple la classe est différente du type, alors que cela ne devrait pas être le cas ! c'est simplement que le nom de la classe à été donnée à l'époque où la notion de mode était utilisée. Le mode de l'objet était alors identique à sa classe, et tout allait bien.
Quand le mode à été abandonné pour le type et que certains objets ont eu un type différent de leur mode , leur classe n'a pas été modifiée pour des raisons de compatibilité. La classe est restée indentique au mode, alors que ce dernier est déprécié et ne devrait plus être utilisé. Ceci explique pourquoi certains objets simples n'ont pas une classe identique à leur type alors que cela devrait être le cas en théorie.
Remarque : La notion de mode existe toujours en R, et on peut afficher le mode d'un objeet via la fonction mode()
. Vous pouvez ainsi explorer vous mêmes les différences. Si R devrait être inventé depuis 0 aujourd'hui, on suprimerai cette notion de mode pour ne garder que le type, et on renommerait certaines classes ou types pour qu'ils soient tous identiques pour les objets simples. Malheureusement comme un langage qui évolue doit rester compatible avec ces anciennes versions pour ne pas faire buger les anciens codes, le mode continue d'exister et certains objets simples ont un type différent de leurs classe. Et oui, R est un vieux langage, et nous devons faire avec certaines bizarreries vennue du passé qui rendent les choses parfois un peu confuse pour les débutants.
Les fonctions
Les fonctions sont un autre exemple d'objet dont la classe est différente du type. Nous avons vu deux types de fonctions : le type closure
pour les fonctions "normales", et le type builtin
qui indique les fonctions créent par les concepteurs du langage. Et bien leur classe n'est ni closure ni builtin, mais... function
!
Type | Classe |
---|---|
closure | function |
builtin | function |
Comme vous vous en doutez, le mode associé à ces objets est function
dans les deux cas, ce qui explique les noms de classe en question !
Pour les listes, pas de problème leur classe est bien identique à leur type :
Type | Classe |
---|---|
list | list |
De façon générale, nous allons faire comme si le type des objets simples étaient indentiques à leur classe. Par exemple nous parlons d'objets de type fonction par abus de langage, alors qu'en réalité les objets de classe fonction ont des noms de type un peu différents.
Ce qui est important de retenir, c'est que la classe d'un objet simple exprime le même concept que sa classe. Un vecteur de character
stock des données qui représentent bien l'idée d'une chaine de caractère. Une fonction stock les données d'une fonction, son type correspond à sa classe.
Les types complexes
Les objets complexes, comme nous l'avons vu dans notre exemple de création d'une classe date
, ont un type qui est différent de la classe. Leur type est utilisé pour représenter un concept différent que le type en question. Notre objet date aurait un type integer
, mais représenterait un date. Son type correspondant est donc date
.
Les objets complexes sont très utiles, car ils nous permettent d'ettendre en quelque sorte les types simples pour créer de nouvelles structures de données. Ainsi il existe en R une classe date
qui fonctionne exactement sur le principe que celle que nous avons décrit plus haut ! Bien entendu, cette classe permet de faire bien plus de chose que notre exemple simplisime.
Il existe de nombreuses classes complexes de bases, qui servent à représenter des structures de données complexes. C'est l'objectif de cette partie que d'en étudier les principales. On peut citer entre autre :
- La classe
date
, qui représente des dates sous forme d'entier. - La classe
matrix
qui représente des matrices. - La classe
facteur
, qui représente des vecteurs de données catégorielles (comme la couleur des yeux). - etc.
Et les chats ?
Souvenez vous de notre exemple de présentation du concept d'objet du chapitre précédent. Nous avions décrit une classe "chat" imaginaire, composée de différents attributs et méthodes décrivant un chat. Quel serait l'attribut fondemental d'un tel objet chat, et quel serait alors son type ? Si on voit bien que représenter une date par un nombre fait du sens, quel type de donnée simple attribué à notre classe chat ?
Et bien... aucun ! Il existe en fait un type de données qui permet justement de dire que l'objet en question n'a pas de type particulier. On parle alors d'objet de type S4
(car ce type à été introduit dans la version 4 du langage S, qui est l'ancêtre de R.). Un objet de type S4 indique que l'objet est juste un objet complexe, composé d'attributs et de méthodes, sans qu'aucun attribut de type basique ne décrive à lui seul l'objet.
Les objets de type S4 ayant été introduit relativement récément dans R, nous n'en rencontrerons pas dans ce cours. Aussi si vous oubliez leur existance, ce n'est pas bien grave. Nous vous signalons leur existance uniquement pour les curieux qui se demandaient quel type serait associé à notre objet chat décrit précédement.
Conclusion :
Nous avons grace à ces deux chapitres introductifs bien compris ce qu'étaient les objets en R.
- Un objet est ensemble d'attributs et de méthodes, qui décrivent un certain concept.
- Le type d'un objet fait référence au type de l'attribut interne d'un objet, qui représente la vraie nature des données stockées dans cet objet. Sa classe fait référence lui au concept que cet objet représente. Ainsi un objet date peut être de type integer mais de classe date.
- Les objets dits simples (comme les fonctions, vecteurs ou listes) ont un type identique à leur classe, du moins en théorie. Certains de ces objets simples ont en pratique une classe différent de leur type, à cause de l'évolution du langage R.
- Les objets complexes ont eu une classe différente de leur type, car ils utilisent les types de base pour représenter de nouvelles structures de données.
- Il existe des objets de type
s4
pour les objets qui n'ont pas un attribut interne unique qui décrit l'objet, comme la classe chat que nous avons imaginé précédement. Nous ne rencontrerons néanmoins pas de tels objets dans ce cours.