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

(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符号,而不必加载命名空间。
...