Private method ใน Ruby คืออะไร?
เป็นประเภทของเมธอดที่คุณสามารถเรียกได้ เฉพาะจากภายในคลาสที่นิยามมัน เท่านั้น
สิ่งนี้ช่วยให้คุณควบคุมการเข้าถึงเมธอดได้
Ruby method สามารถเป็น:
- private
- public (default)
- protected
โดย default เมธอดทั้งหมดเป็น public
ทุกคนใช้ได้!
แตคุณเปลี่ยนได้ โดยทำให้เมธอดเป็น private หรือ protected
ทำไมถึงมีประโยชน์?
เพราะคุณทำให้เมธอดเหล่านี้ เปลี่ยนแปลงได้ง่ายขึ้น
จินตนาการว่าคุณเขียน code library ที่จะถูกใช้ในโปรเจกต์ต่างๆ ที่ทำงาน
เมื่อโปรเจกต์เหล่านี้ implement library ของคุณ พวกเขาจะเรียกเมธอดบนคลาสที่คุณสร้าง
ตอนนี้:
คุณปล่อยเวอร์ชันใหม่…
แตคุณตัดสินใจเปลี่ยนชื่อบนเมธอด public
นั่นจะเกิด errors บนทุกโปรเจกต์ที่ใช้เมธอดนี้!
จำไว้:
การมี public methods น้อยลง เพิ่มความอิสระในการเปลี่ยนแปลงภายในคลาส
มา看看ตัวอย่างโค้ด!
เข้าใจ Private Methods ใน Ruby
เคยเห็น error "private method called" ไหม?
ตัวนี้:
self.puts 123 # NoMethodError: private method `puts' called
แล้วคุณพยายามใช้ private method ผิดวิธี
คุณใช้ private method ได้แค่ด้วยตัวมันเอง
ตัวอย่าง:
puts 123
มันคือเมธอดเดียวกัน แตคุณต้องเรียกแบบนี้
Private methods ถูกเรียกภายใน context ของ self เสมอ
กล่าวอีกนัยหนึ่ง…
คุณใช้ private methods ได้เฉพาะกับ:
- เมธอดอื่นๆ จากคลาสเดียวกัน
- เมธอดที่สืบทอดจาก parent class
- เมธอดที่ include จาก module
นี่หมายถึงคุณไม่สามารถเรียก private methods จากนอกคลาสที่นิยามพวกมัน
เพราะต้องการ "explicit receiver"
เว้นแต่…
คุณใช้เมธอดอย่าง send เพื่อ bypass กฎนี้
send(:puts, "apple")
วิธีนิยาม private method?
แบบนี้:
def bacon "private bacon" end private :bacon
คำว่า private เองไม่ใช่ keyword เป็นเมธอดที่นิยามบน module Kernel
วาง Private Methods ที่ไหน
ปกติคลาสมี private methods มากกว่าหนึ่ง
วางเมธอดเหล่านี้ที่ไหน?
ทำแบบนี้:
class Food def public_method end private def bacon end def orange end def coconut end end
ทุก instance method หลัง private จะกลายเป็น private method
คุณใช้
private_class_method :method_nameได้ หากอยากนิยาม class method ว่า private
เป็น pattern ที่พบบ่อย นิยาม public methods ทั้งหมดก่อน แล้วค่อย define private methods รวมกันท้ายคลาส
Public Methods
Public เป็น default method visibility ใน Ruby
ตัวอย่าง:
def orange "Vitamin C" end
หากคุณมีออบเจกต์ food ที่นิยาม orange คุณเรียกได้แบบนี้:
food.orange
หากเมธอดถูกทำให้ private หรือ protected คุณทำให้ public อีกได้
แบบนี้:
public :orange
Protected Method คืออะไร?
Protected methods น้อยกว่า
เหมือน private methods แตคุณเรียกได้บนออบเจกต์ ไม่ใช่แค่โดยตรง
หาก ลองตัวอย่างนี้กับ private จะได้ error:
class Food
def initialize(name)
@name = name
end
def ==(other)
name == other.name
end
protected
attr_reader :name
end
food = Food.new("chocolate")
puts food == food
คุณได้ error เพราะ name จะเป็น private ดังนั้นไม่ทำ other.name ได้
แตกับ protected โค้ดนี้ทำงาน!
Private vs Protected Methods
นั่นคือความแตกต่าง คือ protected เก็บเมธอดเป็น private แตยังอนุญาตให้คุณเรียกเมธอดนั้นบนออบเจกต์
กับ private คุณทำได้แค่ name กับ protected คุณทำ object.name ได้
เมื่อไหร่ควรใช้ protected?
เฉพาะกรณีเฉพาะเจาะจง เช่นเมธอด equals (==)
Ruby documentation แนะนำให้ใช้ private แทน protected เมื่อเป็นไปได้
และมีบันทึกนี้:
"Protected method ช้า เพราะไม่สามารถใช้ inline cache ได้"
ผมอยากรู้ จึง รัน benchmarks:
public: 2813891.9 i/s private: 2699273.8 i/s protected: 2572122.0 i/s
ความแตกต่างประสิทธิภาพ 8.5%
วิดีโอสอน
สรุป
คุณเรียนรู้เกี่ยวกับ Ruby method visibility public, private และ protected methods แล้ว! สิ่งเหล่านี้ไม่ใช่ Ruby keywords พวกมันเป็นเมธอดเองที่นิยามบนคลาส Module
กรุณาแชร์โพสต์นี้ให้ผู้คนอีกมากขึ้นเข้าใจหัวข้อนี้!
ขอบคุณที่อ่าน 🙂