如何处理横切关注Scala方式

时间:2015-04-18 06:35:26

标签: scala aop scala-2.10 cross-cutting-concerns

我正在网上阅读关于横切问题,因为我刚刚将Log4j实现到我的代码中。有些人说使用AspectJ是可以的,而其他人则指出它打破了函数式编程。这些混合物是Scala针对交叉问题的解决方案。

然而,当我想我会将一个特征扩展到一个与其无关的对象/类时,我感到畏缩。

e.g。 new Database with Logger

此处LoggerDatabase无关,但与混合提供日志记录有关。我更喜欢Scala方式,所以我想知道这是mixins的意思。

有人可以告诉我一个如何在Scala中进行此操作的简单示例吗?

1 个答案:

答案 0 :(得分:5)

这是一个很有潜力的大话题,#14;正确"答案。我个人最喜欢的是使用"名称参数"或更高阶函数。

一个非常简单的例子:

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)
}

这件好事就是它非常明确且不言自明(这也是你可能重视或不重视的事情)。