Dưới đây là bản cập nhật nhanh của nhiều hệ thống đối tượng R theo "Advanced R, phiên bản 2" (CRC Press, 2019) của Hadley Wickham (Nhà khoa học trưởng tại RStudio), có đại diện web ở đây , dựa trên chương về Đối tượng Lập trình -Irient .
Phiên bản đầu tiên từ năm 2015 có một đại diện web ở đây , với chương tương ứng về OO ở đây .
Phương pháp tiếp cận hệ thống OO
Hadley định nghĩa như sau để phân biệt hai cách tiếp cận khác nhau đối với lập trình OO:
Hàm OOP : các phương thức (các đoạn mã có thể gọi được) thuộc về các hàm chung (không bị nhầm lẫn với các phương thức chung Java / C # ). Hãy nghĩ về các phương pháp như được đặt trong một bảng tra cứu toàn cầu. Phương thức để thực thi được tìm thấy bởi hệ thống thời gian chạy dựa trên tên của hàm và loại (hoặc lớp đối tượng) của một hoặc nhiều đối số được truyền cho hàm đó (đây được gọi là "phương thức gửi"). Cú pháp khôn ngoan, các cuộc gọi phương thức có thể trông giống như các cuộc gọi hàm thông thường : myfunc(object, arg1, arg2)
. Cuộc gọi này sẽ dẫn đến thời gian chạy để tìm phương thức được liên kết với cặp ("myfunc", typeof (object)) hoặc có thể ("myfunc", typeof (object), typeof (arg1), typeof (arg2))nếu ngôn ngữ hỗ trợ điều đó. Trong R's S3, tên đầy đủ của hàm chung cung cấp cặp (tên hàm, lớp)đôi. Ví dụ: mean.Date
là phương pháp tính giá trị trung bình của Ngày. Cố gắng methods("mean")
liệt kê các phương thức chung với tên hàm mean
. Cách tiếp cận OOP chức năng được tìm thấy ví dụ trong Smalltalk tiên phong của OO , Hệ thống đối tượng Lisp chung và Julia . Hadley lưu ý rằng "So với R, việc triển khai của Julia được phát triển đầy đủ và cực kỳ hiệu quả."
OOP đóng gói : các phương thức thuộc về các đối tượng hoặc các lớp và các cuộc gọi phương thức thường trông như thế nào object.method(arg1, arg2)
. Điều này được gọi là đóng gói vì đối tượng đóng gói cả dữ liệu (trường) và hành vi (phương thức). Hãy nghĩ về phương thức như được đặt trong một bảng tra cứu được gắn vào đối tượng hoặc mô tả lớp của đối tượng. Thời gian chạy trông phương thức dựa trên tên phương thức và có thể là loại của một hoặc nhiều đối số. Đây là cách tiếp cận được tìm thấy trong các ngôn ngữ OO "phổ biến" như C ++, Java, C #.
Trong cả hai trường hợp, nếu tính kế thừa được hỗ trợ (có thể là vậy), thời gian chạy có thể đi qua hệ thống phân cấp lớp lên trên cho đến khi tìm thấy sự trùng khớp cho khóa tra cứu cuộc gọi.
Làm thế nào để tìm ra hệ thống mà một đối tượng R thuộc về
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Các hệ thống đối tượng R
S3
- Phương pháp OOP chức năng.
- Hệ thống quan trọng nhất theo Hadley.
- Đơn giản nhất, phổ biến nhất. Hệ thống OO đầu tiên được sử dụng bởi R.
- Đi kèm với cơ sở R, được sử dụng trong suốt cơ sở R.
- Dựa vào các công ước hơn là bảo đảm thi hành.
- Xem Chambers, John M và Trevor J Hastie. 1992. "Các mô hình thống kê ở S." Phần mềm và sách nâng cao của Wadsworth & Brooks / Cole.
- Chi tiết trong "Advanced R, phiên bản 2" tại đây .
S4
- Phương pháp OOP chức năng.
- Hệ thống quan trọng thứ ba theo Hadley.
- Viết lại của S3, do đó tương tự như S3, nhưng trang trọng hơn và nghiêm ngặt hơn: nó buộc bạn phải suy nghĩ cẩn thận về thiết kế chương trình. Thích hợp để xây dựng các hệ thống lớn (ví dụ dự án Bioconductor ).
- Thực hiện trong gói "phương pháp" cơ sở.
- Xem: Chambers, John M. 1998. "Lập trình với dữ liệu: Hướng dẫn về ngôn ngữ S." Mùa xuân.
- Chi tiết trong "Advanced R, phiên bản 2" tại đây .
RC hay còn gọi là "Lớp tham khảo"
- Phương pháp OOP đóng gói.
- Đi kèm với cơ sở R.
- Dựa trên S4.
- Đối tượng RC là loại đối tượng S4 đặc biệt cũng "có thể thay đổi". tức là thay vì sử dụng ngữ nghĩa sao chép khi sửa đổi thông thường của R, chúng có thể được sửa đổi tại chỗ. Lưu ý rằng trạng thái có thể thay đổi là khó lý do và là nguồn gây ra lỗi xấu nhưng có thể dẫn đến mã hiệu quả hơn trong các ứng dụng nhất định.
R6
- Phương pháp OOP đóng gói.
- Hệ thống quan trọng thứ hai theo Hadley.
- Có thể tìm thấy trong gói R6 (cài đặt với
library(R6)
)
- Tương tự như RC, nhưng nhẹ hơn & nhanh hơn nhiều: nó không phụ thuộc vào S4 hoặc các phương thức gói . Được xây dựng trên môi trường R. Cũng có:
- phương pháp công cộng và tư nhân
- các ràng buộc hoạt động (các trường, khi được truy cập, thực sự gọi một phương thức)
- lớp học không hoạt động trên các gói
- cả hai phương pháp lớp (mã thuộc về lớp và có thể truy cập vào một thể hiện qua
self
, private
, super
) và các hàm thành viên (chức năng giao cho các lĩnh vực, nhưng đó không phải là phương pháp, chỉ cần các chức năng)
- Cung cấp một cách chuẩn hóa để thoát khỏi ngữ nghĩa "sao chép khi sửa đổi" của R
- Xem trang gói: "R6: Lập trình hướng đối tượng được đóng gói cho R" .
- Chi tiết trong "Advanced R, phiên bản 2" tại đây .
Khác
Có những cái khác, như R.oo (tương tự RC), proto (dựa trên nguyên mẫu, nghĩ JavaScript) và Mutatr . Tuy nhiên, "Advanced R" nói:
Ngoài R6, được sử dụng rộng rãi, các hệ thống này chủ yếu được quan tâm về mặt lý thuyết. Họ có những điểm mạnh, nhưng rất ít người dùng R biết và hiểu họ, vì vậy thật khó để người khác đọc và đóng góp cho mã của bạn.
Hãy nhớ đọc chương về sự đánh đổi trong "Advanced R, phiên bản 2" .