5

我正在为从 Rails 2.x 到 3.x 的客户端重写/重构遗留应用程序。作为重构的一部分,我还想从我们当地语言的模型/方法转向纯英文代码库。

这涉及为几乎每个功能编写新方法。我通过以下方法解决了这个问题:

def english_method
  # ...
end

def native_method
  warn 'DEPRECATED, please use #english_method'
  english_method
end

这适用于方法,并帮助我跟踪仍在使用旧方法的地方,而不会破坏任何代码。

然而,对于类(模型),我一直在做:

class NativeClass < EnglishClass
  # DEPRECATED, Please use EnglishClass
end

class EnglishClass
  # ...
end

这个“有效”,无论何时NativeClass调用,应用程序都会继续工作,但我在日志中没有收到任何消息,通知我应用程序的一部分仍在调用NativeClass.

如何确保每次“触摸”NativeClass实际上都会导致写入日志错误?

我尝试(除了认为“也许这行得通”之外没有其他原因)这样做:

class NativeClass < EnglishClass
  -> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' }
end

但这(显然?)没有用。我认为每次NativeClass调用 lambda 都会延迟加载,但我对 lambdas 的理解仍然有些浅薄,所以我可能会在这里弄错。

关于如何弃用整个类并在我的日志被触摸时向我的日志发送警告消息的任何线索?

欢迎其他“最佳实践”和/或弃用解决方案,但我不确定这是否是 SO 的有效问题(我不想冒着因这个问题而关闭该主题的风险)。

4

2 回答 2

4

尝试像这样使用:

class NativeClass < EnglishClass
  def initialize
    ActiveSupport::Deprecation.warn "NativeClass is deprecated and may be removed from future releases, use EnglishClass instead.", caller
    super
  end
end
于 2012-12-02T16:21:54.807 回答
2

您最好单独弃用每种方法。这可以通过使用 Rails 的 deprecate 方法并传递给它您要弃用的方法列表来轻松完成。类中定义的方法列表可通过将 false 传递给public_instance_methods

class NativeClass < EnglishClass
  def method1
  end

  def method2
  end

  deprecate *public_instance_methods(false)
end

请注意,它需要在最后一个公共方法之后声明。

于 2012-12-02T16:21:30.967 回答