请分享您的观点:2024 Clojure 状态调查!

欢迎!请查看关于页面以了解更多关于它是如何工作的信息。

+1
Refs, agents, atoms

我将一个 JS 库移植到 Clojure(以及潜在的 Clojurescript),我在对本地状态的推理方面感到困难。想象一下,你通过 WebSocket 进行 RPC,服务器的响应取决于它已经发送给你的内容。然后你需要保留服务器回应的本地缓存。

在面向对象的领域中,人们预期你将套接字和缓存封装起来,并提供一个库用户接口,该接口发送 RPC 并透明地处理缓存的填充和从中提取结果。在 Clojure[-script] 中,如何以惯用法进行相同操作?我只是返回一个地图,并期望我的函数将其作为第一个参数接受,返回更新后的状态以及 RPC 结果吗?

2 个回答

0

选择
 
最佳答案

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

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

0
by

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

by
我认为那里的关注点是在我将整个状态返回给库用户存储,例如在应用本地的atom中,那么在库内部透明地管理那些状态就变得相当复杂(例如,在没有由外部API处理的响应下,对websocket关闭进行反应,并透明地重新连接)。在此期间,我发现将库状态在库自己的命名空间内的atom内部化相对容易,但这当然会将RPC客户端限制为恰恰一个"实例"。
by
是的,不需要公开内部状态。如果将状态作为客户端的一部分,这不会限制任何内容。使用有状态转换器时,它不是限制为每次一个实例 - 每次创建转换器时都会创建状态。
欢迎来到Clojure Q&A,您可以在此处向Clojure社区成员提问并获得答案。
...