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