何时使用别名以及何时使用:在Clojure/ClojureScript:require中引用?

何时使用别名以及何时使用:在Clojure/ClojureScript:require中引用?,clojure,clojurescript,Clojure,Clojurescript,在Clojure或ClojureScript中使用:require,何时应使用别名,何时应仅选择所使用的函数 示例: 使用别名 (:require [some-package.sub as some]) (some/do-stuff "xyz") 使用:请参阅 (:require [some-package.sub :refer [do-stuff]]) (do-stuff "xyz") 如果依赖项有很多您想要使用的函数,或者您使用了它的所有函数(不管有多少),那么使用别名似乎更方便

在Clojure或ClojureScript中使用
:require
,何时应使用别名,何时应仅选择所使用的函数

示例:

  • 使用别名

    (:require [some-package.sub as some])
    
    (some/do-stuff "xyz")
    
  • 使用
    :请参阅

    (:require [some-package.sub :refer [do-stuff]])
    
    (do-stuff "xyz")
    
  • 如果依赖项有很多您想要使用的函数,或者您使用了它的所有函数(不管有多少),那么使用别名似乎更方便,特别是因为ClojureScript(故意)不支持
    :refere:all
    。另一方面,使用
    :refere
    似乎是一种更“干净”的方法,特别是当只使用依赖项中的某些特定函数时

    在选择两者之间时,是否还有其他事情需要考虑?(这是一个正当的理由)?

    我可以想到的另一件事是,如果您在文件中定义了大量依赖项和/或自己的函数加载,那么在函数调用中使用别名前缀可能会很有好处,这样可以更清楚地显示这些函数的位置,即使您只使用依赖项提供的函数的一小部分


    我应该如何选择使用哪一个?或者这是你应该在开发团队内部决定的事情,只要你坚持一种方法,一切都会好起来吗?

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

    请注意,您可以同时使用
    :reference
    :as

    (ns my-ns
       (:require [clojure.test :as test :refer [deftest]]))
    

    使用别名可以让任何阅读您的代码的人立即清楚地知道定义了特定变量的位置,特别是当您在整个项目中标准化别名的使用时

    非限定名称
    my fn
    可指:

    • 当前命名空间中定义的var
      my fn
    • 在某个其他名称空间中定义的var
      my fn
      ,使用
      :require:refere
    • 名为
      my fn
      的局部词法绑定(即函数参数或let绑定变量)
    限定名称
    a/my fn
    只能指:

    • 另一个名称空间中的var
      my fn
      ,别名为
      A
      (或者名称空间
      A
      ,如果您淘气并且使用单段名称空间)
    • Java类
      a
      中名为
      myfn
      的静态方法或字段不太常见

    限定名称不能与当前名称空间中定义的任何内容混淆,并且由于不能将限定名称用作函数参数或在
    let
    绑定中使用,因此不会有被本地词汇绑定遮挡的风险。使用
    :require:refere
    放弃了这种清晰性,没有给你多少回报,我认为应该谨慎使用。

    我想说这两种方法都很好,因为如果你在代码中看到它们,你可以检查fn来自哪里。这一点,你的解释很好,你的考虑是完美的。事实上,我在问这个问题之前尝试过同时使用这两种方法,但没有发现仅仅引用函数有什么区别。但我在你的回答后又试了一次,有别名前缀和没有别名前缀,如果我没有弄糟任何事情,它们都能工作。至少在理论上,这可能是一种很好的方法,因为人们可能只需要实际使用的函数,并且仍然使用别名来明确这些函数的位置。在实践中,我认为这可能会使代码更难阅读,人们应该使用别名。我认为这一详细的解释应该是公认的答案,尽管我发现levand的答案也很有价值,而且可能根本没有“正确”的答案,因为在所提供的选项之间进行选择似乎是一个品味问题。