2024 状态 Clojure 问卷 中分享您的想法!

欢迎!请参阅 关于 页面以获取更多关于此如何工作的信息。

+6
Clojure
编辑

使用 keys 解构用于文档化理由是否是好的风格?我提问的原因是 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 未使用的警告。野生动物中的例子:[链接](https://github.com/cljdoc/cljdoc/blob/d54cb58b20d2b4cb1e7c714b3637aa8b89956ce0/src/cljdoc/server/ingest.clj#L16)

解构不是免费的,在 性能 上,所以使用 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 中添加配置以抑制由函数参数中的 keys 解构引起的未使用绑定的警告之前,我想要达成一些共识。

6 答案

+3

我从不会仅为了文档将 :keys 解构;您提到的替代方案听起来都很好。我经常添加 :as 部分,即使我不使用它,但我确信在那种情况下没有任何性能损失。

现在我有了一个自己的问题...为什么你不使用符号,比如 {:keys [foo bar]}呢?我猜它们之间没有区别,但有时候,我应该在几年前就已经知道的小事情,就像一个佩里·梅森时刻(Perry Mason moment)一样突然浮现出来,所以我得问问。

我们之所以让关键词在那里起作用,只有一个原因,那就是为了得到自动解析关键词支持 (::),但现在这已经主要被 :foo/keys 和 ::keys 淘汰了。所以只能使用符号。
我在一个普遍使用这种风格的代码库工作时养成了这个习惯,没有其他原因。
啊,我一直在大量使用 `{:keys [:some/namespaced-keyword :some/other-keyword]}`,主要是为了让其 easier to find usages - 即使用 `:some/namespaced-keyword` 来 grep 将会找到完整的版本,但不会找到 `{:some/keys [namespaced-keyword]}`。这样做没问题吧?
绝对没问题。
0 投票

我当时的风格通常是这样的

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

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

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

0 投票

我经常在函数声明中使用解构来澄清我的用法。我明白这种做法会使代码审查更加困难,但我认为人们确实会这样做,如果有一个开关可以关闭关于审查通知的话那就更好了。

现在clj-kondo支持了这一点:[链接](https://github.com/borkdude/clj-kondo/blob/master/doc/config.md#exclude-unused-bindings-from-being-reported)
0 投票

我认罪,但我认为这不是一个好的做法。

0 投票

我这样做,我喜欢,但这只是个人观点,没有对错之分。

好风格很大程度上取决于个人看法。当心那些对这种琐事发表强烈观点的人。

...