【问题标题】:Why people mostly wrap I18n.t method instead of delegating?为什么人们大多包装 I18n.t 方法而不是委托?
【发布时间】:2015-08-19 09:45:30
【问题描述】:

我看到很多例子

def t(*args)
  I18n.t(*args)
end

而且很少

delegate :t, to: I18n

老实说,第二种解决方案在语义上更好。为什么人们倾向于不使用它?

【问题讨论】:

  • 我会选择“因为他们不知道delegate 方法。”
  • 使用委托有什么缺点吗?
  • 看看delegate 源代码(是的,这是一种方法,而不是关键字或任何东西)。在引擎盖下,它实际上定义了一个像你这样的方法。唯一的区别是修改方法需要一些额外的选项,但它只在加载模块时执行一次,并且开销实际上不存在,所以简而言之 - 没有可测量的差异。
  • 另外:它会生成自定义异常消息,因此更容易调试github.com/rails/rails/blob/master/activesupport/lib/…

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


【解决方案1】:

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

嗯,一个原因(正如@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多