+5

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à refineusing 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/


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.