2014-04-19 23 views
5

I często znajduję się robić coś takiego w celu zalogowania wyjście wywołania metoda:Czy istnieje czysty sposób rejestrowania wyniku metody w Groovy?

def someMethod() { 
    def retVal = //stuff 

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

to wydaje się dużo ceremonii Wystarczy zalogować zwracanej wartości metody. Wiem, że mogę używać programowania zorientowanego na aspekt (AOP), aby robić tego rodzaju rzeczy, ale miałem nadzieję, że zrobię to za pomocą właśnie Groovy.

Groovy ma świetną adnotację @Memoize do automatycznego zapamiętywania wywołań metodycznych, więc ma podobny rodzaj adnotacji, aby zrobić to, co robię?

Idealnie, chciałbym się spodziewać czegoś czystego, na przykład:

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

Uwaga 1: Wiem, że mogę korzystać z meta-programowania zawinąć metodę w inny sposób, ale miałem nadzieję, aby móc uczynić go bardziej jednoznaczne z adnotacją

Uwaga 2: Jestem również otwarty na sugestie dotyczące realizacji tego w inny sposób

Odpowiedz

2

ja nie wiem, czy jakikolwiek takie adnotacje, które rejestrowałyby wartość powrotną, istnieją w tym groźnym rdzeniu. Powiedziawszy to, myślę, że powinno być to możliwe przy pewnej transformacji AST. Jeśli postępujesz zgodnie z dokumentem this, ma on nieco podobny wynik, tj. Logi i istnieje w metodzie adnotowanej, ale nie drukuje wartości zwracanej.

Ten blog pokazuje, jak złapać zwróconą wartość pamięci podręcznej, można zamiast tego użyć do logowania. Podejrzewam, że musisz zachować ostrożność, ponieważ zakłada on, że ostatnia instrukcja jest wartością zwracaną, więc jeśli jawnie zwrócisz przed ostatnim stwierdzeniem, może to nie działać. Przypuszczam, że sam tego nie próbowałem.

-2

Możesz użyć adnotacji dziennika z groovy.

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

Rodzina adnotacji @Log wszystko wziąć jeden opcjonalny parametr: nazwę zmiennej dziennika. Domyślnie zmienna dziennika nazywa się "log", ale można ją zmienić na dowolną.

Sztuczka: możesz wstrzyknąć @groovy.util.logging.Slf4j i użyć go jako statycznego finalnego org.slf4j.Logger do swojej klasy i zainicjować go za pomocą @Slf4j (od groovy 1.8). Przydatny do integracji ze strukturą logback.

+0

To nie osiąga tego, o co w ogóle chodzi. Nie chcę jawnie rejestrować wartości 'return' w mojej metodzie, chcę, aby była wykonana przez coś innego. Chodzi o to, aby nadal uzyskać rejestrację, ale zachować ciało metody "czystej" – cdeszaq