请在2024 年 Clojure 状态调查中分享您的想法!

欢迎!有关该平台如何运作的更多信息,请见关于页面。

+6
Clojure
编辑

为了文档化的原因进行键解构是良好的风格吗?我提问的原因是 clj-kondo(Clojure 的一个 linter)报告了未使用的绑定。例如

(let [x 1, y 2] y)

这导致了一个关于 x 未使用的警告。

有时人们这样做

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

只是为了获得更好文档(或生成文档)的 public-foo。但他们将会收到关于 foobar 未使用的警告。一个 wild 的例子:。

解构在性能方面并不是免费的,因此使用 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]} 呢?我猜这应该没有区别,但有时那些我多年前本应该学会的细微之处,就像佩里·梅森时刻一样突然显现出来,所以我得问一问。

by
我们之所以让关键字在那里工作,是为了得到自动解析关键字支持(::),但实际上这已经被现在有 :foo/keys 和 ::keys 给取代了。所以还是用符号吧。
by
我在一个这种风格普遍存在的代码库中工作时养成了这个习惯,没有其他原因。
by
我对`{:keys [:some/namespaced-keyword :some/other-keyword]}`使用得相当多,主要是为了更容易地查找使用情况——即通过 grep 搜索 `:some/namespaced-keyword` 会找到完整版本,但不会找到 `{:some/keys [namespaced-keyword]}`。这是不被提倡的吗?
by
不,完全没问题。
0
by

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

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

我从不为了文档中的arglists而使用解构。

在:keys中使用关键词而非符号是很粗糙的。

0

我经常在函数声明中解构来明确自己的使用。我理解这种做法会让lint检查更加困难,但我认为这确实是人们会做的事情,而且对于关闭针对这一点的lint通知会有所帮助。

0

我会承认错误,但我不认为这是好的实践。

0

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

好的风格很大程度上取决于观赏者的视角。警惕那些对这种琐事发表强烈意见的人。

...