139

メソッドを非推奨としてマークしたいので、それを使用している人は簡単にコードをチェックして追いつくことができます。Java では @Deprecated を設定すると、誰もがこれが何を意味するかを知っています。

Rubyで非推奨をマークしてチェックするための好ましい方法(またはツール)はありますか?

4

11 に答える 11

170

ほとんどすべての場合において、非推奨のライブラリやメタプログラミングに依存するのはやり過ぎです。rdoc にコメントを追加して、Kernel#warnメソッドを呼び出すだけです。例えば:

class Foo
  # <b>DEPRECATED:</b> Please use <tt>useful</tt> instead.
  def useless
    warn "[DEPRECATION] `useless` is deprecated.  Please use `useful` instead."
    useful
  end

  def useful
    # ...
  end
end

rdocの代わりにYardを使用している場合、doc コメントは次のようになります。

# @deprecated Please use {#useful} instead

最後に、tomdocに準拠している場合は、コメントを次のようにします。

# Deprecated: Please use `useful` instead

非推奨: メソッドが非推奨であり、将来のバージョンで削除されることを示します。これを使用して、Public であったが次のメジャー バージョンで削除されるメソッドを文書化する必要があります。


また、将来の (そして適切に修正された) リリースで非推奨のメソッドを削除することを忘れないでください。Java ライブラリと同じ過ちを犯さないでください。

于 2008-11-16T17:09:44.690 に答える
66

Ruby 標準ライブラリには、警告ロジックを備えたモジュールがあります: https://ruby-doc.org/stdlib/libdoc/rubygems/rdoc/Gem/Deprecate.html。私は、非推奨メッセージを「標準的な」方法で維持することを好む傾向があります。

# my_file.rb

class MyFile
  extend Gem::Deprecate

  def no_more
    close
  end
  deprecate :no_more, :close, 2015, 5

  def close
    # new logic here
  end
end

MyFile.new.no_more
# => NOTE: MyFile#no_more is deprecated; use close instead. It will be removed on or after 2015-05-01.
# => MyFile#no_more called from my_file.rb:16.

このアプローチでは、通話が行われた場所に関する情報を無料で取得できることに注意してください。

于 2014-05-09T00:11:58.233 に答える
14

(役立つという理由で)意地悪になりたい場合は、警告中にコールスタックの最初の行を印刷して、非推奨の呼び出しを使用している場所を開発者に知らせることができます。

これは、パフォーマンスに打撃を与えると確信しているためです。

warn Kernel.caller.first + " whatever deprecation message here"

正しく使用されると、これには、非推奨の呼び出しが使用されたファイルと行への絶対パスが含まれます。Kernel :: callerの詳細については、こちらをご覧ください。

于 2010-05-25T22:29:47.017 に答える
8

あなたは持っていますlibdeprecated-ruby(2010-2012、2015年にはrubygemではもう利用できません)

非推奨のコードを扱う開発者を支援することを目的とした小さなライブラリ。
このアイデアはD、開発者が特定のコードを非推奨としてマークし、非推奨のコードを実行する機能を許可/禁止できる ' ' プログラミング言語から来ています。

require 'lib/deprecated.rb'
require 'test/unit'

# this class is used to test the deprecate functionality
class DummyClass
  def monkey
    return true
  end

  deprecate :monkey
end

# we want exceptions for testing here.
Deprecate.set_action(:throw)

class DeprecateTest < Test::Unit::TestCase
  def test_set_action

    assert_raise(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey }

    Deprecate.set_action(proc { |msg| raise DeprecatedError.new("#{msg} is deprecated.") })

    assert_raise(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey }


    # set to warn and make sure our return values are getting through.
    Deprecate.set_action(:warn)

    assert_nothing_raised(DeprecatedError) { raise StandardError.new unless DummyClass.new.monkey } 
  end
end
于 2008-11-16T15:31:12.487 に答える
3

レールを使用する場合は、Module#deprecateメソッドがあります。

于 2012-02-07T11:34:39.913 に答える
3

Class Macros パターンを使用して、次のように記述できます。

class Module     
     def deprecate(old_method, new_method)
          define_method(old_method) do |*args, &block|
               warn "Method #{old_method}() depricated. Use #{new_method}() instead"
               send(new_method, *args, &block)
          end
     end
end


class Test
     def my_new_method
          p "My method"
     end

     deprecate :my_old_method, :my_method
end
于 2012-02-07T06:47:43.960 に答える
2

Caniveteは、シンプルでエレガントな方法でメソッドを廃止できるようにする宝石です。ここでもう少し。

于 2010-08-01T11:50:05.030 に答える
1

私は軽量の方法を一緒に投げることになりました:

def deprecate(msg)
  method = caller_locations(1, 1).first.label
  source = caller(2, 1).first
  warn "#{method} is deprecated: #{msg}\ncalled at #{source}"
end

次に、メソッドを非推奨にするには、メソッド本体 (またはクラスのコンストラクター) に呼び出しを挿入します。

def foo
  deprecate 'prefer bar, will be removed in version 3'
  ...
end

これはかなり宣言的であり、関連情報をログに記録します。私はあまりRubyistではないので、微調整/ YMMVが必要になるかもしれません。

于 2016-06-15T00:46:23.397 に答える