2015-04-18 3 views
7

Ich lese online über cross cutting Bedenken, da ich gerade Log4j in meinen Code implementiert. Einige Leute sagen, mit AspectJ ist in Ordnung, während andere darauf hinweisen, dass es funktionale Programmierung bricht. Diese Mixins sind Scalas Lösung für Querschnittsaufgaben.Wie Cross Scraping betrifft die Scala Weg

Allerdings schaudere ich, wenn ich denke, dass ich ein Merkmal auf ein Objekt/eine Klasse erweitern werde, das nicht selbst verwandt ist.

z.B. new Database with Logger

Hier Logger hat nichts mit Database zu tun, aber seine Mischung zu Protokollierung bereitstellen. Ich würde es lieber auf der Scala machen, also möchte ich herausfinden, dass dies das ist, was Leute von Mixins meinen.

Kann mir bitte jemand ein kurzes Beispiel zeigen, wie man in Scala vorgeht?

Antwort

5

Dies ist ein großes Thema mit vielen möglichen "richtigen" Antworten. Mein persönlicher Favorit würde entweder "by name Parameter" oder Funktionen höherer Ordnung verwenden.

A ein sehr einfaches Beispiel hierfür:

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

die es erlauben würden Sie es anwenden sowohl in einem Objekt, das sich über die Querschnitts Sorge kennt (so etwas wie annotieren einen Methodenaufruf mit etwas in Java Einwickeln):

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

Oder am Aufrufort:

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

Das Schöne daran ist, dass es sehr explizit und selbsterklärend ist (was wiederum Dinge sind, die man hoch bewerten kann oder nicht).

+1

Dies ist das Gleiche wie eine globale Variable in Java. Und würde den Zweck der Abhängigkeitsinjektion negieren. –

+1

Es ist definitiv nicht dasselbe wie eine globale Variable in Java, wenn Sie Abhängigkeiten haben, die Sie in der Querschnittsfunktion verfügbar haben möchten, die Sie als normale oder implizite Parameter an die Cross-Cutting-Methode übergeben können. Es gibt keine Notwendigkeit, sich als Singleton zu registrieren, es wurde nur auf diese Weise gemacht, um das Codebeispiel kurz zu halten (und weil Sie selten einen Logger injizieren würden). – johanandren

+0

fair genug. Ich verstehe jetzt. –