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 內了!