บทความนี้เกี่ยวกับการมอบหมายเมธอดใน Ruby
คุณจะได้เรียนรู้วิธีการใช้ delegate
วิธีการ Forwardable
โมดูล &SimpleDelegator
ชั้นเรียน
ทำไมเราถึงต้องการ การมอบหมาย ?
ใน Object-Oriented Programming มีสองวิธีในการทำงานร่วมกันของชั้นเรียน
พวกเขา :
- มรดก
- องค์ประกอบ
ด้วยการสืบทอด คุณจะสร้างลำดับชั้นของคลาส โดยที่คลาสพาเรนต์แชร์เมธอด ค่าคงที่ และคำจำกัดความของตัวแปรอินสแตนซ์กับคลาสใดๆ ที่สืบทอดมาจากคลาสนั้น
ตัวอย่างเช่น :
ใน Ruby ทุกอ็อบเจ็กต์สืบทอดมาจาก Object
คลาสตามค่าเริ่มต้น
นั่นคือเหตุผลที่คุณเข้าถึงวิธีการต่างๆ เช่น puts
, class
&object_id
.
ด้วยการจัดองค์ประกอบ คลาสจะสร้าง (หรือได้รับ) อ็อบเจ็กต์จากคลาสอื่น… จากนั้นคลาสจะใช้ออบเจกต์เหล่านี้เพื่อมอบหมายงานให้กับคลาสเหล่านั้น
ตัวอย่างเช่น :
คอมพิวเตอร์ถูกสร้างขึ้นจากหลายส่วน (วัตถุ) และแต่ละส่วนก็รู้วิธีทำสิ่งหนึ่งได้ดี
หากคุณต้องการแสดงบางอย่างบนหน้าจอ คอมพิวเตอร์จะบอกการ์ดแสดงผลว่าจะแสดงอะไร แต่จะไม่แสดงวิธีการ
นั่นคือ องค์ประกอบ !
แต่ถ้าคุณเป็นคอมพิวเตอร์และต้องการให้สิทธิ์การเข้าถึงวิธีการ์ดแสดงผลล่ะ
คุณต้องสร้าง "สะพาน" ระหว่างพวกเขา
เรามาดูวิธีการทำกัน
การมอบหมายวิธีการทับทิม – ตัวอย่าง
เรามีสองคลาส:
Computer
Memory
ให้รหัสต่อไปนี้ :
class Computer def initialize @memory = Memory.new end end class Memory def initialize @data = [] end def write(data) @data << data end def read(index) @data[index] end end computer = Computer.new
เราต้องการที่จะสามารถเข้าถึงหน่วยความจำผ่าน Computer
.
อาจเป็นได้จากหลายสาเหตุ :
- คุณมีหน่วยความจำเพียง 1 หน่วย นั่นหมายความว่าคุณต้องการเพียงวัตถุหน่วยความจำ 1 รายการเท่านั้น ด้วยการรวมศูนย์การเข้าถึงไว้ในวัตถุเดียว คุณสามารถบรรลุสิ่งนั้นได้
- คุณต้องการควบคุมว่าใครสามารถเข้าถึงหน่วยความจำ (แอปพลิเคชันต่างๆ) และหน่วยความจำส่วนใดที่พวกเขาสามารถใช้ได้
- คุณต้องการบันทึกการเข้าถึงหน่วยความจำทั้งหมดเพื่อความปลอดภัยหรือการดีบัก
ตอนนี้ ถ้าคุณพยายามทำสิ่งนี้ :
computer.write("rubyguides")
มันจะล้มเหลวด้วย NoMethodError
เพราะไม่มี write
วิธีการใน Computer
.
undefined method `write' for #<Computer:0x000055c2e8f7d310> (NoMethodError)
Computer
ชั้นเรียนไม่รู้ว่าคุณหมายถึงอะไรโดย write
.
เว้นแต่...
คุณสร้าง write
วิธีการ!
ตามนี้ :
class Computer def initialize @memory = Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) end end
เรากำลังส่งคำขอไปยัง @memory
วัตถุ
นั่นคือการมอบหมายเมธอด
หมายเหตุ :วิธีนี้ทำให้วิธีการเหล่านี้เป็นส่วนหนึ่งของอินเทอร์เฟซสาธารณะของคุณ (ทุกคนสามารถใช้ได้) และคุณไม่ต้องการแบบนั้นเสมอไป
มีทางลัดสำหรับการมอบหมายเมธอดบางประเภทหรือไม่ ?
ใช่!
มาดูกัน...
วิธีใช้โมดูลที่ส่งต่อได้
ตอนนี้ :
คุณสามารถใช้ Forwardable
โมดูลที่มาพร้อมกับ Ruby เพื่อกำหนดวิธีการมอบหมาย
ใช้งานได้แบบนี้ :
require 'forwardable' class Computer extend Forwardable def_delegators :@memory, :read, :write def initialize @memory = Memory.new end end
วิธีนี้ทำให้คุณสามารถลบวิธีการที่เราสร้างไว้ก่อนหน้านี้และจะทำสิ่งเดียวกัน
Forwardable จะดูแลอาร์กิวเมนต์ของเมธอด (รวมถึงบล็อคด้วย!) ให้กับคุณ ดังนั้นคุณจึงไม่ต้องกังวลเรื่องนี้
ไม่ดีเหรอ? 🙂
วิธีใช้งาน Rails Delegate Method
หากคุณใช้ Rails หรือ ActiveSupport gem เพียงอย่างเดียว แสดงว่าคุณสามารถเข้าถึง delegate
วิธีการ
นี่คือวิธีการทำงาน :
class Computer delegate :read, :write, to: :@memory def initialize @memory = Memory.new end end
delegate
เมธอดใช้ prefix
อาร์กิวเมนต์ ซึ่งช่วยให้คุณสามารถเพิ่มคำนำหน้าชื่อเมธอดได้
ตัวอย่าง :
class Computer delegate :read, :write, prefix: "memory", to: :@memory def initialize @memory = Memory.new end end
ได้สองวิธี :
memory_read
memory_write
วิธีการมอบหมายทุกอย่างด้วย SimpleDelegator
เทคนิคที่คุณเพิ่งเรียนรู้เหล่านี้ใช้เพื่อส่งต่อหรือมอบหมายวิธีการเฉพาะ
แต่ถ้าคุณต้องการห่อวัตถุ &แสดงวิธีการทั้งหมด...
คุณสามารถใช้ SimpleDelegator
คลาส!
ตามนี้ :
require 'delegate' class CoolArray < SimpleDelegator end cool = CoolArray.new([]) cool << "ruby" cool << "gems" p cool
ตอนนี้ CoolArray
ทำตัวเหมือนวัตถุที่คุณส่งไปยัง new
.
ทำไมสิ่งนี้จึงมีประโยชน์
คุณสามารถเพิ่มวิธีการใหม่ให้กับวัตถุนี้โดยไม่ต้องเปลี่ยนคลาสเดิม
วิดีโอสอน
สรุป
คุณได้เรียนรู้เกี่ยวกับองค์ประกอบของวัตถุใน Ruby และวิธีมอบหมายวิธีโดยใช้เทคนิคต่างๆ!
หากคุณชอบบทความนี้ โปรด แชร์ กับเพื่อนทับทิมของคุณ
ขอบคุณที่อ่านนะคะ 🙂