2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解有关如何操作的更多信息。

+1 投票
Clojure

我们在一个相当大的 Clojure 代码库上工作,并且遇到了很多这类问题。

免责声明,我们的设计理念是“一切皆图”,因此这个问题困扰了我们很长时间,拥有如下所示这样的解决方案可能存在争议

因此,我们使用了 :keys 和 :strs 来解构一个图

(def my-func [{:keys [a b c] :as z}])

问题是,对于调用者来说,很难知道函数最终从 z 图中使用了什么(总是可以 get 一些比解构出的更多的内容。更糟糕的是,my-func 将在别处传递 z,这使得没有遍历 z 所在的所有地方就无法重构代码

相反,我们可以这样操作(现在暂不关心命名)

(def my-func [{:keys-only [a b c] :as z}])

它只从图中提取出 a b c 键,这意味着函数有一个明确的协议说明需要什么。不再有重构挑战

4 个答案

+1 投票
by

您可以使用只命名空间键(但这需要适当的解析进行搜索),以增强对代码库的搜索的严谨性。

与 select-keys 一样,删除键似乎是一种武断的工具。

如果您的首要目标是控制所有围绕数据流的事项,您可以考虑将数据处理置于类似棱镜图(或其他是否是管道?)的监督之下。您需要的不仅仅是图/管道,但您已经明白了,可以创建自己的设施以适应需求。作为麻烦的回报,您不仅能够获得“执行”,还可以获得有用的报告,比如x未使用,或者自动排序处理步骤以产生可能的输出子集。

+1 投票

仅仅移除:as z是否可行?您无法解构不拥有的东西。 ;)

在某些情况下这当然可行 :)
0

您尝试使用spec了吗?





有更好的方法吗?
–2

我的规则是不允许使用 :as

虽然你可以设置的更严格(尽管我想可以使用 linter 实现这个功能)。但这是我所遵循的指导方针,以避免你提到的具体情况。

如果有一个 :keys-only 的选项,你同样不能真正强制实行。话虽如此,我个人还是喜欢这个想法,所以我给你点了赞。

我认为禁止使用:as 是一个更简单的解决方案。因为有那么多种解构形式,你需要为每一种形式都设置一个 “only” 变体。

或许,不应该有:keys-only,而是有一个:as-only 或者类似的选项,或许最好叫它:into。因为这样就会适用于所有解构类型。
...