Refinements Trong 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 ...
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ó.
Summary
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/