programing

루비에서 사용되지 않는 코드를 표시하는 모범 사례?

jooyons 2023. 6. 4. 10:30
반응형

루비에서 사용되지 않는 코드를 표시하는 모범 사례?

사용하는 사람들이 쉽게 코드를 확인하고 따라잡을 수 있도록 사용하지 않는 메소드를 표시하고 싶습니다.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

반응형