12/08/2018, 15:54

Refinements

Sai logic hay là không kiểm xoát được những ảnh hưởng khi sửa code trong quá trình lập trình là một điều khá là phổ biến, đặc biệt là các bạn mới học lập trình. Vậy làm sao để giải quyết được điều đó? Khi các bạn đọc class mà chứa hàng nghìn dòng code hay là hàng trăm các hàm khác nhau. Vậy làm sao ...

Sai logic hay là không kiểm xoát được những ảnh hưởng khi sửa code trong quá trình lập trình là một điều khá là phổ biến, đặc biệt là các bạn mới học lập trình. Vậy làm sao để giải quyết được điều đó? Khi các bạn đọc class mà chứa hàng nghìn dòng code hay là hàng trăm các hàm khác nhau. Vậy làm sao để viết một hàm mới mà không ảnh hưởng tới các hàm có sẵn trong class đó? Để hạn chế các vấn đề trên tôi xin giới thiệu một phương pháp đó là "Refinements"

Refinements là gì?

nó là kỹ thuật giúp chúng ta mở rộng hoặc sửa đổi một hàm hoặc thuộc tính của một đối tượng đang có bằng một hàm hoặc thuộc tính khác. Để hiểu rõ hơn về kỹ thuật này thì chúng ta đi vào tìm hiểu thế nào là refinements và cách sử dụng nó như nào.

Sử dụng Refinements như thế nào?

Refinements thường được sử dụng trong các trường hợp sau:

* Thay thế methods / attributes / functions lúc runtime
* Thay đổi hoặc mở rộng hành vi của thư viện bên thứ 3 mà không thông qua bảo trì

Để bắt đầu làm việc với Refinements, việc đầu tiên bạn nên thiết lập các method mà nó gây ảnh hưởng đến. Vì vậy, chúng ta hãy định nghĩa các module và class để chứa các method đó ví dụ khi chúng ta refine lại một hàm có sẵn trong class String.

module ExtensionStrings
  refine String do
    def shuffle 
       self.upcase
    end
  end
end

Sau đó sử dụng ExtensionStrings trong khu vực cần required bằng việc thêm: using ExtensionStrings vào module hay class cần sử dụng hàm shuffle mới được định nghĩa bên trên.

class Thing
  using ExtensionStrings
  "newbie".shuffle
  =>> NEWBIE
end

Refinements sẽ giúp bạn giới thiệu những cách thay đổi code 1 cách an toàn. Đồng thời nó vẫn có 1 số hạn chế nhất định

* không thể chạy 1 vài refine cho cùng 1 method
* Không tương thích với Dynamic Dispatch
* sẽ khó debug
* Không thể sử dụng từ bên trong 1 method hoặc 1 module

Tổng kết

Refinements, giống như 1 tính năng hữu ích, tuy nhiên vẫn còn 1 số vấn đề nhỏ tồn tại. Sử dụng Refinements sẽ cho bạn thấy rõ các hành vi thay thế và làm cho code bạn mạch lạc hơn. qua bài viết này hy vọng sẽ giúp các bạn khắc phục được một số vấn đề giống như tôi đã nêu ở trên.

0