2012-12-02 11 views
5

Sono in procinto di riscrivere/refactoring un'applicazione legacy per un client da Rails 2.x a 3.x. Come parte del refactoring voglio anche passare da modelli/metodi nella nostra lingua locale a un puro codice base inglese.Obsoleto dell'intero modello in Rails

Ciò comporta la scrittura di nuovi metodi per quasi tutte le funzionalità. Risolvo questo per i metodi da fare:

def english_method 
    # ... 
end 

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

Questo funziona bene per i metodi, e mi aiuta a monitorare i luoghi in cui è ancora in uso il vecchio metodo, senza rompere alcun codice.

per le classi (modelli), tuttavia, ho fatto:

class NativeClass < EnglishClass 
    # DEPRECATED, Please use EnglishClass 
end 

class EnglishClass 
    # ... 
end 

Questa "opere", ogni volta che NativeClass si chiama, l'applicazione continua a lavorare, ma non ho ricevuto alcun messaggio nel registro comunicandomi una parte dell'applicazione che chiama ancora NativeClass.

Come posso essere sicuro che ogni "tocco" di NativeClass porti effettivamente alla scrittura di un errore di registro?

ho provato (per nessuna ragione altro che pensare "forse questo funziona") per fare:

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

Ma questo (ovviamente?) Non ha funzionato. Immagino che lambda sarebbe pigro carico ogni volta che si chiama NativeClass, ma la mia comprensione di lambda è ancora un po 'superficiale, quindi potrei sbagliarmi qui.

Eventuali indizi su come deprecare intere classi e inviare un messaggio di avviso al mio registro quando viene toccato?

Altre "best practice" e/o soluzioni per la deprecazione sono benvenute, ma non sono sicuro che sia una domanda valida per SO (e non voglio rischiare che questo argomento venga chiuso per questa domanda).

risposta

2

Si potrebbe stare meglio solo deprecando ogni metodo singolarmente. Questo può essere facilmente realizzato usando il metodo deprecate di Rails e passandogli una lista di metodi che vuoi deprecare. L'elenco dei metodi definiti all'interno di una classe è disponibile passando falso public_instance_methods

class NativeClass < EnglishClass 
    def method1 
    end 

    def method2 
    end 

    deprecate *public_instance_methods(false) 
end 

Nota che ha bisogno di essere dichiarato dopo l'ultimo metodo pubblico.

+0

In realtà, io non voglio disapprovare tutti i metodi (appena ancora), voglio solo deprecare il nome della classe per ora. Quindi voglio ancora che tutti i metodi rimangano gli stessi, voglio solo avvertirmi quando il metodo viene chiamato usando il nome della classe deprecato. Potrei forse un nuovo metodo 'deprecate' che inserisco in tutti gli altri metodi, ma speravo in una soluzione più semplice. – JeanMertz

4

tenta di utilizzare come:

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

Il problema con questa soluzione (per quanto ne so e testato) è che il metodo di inizializzazione viene attivato solo se creo un nuovo oggetto di classe. Se chiamo metodi sulla classe stessa o su costanti definite nella classe, questo non viene attivato. – JeanMertz