iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

Metaprogramming Ruby and Rails系列 第 3

Day 3 -- Open Class

  • 分享至 

  • xImage
  •  

Open Class 開放類別

Open class 開放類別是 Ruby 程式語言的特色之一,所謂的開放類別就是讓 Ruby 內部的類別可以增加,甚至是改寫原有的方法。以下面的範例來說:

class Dog   
  def jump
    'jump'
  end
end
class Dog
  def run
    'run'
  end
end
dog = Dog.new
dog.jump         # => "jump"
dob.run         # => "run"

當 Ruby 第一次遇到 class Dog 時,發現 class Dog 並不存在,所以會定義此類別及 jump()方法。接者第二次再遇到 class Dog 時,會知道 class Dog 已經存在於 Ruby 了,因此會 "打開" 類別,讓 run()方法可以進入而類別 Dog 就會多了 run() 方法了。

當然你也可以改寫 Ruby 內建類別,例如:String 、Array 等…

grade = [90, 88, 4]
puts grade.size       # => 3, 還未改寫內部size方法前
class Array
  def size
    10               # => 只要是呼叫size方法就會回傳10
  end
end
p grade.size         # => 10, 改寫size方法後

The Problem with Open Classes

" The term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which does not act as desired. " from Wikipedia
Monkey Patching >

開放類別常見的問題就是在複雜的專案中,如果沒有適當的控管,有可能會修改到相同名字方法,而造成與之前撰寫好的程式碼產生衝突。當我們只是為了要解決程式裡的某個 bug 或是新的功能,而直接去利用開放類別的便利性去做修改,就是所謂的 "猴子補丁 (monkey patching)" 。

Ruby 有提供可以檢查是否有重複使用名稱的方法

[ ].methods.grep /^re/  # => 利用 regexp 找出所有re開頭的方法名稱

更詳細的介紹可以參考:3 Ways to Monkey-Patch Without Making a Mess

重點回顧

Open Class 增加了在撰寫程式的靈活性,也是許多人喜愛 Ruby的特色之一。只要使用得當,會讓程式閱讀上更好,日後在維護程式也將更有效率。大家所熟悉的 Rails 也常見使用此技巧。


上一篇
Day 2 -- What is Metaprogramming ?
下一篇
Day 4 -- Inside the Object Model
系列文
Metaprogramming Ruby and Rails33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言