我们在一个相当大的 Clojure 代码库上工作,我们遇到了很多这样的问题。
仅为说明,我们的设计是“一切皆映射”,这已经困扰了我们一段时间,并且有如下解决方案可以进行讨论
因此,我们使用 :keys, :strs 进行映射解构
(def my-func [{:keys [a b c] :as z}])
问题是,对于调用者来说,很难知道函数最终从 z 映射中使用了哪些内容(总是可以通过 get
获取比解构更多的内容。更糟的是,my-func 最终 elsewhere 将 z 传递出去,而无需查看 z 所在的所有位置就难以重构代码
而是有以下(命名现在不是很重要)
(def my-func [{:keys-only [a b c] :as z}])
仅从映射中提取 a b c,且 z 仅包含 a b c 键,这意味着函数有一个强有力的约定,说明该函数需要什么。不再有重构挑战