请分享您的看法,参加2024年Clojure状态调查!

欢迎!请参阅关于页面以了解更多关于其如何工作的信息。

+6
Clojure
编辑

出于文档原因进行键解构是否是一种良好的风格?我之所以提问,是因为clj-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/namespaced-keyword :some/other-keyword]}`,主要是为了更容易找到用法——即使用`:some/namespaced-keyword`进行grep将找到全部的版本,而不是`{:some/keys [namespaced-keyword]}`。这会有问题吗?
没问题,完全没问题。
0
by

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

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

我不会为了文档中的参数列表而进行解构。

在:keys中使用关键字而不是符号很糟糕。

0
by

我经常在函数声明中使用解构来明确自己的使用方式。我理解这种做法会让代码检查更加困难,但我认为这确实是人们会做的事情,如果能关闭关于代码检查的通知,那就更好了。

0
by

我认罪,但我觉得这不是一个好习惯

0

我做这件事,我喜欢它,但这是一个观点,这里没有对错之分。

好的风格在很大程度上取决于观者的感受。提防那些对这种微不足道的事情发表强烈观点的人。

...