【问题标题】:When to use aliases and when to use :refer in Clojure/ClojureScript :require?在 Clojure/ClojureScript 中何时使用别名以及何时使用 :refer :require?
【发布时间】:2014-09-10 13:46:40
【问题描述】:

在 Clojure 或 ClojureScript 中使用 :require 时,什么时候应该使用别名,什么时候应该只挑选你使用的函数?

例子:

  1. 使用别名

    (:require [some-package.sub as some])
    
    (some/do-stuff "xyz")
    
  2. 使用:refer

    (:require [some-package.sub :refer [do-stuff]])
    
    (do-stuff "xyz")
    

如果依赖项有很多你想使用的函数或者你使用了它的所有函数(不管有多少),使用别名似乎更方便,特别是因为 ClojureScript(故意)不支持:refer :all。另一方面,使用:refer 似乎是一种更“干净”的方法,尤其是在仅使用依赖项中的某些特定函数时。

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

我能想到的另一件事是,如果您在文件中定义了许多依赖项和/或加载您自己的函数,那么在函数调用中使用别名前缀可能会更清楚这些函数的位置即使您只使用依赖项提供的功能的一小部分,也可以找到它们。

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

【问题讨论】:

  • 我会说它们都很棒,因为如果您在代码中看到它们,您可以检查 fns 的来源。那,你的解释很好,你的考虑很完美。

标签: clojure clojurescript


【解决方案1】:

使用别名可以让阅读您的代码的任何人立即清楚定义特定变量的位置,尤其是当您在所有项目中标准化别名的使用时。

不合格的名字my-fn可以指:

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

限定名a/my-fn只能指:

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

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

【讨论】:

  • 我认为这个详尽的解释应该是公认的答案,尽管我发现 levand 的答案也很有价值,而且可能根本没有“正确”的答案 - 因为在所提供的选项之间进行选择似乎是一个品味问题。
【解决方案2】:

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

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

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

【讨论】:

  • 在我问这个问题之前,我实际上尝试同时使用它们,但只提到函数没有发现任何区别。但是我在你的回答之后又试了一次,不管有没有别名前缀,如果我没有搞砸任何事情,它们都可以工作。至少在理论上,这可能是一种好方法,因为人们可能只需要他们实际使用的函数,并且仍然使用别名来更清楚地说明这些函数的位置。在实践中,我认为这可能会使代码更难阅读,应该只使用别名。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多