นี่คือบทสรุปอย่างรวดเร็วที่อัปเดตของระบบวัตถุ Rจำนวนมากตาม"Advanced R, 2nd edition" (CRC Press, 2019) โดย Hadley Wickham (Chief Scientist ที่ RStudio) ซึ่งมีการแสดงเว็บที่นี่โดยอ้างอิงจากบทเกี่ยวกับObject การเขียนโปรแกรมเชิง
ฉบับพิมพ์ครั้งแรกจาก 2015 มีตัวแทนเว็บที่นี่ด้วยบทที่สอดคล้องกันใน OO นี่
แนวทางของระบบ OO
Hadley กำหนดสิ่งต่อไปนี้เพื่อแยกความแตกต่างสองแนวทางในการเขียนโปรแกรม OO:
OOP ที่ใช้งานได้ : วิธีการ (ส่วนรหัสที่เรียกได้) เป็นของฟังก์ชันทั่วไป (เพื่อไม่ให้สับสนกับวิธีการทั่วไปของ Java / C # ) ลองนึกถึงวิธีการที่อยู่ในตารางการค้นหาส่วนกลาง ระบบรันไทม์จะพบวิธีการดำเนินการตามชื่อของฟังก์ชันและประเภท (หรือคลาสอ็อบเจ็กต์) ของอาร์กิวเมนต์อย่างน้อยหนึ่งอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันนั้น (เรียกว่า "วิธีการจัดส่ง") myfunc(object, arg1, arg2)
ไวยากรณ์ฉลาดวิธีการโทรอาจมีลักษณะเหมือนการเรียกฟังก์ชันสามัญ: การเรียกนี้จะทำให้รันไทม์ค้นหาเมธอดที่เกี่ยวข้องกับคู่("myfunc", typeof (object))หรืออาจเป็น("myfunc", typeof (object), typeof (arg1), typeof (arg2))หากภาษานั้นรองรับ ในการวิจัยของ S3, ชื่อเต็มของฟังก์ชั่นทั่วไปให้(ฟังก์ชั่นชื่อชั้น)คู่ ตัวอย่างเช่น: mean.Date
เป็นวิธีการคำนวณค่าเฉลี่ยของวันที่ ลองไปที่รายการวิธีการทั่วไปที่มีชื่อฟังก์ชั่นmethods("mean")
mean
วิธี OOP ฟังก์ชั่นที่พบเช่นในผู้บุกเบิก OO สมอลล์ทอล์คที่Common เสียงกระเพื่อมวัตถุระบบและจูเลีย Hadley ตั้งข้อสังเกตว่า"เมื่อเทียบกับ R การใช้งานของ Julia ได้รับการพัฒนาอย่างเต็มที่และมีประสิทธิภาพสูงมาก"
OOP ที่ห่อหุ้ม : เมธอดเป็นของอ็อบเจ็กต์หรือคลาสและโดยทั่วไปการเรียกเมธอดจะมีลักษณะobject.method(arg1, arg2)
ดังนี้ สิ่งนี้เรียกว่าการห่อหุ้มเนื่องจากวัตถุห่อหุ้มทั้งข้อมูล (ฟิลด์) และพฤติกรรม (วิธีการ) คิดว่าเมธอดอยู่ในตารางการค้นหาที่แนบกับอ็อบเจ็กต์หรือคำอธิบายคลาสของอ็อบเจ็กต์ รันไทม์จะค้นหาเมธอดตามชื่อเมธอดและอาจเป็นประเภทของอาร์กิวเมนต์ตั้งแต่หนึ่งตัวขึ้นไป นี่คือแนวทางที่พบในภาษา OO "ยอดนิยม" เช่น C ++, Java, C #
ในทั้งสองกรณีหากรองรับการสืบทอด (อาจเป็น) รันไทม์อาจข้ามลำดับชั้นของคลาสขึ้นไปจนกว่าจะพบคีย์การค้นหาการโทรที่ตรงกัน
วิธีค้นหาว่าวัตถุ R เป็นของระบบใด
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
ระบบวัตถุ R
S3
- แนวทาง OOP ที่ใช้งานได้
- ระบบที่สำคัญที่สุดตาม Hadley
- ง่ายที่สุดที่พบบ่อยที่สุด ระบบ OO แรกที่ใช้โดย R.
- มาพร้อมกับฐาน R ใช้ตลอดฐาน R
- ขึ้นอยู่กับอนุสัญญามากกว่าการค้ำประกันที่บังคับใช้
- ดูChambers, John M และ Trevor J Hastie 2535. "แบบจำลองทางสถิติใน S. " Wadsworth & Brooks / Cole Advanced Books & Software
- รายละเอียดใน"ขั้นสูง R, พิมพ์ครั้งที่ 2" ที่นี่
S4
- แนวทาง OOP ที่ใช้งานได้
- ระบบที่สำคัญที่สุดอันดับสามตาม Hadley
- การเขียน S3 ใหม่จึงคล้ายกับ S3 แต่เป็นทางการและเข้มงวดกว่า: บังคับให้คุณคิดอย่างรอบคอบเกี่ยวกับการออกแบบโปรแกรม เหมาะสำหรับการสร้างระบบขนาดใหญ่ (เช่นโครงการBioconductor )
- ดำเนินการในแพ็คเกจ "วิธีการ" พื้นฐาน
- โปรดดู: Chambers, John M. 1998. "Programming with Data: A Guide to the S Language." สปริงเกอร์
- รายละเอียดใน"ขั้นสูง R, พิมพ์ครั้งที่ 2" ที่นี่
RC aka "คลาสอ้างอิง"
- วิธีการห่อหุ้ม OOP
- มาพร้อมฐาน R
- ขึ้นอยู่กับ S4
- วัตถุ RC เป็นวัตถุ S4 ประเภทพิเศษที่ "เปลี่ยนแปลงได้" เช่นกัน กล่าวคือแทนที่จะใช้ความหมายตามปกติ copy-on-modified ของ R สามารถแก้ไขได้ในสถานที่ โปรดทราบว่าสถานะที่เปลี่ยนแปลงได้นั้นยากที่จะให้เหตุผลและเป็นแหล่งที่มาของข้อบกพร่องที่น่าเกลียด แต่อาจทำให้โค้ดมีประสิทธิภาพมากขึ้นในบางแอปพลิเคชัน
R6
- วิธีการห่อหุ้ม OOP
- ระบบที่สำคัญอันดับสองตาม Hadley
- สามารถพบได้ในแพ็คเกจR6 (ติดตั้งด้วย
library(R6)
)
- คล้ายกับ RC แต่เบากว่าและเร็วกว่ามาก: ไม่ได้ขึ้นอยู่กับ S4 หรือแพ็คเกจวิธีการ สร้างขึ้นจากสภาพแวดล้อม R ยังมี:
- วิธีการสาธารณะและส่วนตัว
- การผูกที่ใช้งานอยู่ (ฟิลด์ที่เมื่อเข้าถึงแล้วจะเรียกวิธีการ)
- การสืบทอดคลาสซึ่งทำงานข้ามแพ็คเกจ
- ทั้งวิธีการเรียน (รหัสที่อยู่ในชั้นเรียนและสามารถเข้าถึงได้ผ่านทางอินสแตนซ์
self
, private
, super
) และฟังก์ชั่นสมาชิก (ฟังก์ชั่นได้รับมอบหมายให้สาขา แต่ที่ไม่ได้เป็นวิธีการทำงานเพียง)
- เป็นวิธีมาตรฐานในการหลีกเลี่ยงความหมาย "copy-on-modified" ของ R
- ดูเว็บไซต์ของแพคเกจ: "R6: เขียนโปรแกรมเชิงวัตถุ Encapsulated สำหรับ R"
- รายละเอียดใน"ขั้นสูง R, พิมพ์ครั้งที่ 2" ที่นี่
คนอื่น ๆ
มีคนอื่น ๆ เช่นมีR.oo (คล้ายกับ RC) โปรโต (ต้นแบบตามคิดจาวาสคริปต์) และMutatr อย่างไรก็ตาม "Advanced R" กล่าวว่า:
นอกเหนือจาก R6 ซึ่งใช้กันอย่างแพร่หลายระบบเหล่านี้ยังให้ความสนใจในเชิงทฤษฎีเป็นหลัก พวกเขามีจุดแข็ง แต่มีผู้ใช้ R เพียงไม่กี่คนที่รู้จักและเข้าใจพวกเขาดังนั้นจึงเป็นเรื่องยากที่คนอื่นจะอ่านและมีส่วนร่วมในโค้ดของคุณ
อย่าลืมอ่านบทการแลกเปลี่ยนใน"Advanced R, 2nd edition"ด้วย