Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành thạo Private & Protected Method Ruby: Code an toàn, dễ bảo trì

Private method trong Ruby là gì?

Đó là loại phương thức bạn CHỈ gọi từ bên trong class nơi nó định nghĩa.

Điều này cho phép kiểm soát truy cập phương thức.

Phương thức Ruby có thể là:

  • private
  • public (mặc định)
  • protected

Mặc định TẤT CẢ phương thức là public.

Ai cũng dùng được!

Nhưng bạn thay đổi được, bằng cách làm phương thức private hoặc protected.

Tại sao hữu ích?

Vì bạn làm cho các phương thức này dễ thay đổi hơn.

Hãy tưởng tượng bạn viết thư viện code dùng cho vài project khác ở công ty.

Khi project này implement thư viện, chúng sẽ gọi phương thức trên class bạn tạo.

Bây giờ:

Bạn phát hành version mới…

Nhưng bạn đổi tên phương thức public.

Đó sẽ gây lỗi trên mọi project dùng phương thức này!

Nhớ điều này:

Ít public method hơn = TỰ DO THAY ĐỔI nhiều hơn bên trong class.

Hãy xem vài ví dụ code!

Hiểu Private Method trong Ruby

Bạn từng thấy error "private method called"?

Cái này:

 self.puts 123 # NoMethodError: private method `puts' called 

Thì bạn đã thử dùng phương thức private sai cách.

Bạn chỉ dùng private method tự nó.

Ví dụ:

 puts 123 

Cùng phương thức, nhưng phải gọi như này.

Private method luôn được gọi trong context của self.

Nói cách khác…

Bạn chỉ dùng private method với:

  • Phương thức khác cùng class
  • Phương thức kế thừa từ class cha
  • Phương thức include từ module

Điều này nghĩa bạn không gọi private method từ bên ngoài class định nghĩa chúng.

Vì đó yêu cầu "explicit receiver".

Trừ khi…

Bạn dùng phương thức như send bypass quy tắc này.

 send(:puts, "apple") 

Cách định nghĩa phương thức private?

Như sau:

 def bacon
  "private bacon"
end
private :bacon 

Từ private bản thân không phải keyword, nó là phương thức định nghĩa trên module Kernel.

Đặt Private Method ở đâu

Class thường có nhiều hơn một private method.

Đặt phương thức này ở đâu?

Làm thế này:

 class Food
  def public_method
  end
  private
  def bacon
  end
  def orange
  end
  def coconut
  end
end 

Mọi instance method sau private thành private method.

Bạn dùng private_class_method :method_name nếu muốn định nghĩa class method là private

Pattern phổ biến: định nghĩa tất cả public method trước, sau đó gom private method cuối class.

Public Methods

Public là method visibility mặc định trong Ruby.

Ví dụ:

 def orange
  "Vitamin C"
end 

Nếu object food định nghĩa orange, bạn gọi:

 food.orange 

Nếu phương thức đã private hoặc protected, bạn làm public lại.

Như sau:

 public :orange 

Protected Method là gì?

Protected method ít dùng hơn.

Chúng giống private method, nhưng bạn gọi được trên object chứ không chỉ trực tiếp.

Nếu thử ví dụ này với private bạn gặp lỗi:

 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 

Bạn gặp lỗi vì name private nên không làm other.name được.

Nhưng với protected code chạy!

Private vs Protected Methods

Đó là khác biệt, protected giữ phương thức private nhưng cũng cho phép gọi phương thức trên object.

Với private chỉ làm name, với protected làm object.name.

Khi nào dùng protected?

Chỉ khi có case cụ thể, như phương thức equals (==).

Tài liệu Ruby khuyên dùng private thay protected khi có thể.

Và có note này:

"Protected method chậm vì không dùng inline cache."

Tôi tò mò nên chạy benchmark:

 public: 2813891.9 i/s
private: 2699273.8 i/s
protected: 2572122.0 i/s 

Đó là chênh lệch 8.5% hiệu năng.

Video hướng dẫn

Tóm tắt

Bạn đã học về method visibility Ruby: public, private, protected. Đây không phải Ruby keywords, chúng là phương thức định nghĩa trên class Module.

Hãy chia sẻ bài viết để nhiều người hiểu chủ đề này!

Cảm ơn đã đọc 🙂