请在2024 Clojure状态调查中分享您的想法!

欢迎!有关如何使用本站的信息,请参阅关于页面。

+1
Refs, agents, atoms

我正在将一个JS库移植到Clojure(和潜在地ClojureScript),我在对局部状态进行推理方面有些棘手。想象一下这样的场景:通过WebSockets进行RPC,服务器的回复取决于它之前已经发送给您的信息。那么,您可能需要保留服务器回复的本地缓存。

在面向对象的世界中,通常会预期将套接字和缓存封装在一起,并向库用户提供一个接口,该接口发送RPC并透明地处理缓存填充和从其中检索结果。您会如何在Clojure[-Script]中实现同样的方法?我是不是应该只返回一个映射,期待我的函数将作为第一个参数接受它,同时返回更新的状态和RPC结果?

2 个答案

0

选中
 
最佳答案

是的,使状态显式,作为参数传递。不要使用全局状态。也不要使用动态变量。也不要假设特定的状态框架,如Integrant或Component。

这样,消费者将拥有最大的灵活性和简单性。

0

你在JavaScript中处理它的方式没有问题。这与任何有状态的转换器工作方式类似。

我的顾虑是,如果我将整个状态返回给库用户存储在例如应用本地的原子中,那么在库内部透明地管理该状态的部分就变得非常复杂(例如,响应WebSocket的关闭并透明地重新连接,而不需要外部API处理)。在这方面,我发现将库状态内部化为库自身命名空间内的原子非常容易,但这当然限制了RPC客户端只能有一个“实例”。
是的,没有必要公开内部状态。如果你将状态作为客户端的一部分,这不会限制任何东西。当你使用状态转换器时,它不限于同时只有一个实例 - 每次创建转换器时都会创建状态。
欢迎使用Clojure问答社区,您可以在此处提问并从Clojure社区成员那里获得答案。
...