루비에서 사용되지 않는 코드를 표시하는 모범 사례?
사용하는 사람들이 쉽게 코드를 확인하고 따라잡을 수 있도록 사용하지 않는 메소드를 표시하고 싶습니다.Java에서 @Descommated를 설정하면 모든 사람이 이것이 무엇을 의미하는지 알고 있습니다.
그렇다면 루비에서 더 이상 사용되지 않는 것을 표시하고 확인할 수 있는 선호되는 방법(또는 도구)이 있습니까?
거의 모든 경우에, 사용하지 않는 라이브러리나 메타프로그래밍에 의존하는 것은 과도한 살인입니다.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
사용되지 않음:메서드가 더 이상 사용되지 않으며 이후 버전에서 제거됨을 나타냅니다.이를 사용하여 공용이지만 다음 주 버전에서 제거될 메서드를 문서화해야 합니다.
또한 일부 미래 릴리스(및 적절한 semver'd)에서 사용되지 않는 메서드를 제거하는 것을 잊지 마십시오.Java 라이브러리와 동일한 실수를 범하지 마십시오.
Ruby Standard Library에는 경고 논리가 포함된 모듈이 있습니다. 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.
이 접근 방식을 사용하면 상담이 진행된 장소에 대한 무료 정보를 얻을 수 있습니다.
사용.ActiveSupport:
class Player < ActiveRecord::Base
def to_s
ActiveSupport::Deprecation.warn('Use presenter instead')
partner_uid
end
end
경고는 기본적으로 프로덕션 환경에서 해제되어 있습니다.
만약 당신이 (도움이 된다는 핑계로) 심술궂게 굴고 싶다면, 당신은 경고 중에 콜 스택의 첫 번째 줄을 출력하여 그들이 어디에서 더 이상 사용하지 않는 콜을 사용하고 있는지를 개발자들에게 알릴 수 있습니다.
이것은 제가 그것이 성능에 타격을 줄 것이라고 꽤 확신하기 때문에 비열한 것입니다.
warn Kernel.caller.first + " whatever deprecation message here"
올바르게 사용하면 사용되지 않는 호출이 사용된 파일 및 회선에 대한 절대 경로가 포함됩니다.커널::caller에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
사용할 수도 있습니다.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)
당신은 가지고 있습니다 (2010-2012, 2015년 루비젬에서 더 이상 사용할 수 없습니다).
사용되지 않는 코드로 작업하는 개발자를 지원하기 위한 작은 라이브러리입니다.
이 아이디어는 '에서 비롯되었습니다.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
레일을 사용할 때 Module#deprecate 방법이 있습니다.
캐니베테는 당신이 간단하고 우아한 방식으로 당신의 방법을 경시할 수 있게 해주는 보석입니다.여기서 그것에 대해 조금 더 알아보겠습니다.
저는 결국 가벼운 방법을 생각해냈습니다.
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
이는 상당히 선언적이며 관련 정보와 함께 로깅을 제공합니다.저는 루비스트를 잘 못해서 수정/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)
끝단
사용 안 함 :a, :get_a 사용 안 함 :b, :get_b 사용 안 함 :c, :get_cend
o = Foo.new PO.a
언급URL : https://stackoverflow.com/questions/293981/best-practice-to-mark-deprecated-code-in-ruby
'programing' 카테고리의 다른 글
| 각도에서 ngDefaultControl이란 무엇입니까? (0) | 2023.06.04 |
|---|---|
| XAML에는 디버그 모드에 대한 조건부 컴파일러 지시문이 있습니까? (0) | 2023.06.04 |
| 아이템을 유지하는 방법새로 인스턴스화된 스피너에 대한 발사에서 선택되었습니까? (0) | 2023.06.04 |
| Ruby에서 STDIN을 사용한 모범 사례? (0) | 2023.06.04 |
| 코코아 포드가 macOS High Sierra에서 작동하지 않음 (0) | 2023.06.04 |