Ось оновлений швидко зношеному з численних систем R об'єкта в відповідно до «Advanced R, 2 - е видання» (CRC Press, 2019) по Hadley Уікхемом (головний науковий співробітник RStudio), який має веб - представництво тут , на основі глави про об'єкті -Орієнтоване програмування .
Перше видання з 2015 року , має веб - представництво тут , з відповідною главою про OO тут .
Підходи до систем ОО
Хедлі визначає наступне, щоб виділити два різних підходи до програмування ОО:
Функціональний OOP : методи (фрагменти коду, що дзвоняться) належать до загальних функцій (не плутати з загальними методами Java / C # ). Подумайте, як методи розташовані у глобальній таблиці пошуку. Метод виконання виконується системою виконання на основі назви функції та типу (або класу об'єктів) одного або декількох аргументів, переданих цій функції (це називається "метод відправки"). Синтаксис-навхрест, виклики методів можуть виглядати як звичайні виклики функцій: myfunc(object, arg1, arg2)
. Цей виклик призведе до того, що час виконання буде шукати метод, пов’язаний з парою ("myfunc", typeof (об'єкт)) або можливо ("myfunc", typeof (об'єкт), typeof (arg1), typeof (arg2))якщо мова це підтримує. У R3 S3 повне ім’я родової функції дає пару (функція-ім’я, клас) . Наприклад: mean.Date
це метод обчислення середнього значення Дат. Спробуйте methods("mean")
перелічити загальні методи з назвою функції mean
. Функціональний підхід OOP знайдений, наприклад, у піонері OO Smalltalk , загальній системі об'єктів Lisp та Julia . Хедлі зазначає, що "У порівнянні з R, реалізація Джулії є повністю розвиненою та надзвичайно ефективною".
Інкапсульований OOP : методи належать до об'єктів або класів, а виклики методів зазвичай виглядають так object.method(arg1, arg2)
. Це називається капсульованим, оскільки об’єкт інкапсулює як дані (поля), так і поведінку (методи). Подумайте про метод, який знаходиться в таблиці пошуку, доданій до об'єкта або в описі класу об'єкта. Час виконання виглядає методом на основі назви методу та, можливо, типу одного або декількох аргументів. Такий підхід знайдений у «популярних» мовах OO, таких як C ++, Java, C #.
В обох випадках, якщо підтримання успадкування (це, мабуть, є), час виконання може пройти ієрархію класів вгору, поки не знайде збіг для ключа пошуку викликів.
Як дізнатися, до якої системи належить R-об’єкт
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Об'єктні системи R
S3
- Функціональний підхід OOP.
- Найважливіша система за Едлі.
- Найпростіший, найпоширеніший. Перша система ОО використовувала Р.
- Поставляється з основою R, використовується на всій основі R.
- Покладається на конвенції, а не на примусові гарантії.
- Дивіться Чемберс, Джон М і Тревор Дж. Хасті. 1992. "Статистичні моделі в С." Wadsworth & Brooks / Cole Advanced Books & Software.
- Деталі у "Advanced R, 2-е видання" тут .
S4
- Функціональний підхід OOP.
- Третя найважливіша система за Едлі.
- Перепишіть S3, тому схожий на S3, але більш формальний і суворіший: він змушує вас ретельно продумати дизайн програми. Підходить для побудови великих систем (наприклад, проект Біокондуктор ).
- Реалізовано в базовому пакеті «методи».
- Див .: Chambers, John M. 1998. "Програмування з даними: Посібник з мови S". Спрингер.
- Деталі у "Advanced R, 2-е видання" тут .
RC aka "Довідкові класи"
- Інкапсульований підхід ООП.
- Поставляється з базовою Р.
- На основі S4.
- RC-об'єкти - це особливий тип об'єктів S4, які також є "мутаційними". тобто замість використання звичайної семантики копіювання-модифікації R вони можуть бути змінені на місці. Зауважте, що стан, що змінюється, важко пояснити та стати джерелом некрасивих помилок, але може призвести до більш ефективного коду в певних програмах.
R6
- Інкапсульований підхід ООП.
- Друга найважливіша система за Едлі.
- Можна знайти в пакеті R6 (встановити за допомогою
library(R6)
)
- Схожий на RC, але легший і набагато швидший: він не залежить від S4 або пакету методів . Побудований на вершині R середовища. Також має:
- публічні та приватні методи
- активні прив'язки (поля, які при зверненні насправді викликають метод)
- успадкування класу, який працює в пакетах
- обидва метод класу (код , який належить до класу і може отримати доступ до примірника з допомогою
self
, private
, super
) і функціями членів (функції , призначені на поля, але які не є методами, тільки функція)
- Забезпечує стандартизований спосіб уникнути семантики "копіювання на зміну" R
- Дивіться на сайті пакета: "R6: Інкапсульоване об'єктно-орієнтоване програмування для R" .
- Деталі у "Advanced R, 2-е видання" тут .
Інші
Є й інші, наприклад R.oo (схожий на RC), proto (на основі прототипу, думаю, JavaScript) та Mutatr . Однак "Advanced R" говорить:
Крім R6, який широко використовується, ці системи представляють насамперед теоретичний інтерес. Вони мають свої сильні сторони, але мало хто з користувачів R знає і розуміє їх, тому іншим важко читати та сприяти вашому коду.
Не забудьте також прочитати розділ про компроміси у "Advanced R, 2-е видання" .