应该使用效果类型对有状态对象进行建模吗?

问题描述 投票:8回答:1

当使用像Scala和cats-effect这样的功能环境时,应该使用效果类型来模拟有状态对象的构造吗?

// not a value/case class
class Service(s: name)

def withoutEffect(name: String): Service =
  new Service(name)

def withEffect[F: Sync](name: String): F[Service] =
  F.delay {
    new Service(name)
  }

构造不是容易犯错的,因此我们可以使用较弱的类型类,例如Apply

// never throws
def withWeakEffect[F: Applicative](name: String): F[Service] =
  new Service(name).pure[F]

我想所有这些都是纯属确定性的。只是不是参照透明的,因为每次生成的实例都是不同的。那是使用效果类型的好时机吗?还是这里会有不同的功能模式?

scala functional-programming scala-cats cats-effect
1个回答
1
投票

在这种情况下,有状态服务指的是什么?

您是说它在构造对象时会产生副作用吗?为此,一个更好的主意是拥有一种在应用程序启动时运行副作用的方法。而不是在构建过程中运行它。

或者也许您是说它在服务内部拥有可变状态?只要内部可变状态没有暴露,就应该可以。您只需要提供一种与服务进行通信的纯(相对透明)方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.