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_namenế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 🙂