我们在一个相当大的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 键,这意味着函数有一个明确的合约,说明了该函数需要什么。不再有重构挑战。