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,而 z 只包含了 a b c 键,这意味着函数有一个明确的合约,说明了该函数需要什么。不再有重构挑战。

4 个答案

+1 投票

您可以使用仅限命名空间的关键字,以提高代码库中搜索的严谨性(但您需要以适当的解析进行搜索)。

类似select-keys的键的移除就像是件粗制的工具。

如果你的主要目标是控制所有与数据流动相关的事务,你可以考虑将数据处理置于类似辉石图(或管道?)的监管之下。你所需要的不完全是图形/管道,但你已经明白了,可以自己创建适合的设施。作为烦恼的回报,你不仅能获得“执行”,还能获得诸如“x未使用”等有用的报告,或者自动排序处理步骤以生成可能的输出子集。

+1 投票

简单地移除:as z可行吗?如果没有,你无法解构你拥有的东西。 ;)

当然,在少数情况下是可行的 :)
0

你试过使用spec吗?

我确实检查过spec。我原本期望这是语言结构而不是库。此外,我并没有深入研究spec,所以我不知道如何实现上述功能?我可以想到的一种方法是

  (def my-func [m] (let [m (s/conform :spec m)])

有没有更好的方法?
–2
by

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

虽然可能可以通过代码检查器强制限制(尽管我想这应该可行),但这是一种我遵循的指导原则,以避免你正在讨论的情况。

如果使用了:keys-only,这也有点类似,实际上你也很难强制实施。尽管如此,我个人认为这是一个好主意,所以给你点了赞。

by
我认为禁止使用:as是一个更简单的解决方案。因为解构有太多的形式,你需要为它们提供"only"变体。

也许更合适的做法不是有:keys-only,而是有:as-only或其他类似名称,也许最好叫:into,因为这适用于所有解构类型。
...