Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby Private & Protected Methods: สร้างโค้ดปลอดภัยและบำรุงรักษาง่าย

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

กรุณาแชร์โพสต์นี้ให้ผู้คนอีกมากขึ้นเข้าใจหัวข้อนี้!

ขอบคุณที่อ่าน 🙂