回答:
ほとんどの場合、ライブラリまたはメタプログラミングに依存して非推奨にするのはやりすぎです。コメントを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を使用している場合、ドキュメントのコメントは次のようになります。
# @deprecated Please use {#useful} instead
最後に、tomdocを使用する場合は、コメントを次のようにします。
# Deprecated: Please use `useful` instead
非推奨:メソッドが非推奨であり、将来のバージョンで削除されることを示します。これを使用して、パブリックであったが次のメジャーバージョンで削除されるメソッドを文書化する必要があります。
また、将来の(そして適切にサーバー化された)リリースで非推奨のメソッドを削除することを忘れないでください。Javaライブラリが行ったのと同じ間違いをしないでください。
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.
このアプローチを使用すると、呼び出しが行われた場所に関する無料の情報が得られることに注意してください。
0
数値リテラルの先頭は、それを8進数にするため、削除する必要があります。
deprecate :initialize, UseThisClassInstead, 2017, 5
意地悪になりたい場合(役立つという名目で)、警告中にコールスタックの最初の行を出力して、非推奨の呼び出しを使用している場所を開発者に知らせることができます。
これは、パフォーマンスヒットになると確信しているためです。
warn Kernel.caller.first + " whatever deprecation message here"
正しく使用すると、非推奨の呼び出しが使用されたファイルと行への絶対パスが含まれます。Kernel :: callerの詳細については、こちらをご覧ください。
ActiveSupportの使用:
class Player < ActiveRecord::Base
def to_s
ActiveSupport::Deprecation.warn('Use presenter instead')
partner_uid
end
end
警告は本番環境ではデフォルトでオフになっています
次のActiveSupport::Deprecation
ように使用することもできます(バージョン4.0以降で利用可能)。
require 'active_support/deprecation'
require 'active_support/core_ext/module/deprecation'
class MyGem
def self.deprecator
ActiveSupport::Deprecation.new('2.0', 'MyGem')
end
def old_method
end
def new_method
end
deprecate old_method: :new_method, deprecator: deprecator
end
MyGem.new.old_method
# => DEPRECATION WARNING: old_method is deprecated and will be removed from MyGem 2.0 (use new_method instead). (called from <main> at file.rb:18)
あなたは持っています 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
クラスマクロパターンを使用して、次のように記述できます。
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
私は軽量のメソッドを一緒に投げることになりました:
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が必要になるかもしれません。
内部マクロメソッドを使用できます。例:
class Foo
def get_a; puts "I'm an A" end
def get_b; puts "I'm an B" end
def get_c; puts "I'm an C" end
def self.deprecate(old_method, new_method)
define_method(old_method) do |*args, &block|
puts "Warning: #{old_method} is deprecated! Use #{new_method} instead"
send(new_method, *args, &block)
終わり終わり
deprecate:a、:get_a deprecate:b、:get_b deprecate:c、:get_c end
o = Foo.new p oa