我正在网上阅读有关横切关注点的文章,因为我刚刚在代码中实现了Log4j。有些人说使用AspectJ是可以的,而另一些人则指出它破坏了函数式编程。这个混合器是Scala的横切关注点解决方案。
然而,当我认为我会将一个特性扩展到一个与其本身无关的对象/类时,我会畏缩不前。
例如new Database with Logger
在这里,Logger
与Database
无关,而是它如何混合以提供日志记录。我更愿意用Scala的方式来做它,所以我想知道这就是人们所说的mixins的意思。
有人能告诉我如何在Scala中这样做吗?
发布于 2015-04-18 02:50:54
这是一个很大的话题,有很多潜在的“正确”答案。我个人最喜欢的是使用"by name参数“或更高级的函数。
这方面的一个非常简单的例子:
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)
}
这样做的好处是,它是非常明确和不言自明的(同样,这也是你可能重视或不重视的东西)。
https://stackoverflow.com/questions/29713840
复制相似问题