我们在一个相当大的 Clojure 代码库上工作,并遇到了这个问题很多次。
以下免责声明,我们的设计是“一切都是一个 map”,因此这个问题困扰了我们相当长的一段时间,并可能对以下解决方案产生争议:
因此,我们有 :keys, :strs 用于解构 map
(def my-func [{:keys [a b c] :as z}])
问题是,对于调用者来说,很难知道最终会从 z map 中使用哪些函数(人们始终可以get
解构中的某种东西。更糟糕的是,my-func 及其他地方仍在传递 z,这使得难以在不经过每个 z 的位置重构代码。
相反,可以使用以下(现在的命名并不重要)
(def my-func [{:keys-only [a b c] :as z}])
它只从 map 中提取了 a b c,并且 z 只包含 a b c 键,这意味着函数有一个强合同,说明此函数需要哪些内容。不再有重构挑战