2024 状态 Clojure 问卷 中分享您的想法!

欢迎!请参阅 关于 页面了解更多此功能的信息。

+1
引用、代理、原子

我正在将一个 JS 库移植到 clojure(以及可能 cljs),我在考虑本地状态方面遇到了困难。设想一个场景,您通过 WebSocket 进行 RPC,服务器回复的内容取决于已经发送给您的服务器内容。那么您将要保留一个本地的服务器回复缓存。

在面向对象的世界中,您应该封装套接字和缓存,并为库用户提供一个接口,该接口发送 RPC 并透明地处理缓存填充和从缓存中获取结果。那么在 clojure[-script] 中,什么是做同样事情的惯用方法?我只需要返回一个映射,并期望我的函数将其作为第一个参数,返回更新后的状态以及 RPC 结果吗?

2 个答案

0

被选中
 
最佳答案

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

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

0

你用JS处理这个问题的方式没有问题。它类似于例如任何有状态的转换器的运作方式。

我猜我担心的是,如果我将整个状态返回给库用户存储在例如应用局部atom中,那么在库内部透明地管理该状态的部分就变得非常复杂(例如,在WebSocket关闭时反应并在透明地重新连接,而无需由外部API处理)。在这方面,我发现将库状态包子到库自己的命名空间中的atom内部化相当简单,但这当然限制了RPC客户端只能有“一个实例”。
是的,不需要暴露内部的状态。如果将其作为客户端的一部分,这不会限制任何事情。当你使用有状态的转换器时,它不仅仅限制于一个实例 - 每次创建转换器时都会创建状态。
...