2012-12-02 14 views
5

クライアントのレガシーアプリケーションをRails 2.xから3.xに書き直し/リファクタリングするプロセスを進めています。リファクタリングの一環として、私はまた、ローカル言語のモデル/メソッドから、純粋な英語のコードベースに移行したいと考えています。Railsでのモデル全体の廃止

これには、ほとんどすべての機能の新しいメソッドを記述することが含まれます。私は実行してメソッドのためにこれを解く:

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の有効な質問であるかどうかはわかりません(このトピックではこのトピックが閉鎖されるリスクはありません)。

答えて

2

各メソッドを個別に非推奨にする方がよい場合があります。これは、Railsのdeprecateメソッドを使用し、非推奨にするメソッドのリストを渡すことで簡単に達成できます。クラス内で定義されたメソッドのリストは、それが最後のパブリックメソッドの後に宣言する必要があることをpublic_instance_methods

class NativeClass < EnglishClass 
    def method1 
    end 

    def method2 
    end 

    deprecate *public_instance_methods(false) 
end 

ノートに偽渡すことで可能です。

+0

実は、私はちょうど今のクラス名を廃止したい、(まだ)すべてのメソッドを廃止する必要はありません。だから私はまだすべてのメソッドを同じままにしたい、私はちょうどメソッドが非推奨のクラス名を使用して呼び出されたときに警告が欲しい。他のすべてのメソッドに挿入する新しい 'deprecate'メソッドを使うこともできましたが、もっと簡単な解決法が望まれていました。 – JeanMertz

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 
+0

この解決策の問題は(私が知っている限りテストした限り)、新しいクラスオブジェクトを作成した場合にのみinitializeメソッドが起動されるということです。クラス自体、またはクラスで定義された定数でメソッドを呼び出すと、これはトリガーされません。 – JeanMertz

関連する問題