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の理解はまだ浅いので、ここで間違っている可能性があります。

クラス全体を非推奨にし、ログに触れたときに警告メッセージをログに送信する方法の手がかりはありますか?

他の「ベストプラクティス」や非推奨の解決策は歓迎されますが、それが 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の非推奨メソッドを使用し、非推奨にするメソッドのリストを渡すことで簡単に実現できます。クラス内で定義されたメソッドのリストは、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 に答える