Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以Scala方式处理横切关注点_Scala_Aop_Scala 2.10_Cross Cutting Concerns - Fatal编程技术网

如何以Scala方式处理横切关注点

如何以Scala方式处理横切关注点,scala,aop,scala-2.10,cross-cutting-concerns,Scala,Aop,Scala 2.10,Cross Cutting Concerns,由于我刚刚在代码中实现了Log4j,所以我正在网上阅读有关横切关注点的文章。一些人说使用AspectJ是可以的,而另一些人则指出它破坏了函数式编程。mixin是Scala针对交叉关注点的解决方案 然而,当我认为我会将一个特性扩展到一个本身不相关的对象/类时,我会退缩 e、 g.带有记录器的新数据库 这里的记录器与数据库无关,而是如何混合提供日志记录。我更喜欢用Scala的方式,所以我想知道这就是人们所说的mixin 有人能给我举一个如何在Scala中实现这一点的快速例子吗?这是一个有很多潜在“正

由于我刚刚在代码中实现了Log4j,所以我正在网上阅读有关横切关注点的文章。一些人说使用AspectJ是可以的,而另一些人则指出它破坏了函数式编程。mixin是Scala针对交叉关注点的解决方案

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

e、 g.
带有记录器的新数据库

这里的
记录器
数据库
无关,而是如何混合提供日志记录。我更喜欢用Scala的方式,所以我想知道这就是人们所说的mixin


有人能给我举一个如何在Scala中实现这一点的快速例子吗?

这是一个有很多潜在“正确”答案的大主题。我个人最喜欢使用“按名称参数”或更高阶函数

一个非常简单的例子:

object Logging {
  def logCall[T](name: String)(block: => T): T = {
    log.info(s"Invoking: $name")
    block
  }
}
这将允许您将其应用于本身了解横切关注点的对象中(类似于用java中的某些东西注释包装方法调用):

或在呼叫站点:

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

这样做的好处是,它非常明确和自解释(这也是您可能看重或不看重的东西)。

这与在Java中使用全局变量相同。并且会否定依赖项注入的目的。这与在Java中使用全局变量完全不同,如果您希望在横切关注点中使用依赖项,则可以将它们作为常规或隐式参数传递给横切方法。没有要求日志记录是单例的,这样做只是为了使代码示例简短(因为您很少插入日志记录程序)。
import Logging._
def businessLogic() {
  val user = ???
  val result = logCall("insert user")(DB.insert(user))
  println(result)
}