2012-12-02 18 views
5

Jestem w trakcie przepisywania/refaktoryzacji starszych aplikacji dla klienta z Rails 2.x do 3.x. W ramach refaktoryzacji chcę również odejść od modeli/metod w naszym lokalnym języku do czystej bazy kodu angielskiego.Odradzam cały model w Railsach

Dotyczy to pisania nowych metod dla prawie każdej funkcji. I rozwiązać ten metod wykonując:

def english_method 
    # ... 
end 

def native_method 
    warn 'DEPRECATED, please use #english_method' 
    english_method 
end 

Działa to dobrze dla metod, a pomaga mi śledzić miejsca, gdzie jest nadal używane stara metoda, nie łamiąc żadnego kodu.

Na zajęciach (modelach) jednak robiłem:

class NativeClass < EnglishClass 
    # DEPRECATED, Please use EnglishClass 
end 

class EnglishClass 
    # ... 
end 

ten „dzieła”, ilekroć NativeClass nazywa się aplikacja zachowuje działa, ale nie dostać żadnej wiadomości w dzienniku powiadomienie mnie o części aplikacji, która wciąż wywołuje NativeClass.

Jak mogę się upewnić, że każde "dotknięcie" NativeClass rzeczywiście powoduje zapisanie błędu rejestru?

Próbowałem (bez powodu innego niż myśli "może to działa") zrobić:

class NativeClass < EnglishClass 
    -> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' } 
end 

ale (oczywiście?) Nie działa. Sądzę, że lambda byłaby leniwym ładunkiem za każdym razem, gdy nazywano by to NativeClass, ale moje rozumienie lambdas jest wciąż dość płytkie, więc mogę się pomylić tutaj.

Jakieś wskazówki dotyczące wycofywania całych klas i wysyłania ostrzeżenia do mojego dziennika, gdy jest on dotykany?

Inne "najlepsze praktyki" i lub rozwiązania dotyczące wycofywania są mile widziane, ale nie jestem pewien, czy jest to prawidłowe pytanie dla SO (i nie chcę ryzykować zamknięcia tego tematu na ten temat).

Odpowiedz

2

Lepiej może być po prostu wycofanie każdej metody z osobna. Można to łatwo osiągnąć za pomocą metody wycofania Railsów i przekazując mu listę metod, które chcesz wycofać. Wykaz metod zdefiniowany w klasie jest dostępny przekazując fałszywe public_instance_methods

class NativeClass < EnglishClass 
    def method1 
    end 

    def method2 
    end 

    deprecate *public_instance_methods(false) 
end 

pamiętać, że musi być zadeklarowane po ostatniej metody publicznej.

+0

Faktycznie, ja nie chce potępiać wszystkich metod (jeszcze), ja po prostu chcę potępiać nazwę klasy do teraz. Nadal chcę, aby wszystkie metody pozostały takie same, po prostu chcę ostrzeżenia, gdy metoda jest wywoływana przy użyciu nieaktualnej nazwy klasy. Mógłbym ewentualnie nowy "przestarzały" sposób, który wstawiam do wszystkich innych metod, ale miałem nadzieję na łatwiejsze rozwiązanie. – JeanMertz

4

Spróbuj użyć jak:

class NativeClass < EnglishClass 
    def initialize 
    ActiveSupport::Deprecation.warn "NativeClass is deprecated and may be removed from future releases, use EnglishClass instead.", caller 
    super 
    end 
end 
+0

Problem z tym rozwiązaniem (o ile wiem i przetestowany) jest taki, że metoda initialize jest wyzwalana tylko wtedy, gdy utworzę nowy obiekt klasy. Jeśli wywołasz metody na samej klasie lub na stałych zdefiniowanych w klasie, nie zostanie ona wywołana. – JeanMertz