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

欢迎!有关本站工作原理的更多信息,请参阅关于页面。

0
Clojure
重标记

在大型代码库和团队中,可能会出现不同的人用不同的别名来 'require' 命名空间。

h.clj
(ns hello.core)

f.clj
(ns foo.core
    (:require [hello.core :as hc]))

b.clj
(ns bar.core
    (:require [hello.core :as h]))

如果您看到,我参与过的大型项目往往会有不同的别名来引用同一命名空间,尽管我们仍然保持着一些约定。这是人类的一个缺点,在更大的团队中,这往往会导致出错。这使得使用grep等简单工具来查找命名空间和其中函数的用法变得更加困难(例如上面的情况下使用hc/some-funch/some-func

我想提议的是在每个ns宏中添加一些东西,比如

(ns hello.core :default-alias <my-alias>)

在wherever这个ns被require时

(ns foo.core 
    (:require [hello.core :default-alias])

我们可以自动获得一个<my-alias>来引用命名空间,这样我们就可以做<my-alias>/some-func

这将导致代码的一致性,并在语言级别上执行
我认为这可以通过在命名空间中存储某种类型的元数据来实现

2 个答案

+6

已选中
 
最佳答案

您可以使用 clj-kondo 中的 :consistent-alias 编译器来强制实施此类一致性

https://github.com/borkdude/clj-kondo/blob/master/doc/config.md#alias-consistency

太棒了!延续一下,为 clj-kondo 添加用户配置是否可能?例如,我想设定跨项目默认值?或者建立团队间的规范?
用户配置并未被设计支持。您可以在设计原则第 5 条中了解更多信息:https://github.com/borkdude/clj-kondo/blob/master/doc/dev.md
如果这对您来说很重要,我建议您只写一个小型的模板脚本/lein 模板/clj 新模板,它只会复制您的配置。
+1 投票

您好,感谢您的建议,这是我以前没见过的。

我认为这个建议的一个缺点是别名会“从天而降”,这本身就有它的问题。我的意思是,这当然是这个建议的要点之一,但只是在查看特定的消费命名空间时,如果不找到和解决所有的引用命名空间,就不知道别名指向哪里。

无论如何,我们不想给 ns 宏或命名空间系统添加任何额外的复杂性,因此我认为不太可能添加这样的功能。

by
是的,我也担心过“从天而降”的问题 :)

无论如何,我会至少在我的 Clojure 分支中亲自尝试一下
by
与此相关的问题还包括

如果源命名空间出于任何原因更改了默认别名,所有使用该别名的消费代码都将中断。

如果两个命名空间恰好拥有相同的默认别名,并且您尝试同时导入它们,您将遇到冲突。

依赖静态代码检查的所有工具将不知道 (hc/greet) 是什么 —— 目前它们看到 :as hc 别名,可以“解析”hc/greet 符号而不需要加载命名空间。
...