Ecco un aggiornato rapida carrellata dei numerosi sistemi a oggetti R secondo il "Advanced R, 2nd edition" (CRC Press, 2019) da Hadley Wickham (Chief Scientist presso RStudio), che ha una rappresentazione web qui , sulla base del capitolo su Object Programmazione orientata .
La prima edizione del 2015 ha una rappresentazione web qui , con il capitolo corrispondente su OO qui .
Approcci ai sistemi OO
Hadley definisce quanto segue per distinguere due approcci distinti alla programmazione OO:
OOP funzionale : i metodi (parti di codice richiamabili) appartengono a funzioni generiche (da non confondere con i metodi generici Java / C # ). Pensa ai metodi come situati in una tabella di ricerca globale. Il metodo da eseguire è trovato dal sistema di runtime in base al nome della funzione e al tipo (o classe oggetto) di uno o più argomenti passati a quella funzione (questo è chiamato "invio del metodo"). Sintassi-saggio, le chiamate di metodo può apparire come normali chiamate di funzione: myfunc(object, arg1, arg2)
. Questa chiamata indurrebbe il runtime a cercare il metodo associato alla coppia ("myfunc", typeof (oggetto)) o eventualmente ("myfunc", tipoof (oggetto), tipoof (arg1), tipoof (arg2))se la lingua lo supporta. In S3 di R, il nome completo della funzione generica fornisce la coppia (nome-funzione, classe) . Ad esempio: mean.Date
è il metodo per calcolare la media di Date. Prova methods("mean")
a elencare i metodi generici con il nome della funzione mean
. L'approccio OOP funzionale si trova ad esempio nel pioniere OO Smalltalk , Common Lisp Object System e Julia . Hadley osserva che "Rispetto a R, l'implementazione di Julia è completamente sviluppata ed estremamente performante".
OOP incapsulato : i metodi appartengono a oggetti o classi e in genere le chiamate ai metodi sembrano simili object.method(arg1, arg2)
. Questo si chiama incapsulato perché l'oggetto incapsula sia i dati (campi) sia il comportamento (metodi). Pensa al metodo come a una tabella di ricerca collegata all'oggetto o alla descrizione della classe dell'oggetto. Il runtime cerca il metodo in base al nome del metodo e possibilmente al tipo di uno o più argomenti. Questo è l'approccio trovato nei linguaggi OO "popolari" come C ++, Java, C #.
In entrambi i casi, se l'ereditarietà è supportata (probabilmente lo è), il runtime può attraversare la gerarchia di classi verso l'alto fino a quando non trova una corrispondenza per la chiave di ricerca della chiamata.
Come scoprire a quale sistema appartiene un oggetto R
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
I sistemi di oggetti R.
S3
- Approccio OOP funzionale.
- Il sistema più importante secondo Hadley.
- Più semplice, più comune. Primo sistema OO utilizzato da R.
- Viene fornito con la base R, utilizzata in tutta la base R.
- Si affida a convenzioni anziché a garanzie applicate.
- Vedi Chambers, John M e Trevor J Hastie. 1992. "Modelli statistici a S." Libri e software avanzati Wadsworth & Brooks / Cole.
- Dettagli in "Advanced R, 2nd edition" qui .
S4
- Approccio OOP funzionale.
- Terzo sistema più importante secondo Hadley.
- Riscrivi S3, quindi simile a S3, ma più formale e più rigoroso: ti costringe a pensare attentamente alla progettazione del programma. Adatto per la costruzione di grandi sistemi (ad esempio il progetto Bioconductor ).
- Implementato nel pacchetto "metodi" di base.
- Vedi: Chambers, John M. 1998. "Programmazione con dati: una guida al linguaggio S." Springer.
- Dettagli in "Advanced R, 2nd edition" qui .
RC aka "Classi di riferimento"
- Approccio OOP incapsulato.
- Viene fornito con base R.
- Basato su S4.
- Gli oggetti RC sono tipi speciali di oggetti S4 che sono anche "mutabili". cioè invece di usare la solita semantica di copia su modifica di R, possono essere modificati sul posto. Si noti che lo stato mutevole è difficile da ragionare e una fonte di brutti bug ma può portare a un codice più efficiente in alcune applicazioni.
R6
- Approccio OOP incapsulato.
- Secondo sistema più importante secondo Hadley.
- Può essere trovato nel pacchetto R6 (installa con
library(R6)
)
- Simile a RC, ma più leggero e molto più veloce: non dipende da S4 o dal pacchetto metodi . Costruito su ambienti R. Ha anche:
- metodi pubblici e privati
- associazioni attive (campi che, quando vi si accede, chiamano effettivamente un metodo)
- eredità di classe che funziona su tutti i pacchetti
- entrambi i metodi di classe (codice che appartiene alla classe e possono accedere un'istanza via
self
, private
, super
) e funzioni membro (funzioni assegnate ai campi, ma che non sono metodi, come funzioni)
- Fornisce un modo standardizzato per sfuggire alla semantica di "copia su modifica" di R
- Vedere il sito del pacchetto: "R6: programmazione incapsulata orientata agli oggetti per R" .
- Dettagli in "Advanced R, 2nd edition" qui .
Altri
Ce ne sono altri, come R.oo (simile a RC), proto (basato su prototipo, pensa JavaScript) e Mutatr . Tuttavia, "Advanced R" dice:
Oltre a R6, che è ampiamente utilizzato, questi sistemi sono principalmente di interesse teorico. Hanno i loro punti di forza, ma pochi utenti R li conoscono e li capiscono, quindi è difficile per gli altri leggere e contribuire al tuo codice.
Leggi anche il capitolo sui compromessi in "Advanced R, 2nd edition" .