Nic Lin's Blog

喜歡在地上滾的工程師

Rails 中的 delegate 用法

Delegate 其實就是可以讓這個 class 用另一個 class 的 method,來實現到更語意化的寫法。

假設實做徽章系統,每個使用者(User)可以有多個徽章(Badge)。

雖然 Badge 都跟 user 有關,如果是我的話我會希望可以用 user.add_badge("name") 的方式來加 badge,但加 badge 的邏輯當然不該放到 User class 裡面,所以我可能會考慮用 delegate 的方式來做。例如:

class User

  def badge_delegator
    BadgeService.new(user)
  end

  delegate :add_badge!, :remove_badge, to: :badge_delegator
end

class BadgeService
  def add_badge!(name)
  end
end

這樣一來就可以寫出很容易懂得語句,也能夠讓每個 class 各司其職,不必把不相關的邏輯硬塞在同一個 class 內了!

comments powered by Disqus