我是 Scala 编程的新手。我现在很困惑如何以异步和函数的方式声明一个 biz 方法,方法实现应该包含许多日志消息。作为一种不好的做法,我这样编写代码:
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Store]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Store] = Kleisli {cfg =>
// some implementation ...
log.info("bla bla bla ...")
// some implementation ...
// return a store
Store(...)
}
}
这很糟糕,因为实现是有副作用的,在这个地方记录一些东西。所以,我像这样更改方法声明:
// trait
trait StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]]
}
// and the interpreter
trait StoreServiceInterpreter extends StoreService {
def create[Config]: Kleisli[Future, Config, Writer[Vector[String], Store]] = Kleisli {cfg =>
// some implementation ...
// log.info("bla bla bla ...")
// some implementation ...
// return a store
Writer(Vector("bla bla bla...", Store(...))
}
}
使用Writer,消除了副作用,但代码不清楚:
- 为什么作家回来了?
Writer[Vector[String], Store]
有比 更多的噪音Store
,有什么办法可以避免样板代码并保持无副作用? - 写入
log
不是临时的!我应该构建一个字符串向量来保存消息,使用:+
或++
操作来添加日志。我认为这不是临时日志记录,就像log.info(...)
在任何地方写一样。