为什么人们大多包装I18n.t方法而不是委托?

时间:2015-08-19 09:45:31

标签: ruby-on-rails ruby ruby-on-rails-4 rails-i18n

我看到很多

的例子
def t(*args)
  I18n.t(*args)
end

而且很少

delegate :t, to: I18n

在我的诚实意见中,第二种解决方案在语义上更好。人们为什么不倾向于使用它?

1 个答案:

答案 0 :(得分:4)

  

为什么人们倾向于不使用它?

嗯,有一个原因(正如@BroiSatse所说)是人们根本不了解这种技术。

从字节码的角度来看,差别不大。 delegate生成大致相同的方法,并进行一些额外的安全检查(respond_to?等)。

我们团队中有这样的规则:delegate应该用于向外部调用者提示方法正在转发给其他对象的方法。因此,仅用于“缩短”委托方法的内部调用。也就是说,如果没有从外部调用方法,请不要在其上使用delegate,请自行编写转发。

所以选择是基于我们想传达的信息。是的,我们在我们的应用程序中有I18n.t的两种形式的委派:)

例如:

# use `delegate`, method is called from outside
class User
  has_one :address

  delegate :country, to: :address
end

<%= user.country %>


# only internal callers, do not use `delegate`
class Exporter
  # delegate :export, to: :handler 
  def call
    handler.export
  end

  private

  def handler
    return something_with_export_method
  end
end