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

欢迎!请参阅关于页面了解有关这个平台的一些更多信息。

+6

出于文档目的,使用键式解构是否是良好的风格?我这么问的原因是,clj-kondo(Clojure 的一个代码检查器)报告了未使用绑定的警告。例如:

(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 添加配置以抑制函数参数中键式解构引起的未使用绑定的警告之前,我希望有一些共识。

6 答案

+3

我从不为了文档目的而解构:keys;您提到的替代方案听起来都好。我经常添加不带使用的:as部分,但我确信在这种情况下没有性能损失。

现在我有一个自己的问题...为什么你不使用符号,比如 {:keys [foo bar]}?我猜它们没有区别,但是有时候我应该在多年前学到的细微之处,就像佩里·梅森时刻一样显现出来,所以我还是得问。

我们之所以让关键词在那里工作,只有一个原因是为了获得自动解析关键词支持(::),但实际上这个支持已被现在的 :foo/keys 和 ::keys 所取代。所以直接使用符号即可。
我在一个普遍采用这种风格的代码库工作时养成了这个习惯,没有其他原因。
我一直在使用 `{:keys [:some/namespaced-keyword :some/other-keyword]}`,主要是为了更容易找到使用情况——比如使用 `:some/namespaced-keyword` 可以找到完整版本,而不能使用 `{:some/keys [namespaced-keyword]}`。这是不是会被反感?
不,完全没有问题。
0

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

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

我不会出于文档中arglists的原因而进行解构。

在:keys中用关键字代替符号是非常糟糕的。

0

我在函数声明中经常进行解构以澄清我的用法。我知道这种做法会使lint检查变得更困难,但我认为这是人们会做的事情,有一个可以关闭lint通知的旋钮将会很方便。

0

我会承认错误,但不认为这是好做法

0

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

好的风格在很大程度上取决于个人的看法。警惕那些对这类小事持有强烈观点的人。

...