2015-04-17 16 views
8

W Ruby (a nawet więcej: Rails) jest to easy to mark methods as deprecated.Jak oznaczyć klasę jako przestarzałą w Ruby?

Ale jak mogę oznaczyć całą klasę jako przestarzałą? Chcę podnieść ostrzeżenie, gdy jest używana klasa:

class BillingMethod 
end 

BillingMethod.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead. 

lub gdy przyzwyczaja się dziedziczenia:

class Sofort < BillingMethod 
end 

Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead. 

Albo, gdy wykorzystywane w zagnieżdżonych klas:

class BillingMethod::Sofort < BillingMethod 
end 

BillingMethod::Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead. 

I pomyślałabym, że to miejsce, w którym należy umieścić takie ostrzeżenie. Czy to właściwe miejsce? A może istnieją lepsze metody?

Odpowiedz

3

Można użyć const_missing aby potępiać stałe, a co za tym idzie, klas.

const_missing jest wywoływany, gdy odwołuje się niezdefiniowana stała.

module MyModule 

    class PaymentMethod 
    # ... 
    end 

    def self.const_missing(const_name) 
    super unless const_name == :BillingMethod 
    warn "DEPRECATION WARNING: the class MyModule::BillingMethod is deprecated. Use MyModule::PaymentMethod instead." 
    PaymentMethod 
    end 
end 

Pozwala to istniejący kod odwołujący MyModule::BillingMethod do dalszej pracy i ostrzega użytkownika o ich używania przestarzałej klasie.

Jest to najlepsze, jakie widziałem do tej pory dla celów deprecjacji klasy.

+0

W twoim przykładzie, w jaki sposób byłby uruchamiany 'const_missing', kiedy zdefiniowałeś go powyżej? – berkes

+0

@berkes pierwsza część nie powinna tam być, literówka –

+0

W metodzie 'const_missing', co dokładnie oznacza' PaymentMethod \ n end'? – berkes

-2

Dlaczego nie zrobić to w ten sposób:

def initialize(*args) 
    warn "DEPRECATION WARNING: ..." 
    super 
end 
+0

Autor chce pokazać ostrzeżenie dotyczące wszystkich zastosowań klas (np. dziedziczenia), nie tylko tworzenie nowych obiektów. – hedgesky

8

Możesz rzucić okiem na Deprecate który jest częścią standardowej biblioteki Ruby:

class BillingMethod 
    extend Gem::Deprecate 

    class << self 
    deprecate :new, "PaymentMethod.new", 2016, 4 
    end 

    # Will be removed April 2016, use `PaymentMethod.new` instead 
    def initialize 
    #... 
    end 
end 

Stosując metodę deprecated spowodowałoby ostrzeżenia jak poniżej:

BillingMethod.new 
# => NOTE: BillingMethod#new is deprecated; use PaymentMethod.new instead. It will be removed on or after 2016-04-01. 
# => BillingMethod#new called from file_name.rb:32. 
+0

To tylko podniesie ostrzeżenia, gdy obiekt zostanie zainicjowany. Nie wtedy, gdy klasa jest używana jako obiekt nadrzędny lub używana w zagnieżdżonym drzewie klas. Czy brakuje mi ważnego szczegółu? – berkes

+0

@berkes Możesz użyć powyższego do wycofania haka 'odziedziczonego' (metoda klasy), tym samym wycofując dziedziczenie:' class BillingMethod; class << self; przestarzałe: dziedziczone,: żadne, 2016, 4; koniec; koniec'. Przejmowanie z BillingMethod powinno teraz generować ostrzeżenie o wycofaniu. – PSkocik

+0

Kod w tym przykładzie jest nieprawidłowy. Ponieważ ': new' jest metodą klasy, musisz zawinąć linie' extend ... deprecate' w bloku 'class << self'. – berkes

Powiązane problemy