2015-04-18 11 views
7

Я читаю онлайн о проблемах с перекрестными сокращениями, так как я только что внедрил Log4j в свой код. Некоторые люди говорят, что использование AspectJ в порядке, в то время как другие указывают на то, что он нарушает функциональное программирование. Эти миксины являются решением Scala для решения задач перекрестной резки.Как справиться с перекрестными проблемами относится к способу Scala

Однако я сжимаю, когда думаю, что я продолжу черту к объекту/классу, который не связан с самим собой.

например. new Database with Logger

Здесь Logger не имеет никакого отношения к Database, но его как смешивать для обеспечения регистрации. Я бы предпочел сделать это с помощью Scala, поэтому я хочу узнать, что это значит для миксинов.

Может кто-нибудь, пожалуйста, покажите мне быстрый пример того, как это сделать в Скале?

ответ

5

Это большая тема с множеством потенциальных «правильных» ответов. Мой личный фаворит будет использовать либо «по параметрам имени», либо функции более высокого порядка.

Аа очень простой пример этого:

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

, которые позволили бы применять его как в объекте, который сам знает о Сквозной озабоченности (что-то вроде аннотирования обертывания вызова метода с чем-то в Java):

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

Или на месте вызова:

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

Приятно то, что это очень явное и понятное объяснение (которые, опять же, вещи, которые вы могли бы оценить высоко или нет).

+1

Это то же самое, что и глобальная переменная в Java. И будет отрицать цель инъекции зависимости. –

+1

Это определенно не то же самое, что глобальная переменная в Java, если у вас есть зависимости, которые вы хотите использовать в перекрестном решении, вы можете передать их как обычные или неявные параметры для метода сквозной резки. Нет ничего обязательного, чтобы Logging был singleton, это было сделано только таким образом, чтобы сделать пример кода кратким (и потому, что вы редко вводили регистратор). – johanandren

+0

достаточно справедливо. Теперь я понимаю. –