我正在从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
的应用程序的一部分。 / p>
如何确保NativeClass
的每次“触摸”实际上都会导致写入日志错误?
我试过(除了认为“可能这样有效”之外):
class NativeClass < EnglishClass
-> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' }
end
但那(显然?)没有用。我认为每次调用NativeClass
时lambda都会延迟加载,但我对lambdas的理解仍然有点浅,所以我可能会在这里弄错。
有关如何弃用整个类并在触摸时向我的日志发送警告消息的任何线索?
其他“最佳实践”和/或弃用解决方案是受欢迎的,但我不确定它是否是针对SO的有效问题(我不想冒这个问题关闭此问题的风险)。
答案 0 :(得分: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
答案 1 :(得分:2)
您可能最好单独弃用每个方法。这可以通过使用Rails的deprecate方法并向其传递要弃用的方法列表来轻松完成。通过将false传递给public_instance_methods
class NativeClass < EnglishClass
def method1
end
def method2
end
deprecate *public_instance_methods(false)
end
请注意,它需要在最后一个公共方法之后声明。