Refinements in Ruby
Như chúng ta đã biết, không giống như những ngôn ngữ lập trình khác, với Ruby chúng ta hoàn toàn có thể mở lại một class hay module đã được định nghĩa từ trước để thêm vào những method cần thiết. Việc này thực sự khiến mọi thứ trở nên rất linh hoạt nhưng cũng chính vì thế mà nó trở thành con dao hai lưỡi vì việc làm đó có thể sẽ là nguyên nhân dẫn đến sự không ổn định của hệ thống. Refinements
có thể được coi là một giải phát để giải quyết vấn đề đó khi nó vẫn giữ được tính linh hoạt nhưng mọi thay đổi đều sẽ được đặt trong tầm kiểm soát.
What is Refinements ?
Refinements
được đưa vào Ruby từ version 2.0 tuy nhiên đến version 2.1 nó mới thực sự được chú ý nhiều hơn. Mục đính của refinements
là tạo ra những thay đổi tạm thời, bị giới hạn trên một class và không làm ảnh hưởng tới hoạt động của class đó ở những nơi khác.
Dưới đây là một ví dụ, chúng ta sẽ overide method upcase
của class String
. Tuy nhiên những thay đổi này chỉ thực sự có tác dụng ở những nơi ta cần dùng đến:
module Shout
refine String do
def upcase
self.downcase + "!!"
end
end
end
Chúng ta có thêm một class Person
class Person
attr_accessor :name
def announce
puts "#{name.upcase}"
end
end
Kiểm tra method announce
amit = Person.new
amit.name = "amit"
amit.announce # => AMIT
Mọi thứ vẫn bình thường. Bây giờ chúng ta sẽ khai báo sử dụng Shout
trong Person
class Person
attr_accessor :name
using Shout
def announce
puts "#{name.upcase}"
end
end
Và đây là kết quả:
amit = Person.new
amit.name = "AMIT"
amit.announce # => amit!!
How did it happen?
Có hai điểm cần chú ý ở ví dụ bên trên đó là refine
và using
luôn làm việc cùng nhau.
Method refine
nhận vào một class và một block. Bên trong block này sẽ là những method mới được định nghĩa tuy nhiên chúng không được lưu trong methods table
của class mà ở một nơi khác. Giống như một chiếc hộp sẽ được mở ra nhờ việc sử dụng using
, lúc này class ban đầu mới thực sự có thêm những method đó. Như vậy mọi thứ luôn được kiểm soát, class ban đầu vẫn giữ được tính ổn định vốn có của nó.
Conclusion
Như vậy mình đã giới thiệu với các bạn về Refinements
trong Ruby. Hi vọng nó sẽ phần nào giúp mọi người hiểu rõ hơn về một kỹ thuật mới mà Ruby cung cấp từ đó có thể sử dụng vào để giải quyết những vấn đề phù hợp.
https://sahilthakur7blog.wordpress.com/2018/06/21/using-refinements-to-affect-core-behavior/
All rights reserved