2015-04-18 14 views
7

Czytam online o zagadnieniach przekrojowych, ponieważ właśnie zaimplementowałem Log4j w moim kodzie. Niektórzy mówią, że używanie AspectJ jest w porządku, podczas gdy inni wskazują, że łamie funkcjonalne programowanie. Te mixiny są rozwiązaniem firmy Scala dla zagadnień przekrojowych.Sposób obsługi przekrojów dotyczy sposobu Scala

Jednak wzdrygam się, gdy myślę, że rozciągnę cechę na obiekt/klasę, która nie jest z sobą powiązana.

np. new Database with Logger

Tutaj Logger nie ma nic wspólnego z Database, ale jest sposobem mieszania w celu zapewnienia rejestrowania. Wolałbym zrobić to w Scali, więc chcę się dowiedzieć, co ludzie rozumieją przez mixins.

Czy ktoś może pokazać mi szybki przykład, jak to zrobić w Scali?

Odpowiedz

5

To jest duży temat z wieloma potencjalnymi "poprawnymi" odpowiedziami. Moim osobistym faworytem byłoby używanie "parametrów według nazwy" lub funkcji wyższego rzędu.

A a bardzo prostym przykładem:

object Logging { 
    def logCall[T](name: String)(block: => T): T = { 
    log.info(s"Invoking: $name") 
    block 
    } 
} 

co pozwoliłoby na zastosowanie go zarówno w obiekcie, który sam nie wie o wzajemnej troski tnącej (coś jak adnotacji owijania wywołanie metody z czymś w java):

class DB { 
    import Logging._ 
    def insert(item: Something) = logCall("insert") { 
    ??? 
    } 
} 

Albo w miejscu połączenia:

import Logging._ 
def businessLogic() { 
    val user = ??? 
    val result = logCall("insert user")(DB.insert(user)) 
    println(result) 
} 

Fajną rzeczą jest to, że jest bardzo wyraźna i nie wymaga wyjaśnień (które znowu są wartościami, które można wysoko lub nie).

+1

Jest to to samo, co zmienna globalna w języku Java. I zanegowałoby cel zastrzyku zależności. –

+1

To zdecydowanie nie jest to samo, co posiadanie zmiennej globalnej w Javie, jeśli masz zależności, które chcesz być dostępne w kwestii przekrojów, możesz przekazać je jako zwykłe lub niejawne parametry do metody przekrojowej. Nie ma nic wymogu Logując się na singleton, zrobiono to tylko w ten sposób, aby krótki przykład kodu był krótki (i ponieważ, ponieważ rzadko wprowadzasz rejestrator). – johanandren

+0

wystarczająco fair. Teraz rozumiem. –

Powiązane problemy