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>)

在其被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宏或命名空间系统增加额外的复杂性,所以我认为我们不太可能添加这样的功能。

是的,我也担心“突然出现”的问题 :)。

无论如何,我将尝试在Clojure分叉中实现这一点。
这个问题还有其他方面

如果源命名空间因任何原因更改了默认别名,所有消费代码都会出错。

如果有两个命名空间恰好有相同的默认别名,并且您尝试同时导入它们,则会发生冲突。

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