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

欢迎!请查看关于页面以了解更多有关此内容的信息。

+6
Clojure
编辑

出于文档化的原因,对键的解构是否是好风格?我之所以提出这个问题,是因为cloj-kondo,一个用于Clojure的代码合并器,报告了未使用的绑定。例如:

(let [x 1, y 2] y)

结果警告关于x未经使用。

有时人们做这个

(defn public-foo [{:keys [foo bar] :as x}]
  (private-baz x))

只是为了获得更好的关于public-foo的文档字符串(或生成文档)。但他们将会收到关于foobar被未使用的警告。一个来自野外的例子:链接

解构在性能方面不是免费的,因此使用spec或:arglists可能是获得这些文档优势的更好替代方案。例如:

user=>
(defn public-foo
  {:arglists '([{:keys [foo bar] :as x}])}
  [x]
  ;; (private-baz x)
  )
#'user/public-foo
user=> (doc public-foo)
-------------------------
user/public-foo
([{:keys [foo bar], :as x}])
nil

我在clj-kondo中添加任何配置以压制函数参数中由于键解构而引入的未使用绑定的警告之前,想就此达成共识。

6 答案

+3

我从不只为了文档而进行::keys 的人体解析;你提到的两种替代方案听起来都更好。我经常在不使用它的情况下添加 :as 部分,但我确信在这种情况下没有性能损失。

现在我有我的问题...为什么你不使用符号,比如 {:keys [foo bar]}?我猜这没有区别,但有时候我应该在几年前就开始懂得的小事情像佩里·梅森时刻一样突然显现,所以我必须问问。

我们让关键字工作在那里的一个原因是为了获得自动解析关键字支持(::),但实际上这已经被现在的 :foo/keys 和 ::keys 所取代。所以只使用符号即可。
我养成了这个习惯,是当在一个流行的这种风格的代码库中工作时,没有其他原因。
啊,我用过很多 {:keys [:some/named-keyword :some/other-keyword]},主要是为了让查找更容易 - 即,grep :some/named-keyword会找到完整的版本,但不会找到 {:some/keys [named-keyword]}。这是反感的吗?
不,完全没问题。
0 投票

在这种情况下,我的风格通常是

(defn public-foo [{:keys [foo bar] :as x}]
  (->> (private-baz foo bar)
    (assoc x :res)))
0 投票

我在文档中从未为了arglists而进行解构。

在:keys中使用关键字而非符号极为不妥。

0 投票

我常常在函数声明中使用解构来明确自己的用法。我理解这种做法会让 linting 更难,但如果允许关闭 linting 通知将会是一个很好的功能。

0 投票

我承认这一点,但我不认为这是好做法。

0 投票
头像 答者:

我这样做,我喜欢,但这只是一种观点,这里并没有对错之分。

良好的风格很大程度上取决于观者的角度。谨防任何断言对这种琐事有强烈意见的人。

...