gpt4 book ai didi

scala - 使用功能方式处理日志消息的最佳实践是什么

转载 作者:行者123 更新时间:2023-12-02 03:03:13 27 4
gpt4 key购买 nike

我是 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 有更多噪音,有什么办法可以避免样板代码并保持无副作用?
  • Write log 不是临时的!我应该构建一个字符串向量来保存消息,使用 :+++ 操作来添加日志。我认为这不是临时日志记录,就像在任何地方写 log.info(...) 一样。

最佳答案

为方便起见,我认识的大多数 Scala 开发人员都倾向于将日志记录视为“无副作用”。但是,如果你真的想跟踪它们,你可能想看看“free monad”的概念。更多信息: general description , example with logging .

我的粗略解释是“让我们将我们的程序建模为一些 AST 并对其进行解释”。因此,在 AST 中,您定义了一个“日志记录”的概念,而不是稍后在解释中出现的实现。这种方法允许您关注日志记录并更改操作(从写入/dev/null 到异步发布到外部服务),而不会影响代码的“业务”部分。

关于scala - 使用功能方式处理日志消息的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44493719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com