Tutaj jest zaktualizowana szybko zniszczony z licznych systemów R obiektów według „Zaawansowane badania, wydanie 2” (CRC Press, 2019) przez Hadley Wickham (Chief Scientist w RStudio), który ma reprezentację internetowej tutaj , na podstawie rozdziału na temat obiektu -Zorientowane programowanie .
Pierwsza edycja z 2015 r. Ma tutaj reprezentację internetową , a odpowiedni rozdział o OO tutaj .
Podejścia do systemów OO
Hadley definiuje następujące elementy, aby rozróżnić dwa różne podejścia do programowania obiektowego:
Funkcjonalne OOP : metody (wywoływalne fragmenty kodu) należą do funkcji ogólnych (nie należy ich mylić z metodami ogólnymi Java / C # ). Pomyśl o metodach jako znajdujących się w globalnej tabeli odnośników. Metoda do wykonania jest znajdowana przez system wykonawczy na podstawie nazwy funkcji i typu (lub klasy obiektu) co najmniej jednego argumentu przekazanego do tej funkcji (jest to nazywane „wysyłką metody”). Składnia mądry, wywołania metod może wyglądać zwykłych wywołań funkcji: myfunc(object, arg1, arg2)
. To wywołanie spowodowałoby, że środowisko wykonawcze szukało metody skojarzonej z parą („myfunc”, typeof (object)) lub prawdopodobnie („myfunc”, typeof (object), typeof (arg1), typeof (arg2))jeśli język to obsługuje. W S3 języka R pełna nazwa funkcji ogólnej daje parę (nazwa funkcji, klasa) . Na przykład: mean.Date
to metoda obliczania średniej z dat. Spróbuj methods("mean")
wymienić ogólne metody z nazwą funkcji mean
. Podejście funkcjonalne OOP można znaleźć na przykład w pionierze OO Smalltalk , Common Lisp Object System i Julii . Hadley zauważa, że „W porównaniu z R, implementacja Julii jest w pełni rozwinięta i niezwykle wydajna”.
Hermetyzowane OOP : metody należą do obiektów lub klas, a wywołania metod zwykle wyglądają jak object.method(arg1, arg2)
. Nazywa się to hermetyzacją, ponieważ obiekt hermetyzuje zarówno dane (pola), jak i zachowanie (metody). Wyobraź sobie, że metoda znajduje się w tabeli przeglądowej dołączonej do obiektu lub opisu klasy obiektu. Środowisko wykonawcze wyszukuje metodę na podstawie nazwy metody i prawdopodobnie typu co najmniej jednego argumentu. Jest to podejście stosowane w „popularnych” językach obiektowych, takich jak C ++, Java, C #.
W obu przypadkach, jeśli dziedziczenie jest obsługiwane (prawdopodobnie jest), środowisko wykonawcze może przechodzić przez hierarchię klas w górę, dopóki nie znajdzie dopasowania dla klucza wyszukiwania wywołania.
Jak dowiedzieć się, do jakiego systemu należy obiekt R.
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Systemy obiektowe R.
S3
- Funkcjonalne podejście OOP.
- Najważniejszy system według Hadleya.
- Najprostszy, najczęściej. Pierwszy system OO używany przez R.
- W zestawie z podstawą R, używaną w całej bazie R.
- Opiera się raczej na konwencjach niż na wymuszonych gwarancjach.
- Zobacz Chambers, John M i Trevor J Hastie. 1992. „Modele statystyczne w S.” Wadsworth & Brooks / Cole Advanced Books & Software.
- Szczegóły w „Advanced R, 2nd edition” tutaj .
S4
- Funkcjonalne podejście OOP.
- Trzeci najważniejszy system według Hadleya.
- Przepisz S3, a zatem podobny do S3, ale bardziej formalny i bardziej rygorystyczny: zmusza cię to do dokładnego przemyślenia projektu programu. Nadaje się do budowy dużych systemów (np. Projekt Bioconductor ).
- Zaimplementowany w podstawowym pakiecie "Methods".
- Patrz: Chambers, John M. 1998. „Programming with Data: A Guide to the S Language”. Skoczek.
- Szczegóły w „Advanced R, 2nd edition” tutaj .
RC, czyli „Klasy referencyjne”
- Zamknięte podejście OOP.
- Pochodzi z podstawą R.
- Na podstawie S4.
- Obiekty RC są specjalnym typem obiektów S4, które również są „modyfikowalne”. tj. zamiast używać zwykłej semantyki języka R typu „kopiuj przy modyfikacji”, można je modyfikować w miejscu. Zauważ, że stan zmienny jest trudny do rozważenia i jest źródłem brzydkich błędów, ale może prowadzić do bardziej wydajnego kodu w niektórych aplikacjach.
R6
- Zamknięte podejście OOP.
- Drugi najważniejszy system według Hadleya.
- Można go znaleźć w pakiecie R6 (zainstaluj za pomocą
library(R6)
)
- Podobna do RC, ale lżejszy i znacznie szybciej: to nie zależy od S4 lub metod opakowaniu. Zbudowany w oparciu o środowiska R. Też ma:
- metody publiczne i prywatne
- aktywne powiązania (pola, które po uzyskaniu dostępu faktycznie wywołują metodę)
- dziedziczenie klas, które działa między pakietami
- obie metody klasy (kod, który należy do klasy i ma dostęp poprzez instancję
self
, private
, super
) oraz funkcje składowe (funkcje przypisane do pól, które nie są jednak metody, funkcje Just)
- Zapewnia ustandaryzowany sposób ucieczki przed semantyką „kopiuj przy modyfikacji” języka R
- Zobacz witrynę z pakietami: „R6: Hermetyzowane programowanie obiektowe dla języka R” .
- Szczegóły w „Advanced R, 2nd edition” tutaj .
Inni
Istnieją inne, takie jak R.oo (podobne do RC), proto (oparte na prototypach, myślę, że JavaScript) i Mutatr . Jednak „Advanced R” mówi:
Oprócz R6, który jest szeroko stosowany, systemy te są przedmiotem zainteresowania przede wszystkim teoretycznego. Mają swoje mocne strony, ale niewielu użytkowników języka R zna je i rozumie, więc innym osobom trudno jest czytać i współtworzyć Twój kod.
Koniecznie przeczytaj także rozdział poświęcony kompromisom w „Advanced R, wydanie 2” .