何时使用别名以及何时使用:请参阅Clojure/ClojureScript:require?

MJV*_*MJV 3 clojure clojurescript

当使用:requireClojure中或ClojureScript,什么时候应该使用别名,当你你应该摘樱桃只有函数使用?

例子:

  1. 使用别名

    (:require [some-package.sub as some])
    
    (some/do-stuff "xyz")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 :refer

    (:require [some-package.sub :refer [do-stuff]])
    
    (do-stuff "xyz")
    
    Run Code Online (Sandbox Code Playgroud)

如果依赖项具有您想要使用的大量函数或者您使用其所有函数(无论有多少函数),则使用别名似乎更方便,特别是因为ClojureScript(故意)不支持:refer :all.另一方面,使用:refer似乎是一种更"干净"的方法,特别是在仅使用依赖项中的某些特定函数时.

在两者之间进行选择时是否应该考虑其他事项(这首先是一个有效的理由)?

我能想到的另一件事是,如果你在文件中定义了很多自己的函数的依赖关系和/或加载,那么在函数调用中使用别名前缀可以使这些函数的位置更加清晰,即使您只使用依赖项提供的一小部分函数.

我该如何选择使用哪一个?或者你应该在你的开发团队中做出决定,只要你坚持一种方法,一切都很好吗?

lev*_*and 5

这是主观的,但我几乎只使用别名。唯一的例外是,当我的命名空间经常使用另一个命名空间中的一个或两个函数时,以消除噪音。例如,我通常引用deftest来自clojure.test. 然而,我从不引用两个以上的函数。

请注意,您可以将:refer:as一起使用:

(ns my-ns
   (:require [clojure.test :as test :refer [deftest]]))
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

使用别名可以让任何读取代码的人明确定义特定变量,尤其是当您在所有项目中标准化别名的使用时.

不合格的名称my-fn可以参考:

  • my-fn当前名称空间中定义的var .
  • my-fn在一些其他命名空间中定义的var ,使用别名到当前命名空间:require :refer
  • 一个名为的局部词法绑定(即函数参数或let-bound变量)my-fn.

限定名称a/my-fn只能引用:

  • my-fn另一个名称空间中的var 别名为a(a如果你是顽皮并使用单段名称空间,则为名称空间).
  • 不常见的是,my-fn在Java类中命名的静态方法或字段a.

限定名称不能与当前命名空间中定义的任何内容混淆,并且因为您不能将限定名称用作函数参数或let绑定,所以不存在被本地词法绑定遮蔽的风险.使用可以:require :refer放弃这种清晰度而不会给你太多回报,在我看来应该谨慎使用.