Voici un aperçu rapide mis à jour des nombreux systèmes d'objets R selon "Advanced R, 2nd edition" (CRC Press, 2019) par Hadley Wickham (Chief Scientist chez RStudio), qui a une représentation Web ici , basée sur le chapitre sur Object -Programmation orientée .
La première édition de 2015 a une représentation Web ici , avec le chapitre correspondant sur OO ici .
Approches des systèmes OO
Hadley définit ce qui suit pour distinguer deux approches distinctes de la programmation OO:
POO fonctionnelle : les méthodes (morceaux de code appelables) appartiennent à des fonctions génériques (à ne pas confondre avec les méthodes génériques Java / C # ). Considérez les méthodes comme étant situées dans une table de recherche globale. La méthode à exécuter est trouvée par le système d'exécution en fonction du nom de la fonction et du type (ou de la classe d'objet) d'un ou plusieurs arguments passés à cette fonction (c'est ce qu'on appelle la «méthode de répartition»). Syntaxe-sage, les appels de méthode peut ressembler à des appels de fonctions ordinaires: myfunc(object, arg1, arg2)
. Cet appel conduirait le runtime à rechercher la méthode associée à la paire ("myfunc", typeof (object)) ou éventuellement ("myfunc", typeof (object), typeof (arg1), typeof (arg2))si la langue prend en charge cela. Dans S3 de R, le nom complet de la fonction générique donne la paire (nom-fonction, classe) . Par exemple: mean.Date
est la méthode pour calculer la moyenne des dates. Essayez methods("mean")
de lister les méthodes génériques avec le nom de la fonction mean
. L'approche fonctionnelle OOP se retrouve par exemple dans le pionnier OO Smalltalk , le Common Lisp Object System et Julia . Hadley note que "Par rapport à R, l'implémentation de Julia est entièrement développée et extrêmement performante."
POO encapsulée : les méthodes appartiennent à des objets ou à des classes, et les appels de méthode ressemblent généralement à object.method(arg1, arg2)
. Cela s'appelle encapsulé car l'objet encapsule à la fois les données (champs) et le comportement (méthodes). Considérez la méthode comme étant située dans une table de consultation attachée à l'objet ou à la description de classe de l'objet. Le runtime recherche la méthode en fonction du nom de la méthode et éventuellement du type d'un ou plusieurs arguments. C'est l'approche que l'on trouve dans les langages OO "populaires" comme C ++, Java, C #.
Dans les deux cas, si l'héritage est pris en charge (c'est probablement le cas), le moteur d'exécution peut parcourir la hiérarchie de classes vers le haut jusqu'à ce qu'il ait trouvé une correspondance pour la clé de recherche d'appel.
Comment savoir à quel système appartient un objet R
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Les systèmes d'objets R
S3
- Approche fonctionnelle de la POO.
- Système le plus important selon Hadley.
- Le plus simple, le plus courant. Premier système OO utilisé par R.
- Livré avec la base R, utilisée dans toute la base R.
- S'appuie sur des conventions plutôt que sur des garanties appliquées.
- Voir Chambers, John M et Trevor J Hastie. 1992. "Statistical Models in S." Wadsworth & Brooks / Cole Advanced Books & Software.
- Détails dans "Advanced R, 2e édition" ici .
S4
- Approche fonctionnelle de la POO.
- Troisième système le plus important selon Hadley.
- Réécriture de S3, donc similaire à S3, mais plus formelle et plus stricte: cela vous oblige à réfléchir attentivement à la conception du programme. Convient pour la construction de grands systèmes (par exemple le projet Bioconductor ).
- Implémenté dans le package de base "methods".
- Voir: Chambers, John M. 1998. «Programming with Data: A Guide to the S Language». Springer.
- Détails dans "Advanced R, 2e édition" ici .
RC aka "Classes de référence"
- Approche POO encapsulée.
- Livré avec la base R.
- Basé sur S4.
- Les objets RC sont des types spéciaux d'objets S4 qui sont également "mutables". c'est-à-dire qu'au lieu d'utiliser la sémantique habituelle de copie sur modification de R, ils peuvent être modifiés sur place. Notez que l'état mutable est difficile à raisonner et est une source de bugs horribles, mais peut conduire à un code plus efficace dans certaines applications.
R6
- Approche POO encapsulée.
- Deuxième système le plus important selon Hadley.
- Peut être trouvé dans le package R6 (installer avec
library(R6)
)
- Similaire à RC, mais plus léger et beaucoup plus rapide: cela ne dépend pas de S4 ou du package de méthodes . Construit au-dessus des environnements R. A aussi:
- méthodes publiques et privées
- liaisons actives (champs, qui, lorsqu'ils sont accédés, appellent en fait une méthode)
- héritage de classe qui fonctionne sur tous les packages
- les deux méthodes de classe (code qui appartient à la classe et peut accéder à une instance via
self
, private
, super
) et les fonctions membres (fonctions assignées aux champs, mais qui ne sont pas seulement les méthodes, fonctions)
- Fournit un moyen standardisé d'échapper à la sémantique de «copie sur modification» de R
- Voir le site du package: "R6: Programmation orientée objet encapsulée pour R" .
- Détails dans "Advanced R, 2e édition" ici .
Autres
Il y en a d'autres, comme R.oo (similaire à RC), proto (basé sur un prototype, pensez JavaScript) et Mutatr . Cependant, "Advanced R" dit:
Hormis le R6, qui est largement utilisé, ces systèmes présentent avant tout un intérêt théorique. Ils ont leurs points forts, mais peu d'utilisateurs de R les connaissent et les comprennent, il est donc difficile pour les autres de lire et de contribuer à votre code.
N'oubliez pas de lire également le chapitre sur les compromis dans "Advanced R, 2nd edition" .