2014-04-19 16 views
5

Spesso mi ritrovo a fare qualcosa di simile, al fine di registrare l'uscita di una chiamata di metodo:Esiste un modo pulito per registrare il risultato di un metodo in Groovy?

def someMethod() { 
    def retVal = //stuff 

    log.debug("The return value is: $retVal") 
    retVal 
} 

Questo mi sembra un sacco di cerimonia per registrare solo il valore di ritorno del metodo. So che posso usare Aspect Oriented Programming (AOP) per fare questo genere di cose, ma speravo di farlo solo con Groovy.

Groovy ha l'ottima annotazione @Memoize per le chiamate al metodo di auto-memoize, quindi ha un tipo di annotazione simile a @LogReturn per fare ciò che sto cercando?

Idealmente, mi sarei aspettato qualcosa di pulito, come questo:

@LogReturn("debug") 
def someMethod() { 
    // Stuff 
} 

Nota 1: so che potrei utilizzare meta-programmazione per avvolgere il metodo in un altro metodo, ma speravo di essere in grado di rendere più esplicito con un'annotazione

Nota 2: sono anche aperti ai suggerimenti per realizzare questo in un modo diverso

risposta

2

non so se del caso tali annotazioni che registrano il valore di ritorno esistono nel core groovy. Detto questo, penso che dovrebbe essere possibile con alcune trasformazioni AST. Se si segue il documento this, esso ha una voce in qualche modo simile ai registri e esiste per il metodo annotato ma non stampa il valore restituito.

Questo blog mostra come catturare il valore restituito per la memorizzazione nella cache, è invece possibile utilizzarlo per la registrazione. Sospetto che sia necessario prestare attenzione poiché ciò presuppone che l'ultima istruzione sia un valore di ritorno, quindi se si restituisce esplicitamente prima dell'ultima dichiarazione, ciò potrebbe non funzionare. Questa è solo la mia ipotesi, non l'ho mai provato.

-2

È possibile utilizzare l'annotazione del registro con groovy.

@groovy.util.logging.Log 
    class Person { 
     def method() { 
     ... 
     log.fine(runLongDatabaseQuery()) 
     } 
    } 
    new Person().method() 

La @Log famiglia di annotazioni tutti prendono un parametro opzionale: il nome della variabile di registro. Di default la variabile di registro è chiamata 'log', ma puoi cambiarla in qualunque cosa tu voglia.

Trucco: è possibile iniettare @groovy.util.logging.Slf4j e utilizzarlo come un org.slf4j.Logger finale statico nella classe e inizializzarlo utilizzando @Slf4j (da Groovy 1.8). Utile per l'integrazione con il framework di logback.

+0

Questo non raggiunge affatto quello che sto cercando. Non voglio dover registrare esplicitamente il valore 'return' del mio metodo, voglio che sia fatto da qualcos'altro. L'obiettivo è di ottenere ancora il logging, ma mantenere il corpo del metodo "puro" – cdeszaq

Problemi correlati