8

因为我刚刚在我的代码中实现了 Log4j,所以我正在网上阅读有关横切关注点的信息。有些人说使用 AspectJ 没问题,而另一些人则指出它破坏了函数式编程。那个 mixins 是 Scala 的横切关注点的解决方案。

然而,当我认为我会将一个特征扩展到一个本身不相关的对象/类时,我会感到畏缩。

例如new Database with Logger

这里Logger与 无关Database,但它如何混合以提供日志记录。我更喜欢用 Scala 的方式来做,所以我想知道这就是人们所说的 mixins 的意思。

有人可以向我展示一个如何在 Scala 中进行此操作的快速示例吗?

4

1 回答 1

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

这样做的好处是它非常明确且不言自明(这也是您可能重视或不重视的事情)。

于 2015-04-18T10:50:54.147 回答