【问题标题】:Is there a canonical way to name variables that would otherwise cause name collisions?是否有一种规范的方法来命名变量,否则会导致名称冲突?
【发布时间】:2021-06-10 23:40:14
【问题描述】:

假设我想命名一个变量seq,指代某种序列。

但是seq已经是clojure.core中的一个函数,所以如果我尝试将我的变量命名为seqseq的现有含义将被覆盖。

Clojure 中是否有一种规范的方式来命名一个变量,否则该变量会与默认变量发生名称冲突?

(例如,在这种情况下,可以使用my-seq,但我不知道就样式而言这是否是标准的)

【问题讨论】:

  • 不是规范的,但是 a-seqseq 怎么样?我们不要去Hugarian,拜托了

标签: clojure naming


【解决方案1】:

没有“标准”的命名方式(参见the quoterelated joke)。

如果它只是一个东西的功能,我通常只是将它命名为arg。有时,人们使用诸如 x 之类的缩写来表示单个事物,而 xs 则用于事物的序列、列表或向量。

对于小的代码片段,缩写为“长”名称的第一个字母通常就足够了。例如,在遍历地图时,每个 MapEntry 经常被访问为:

(for [[k v] some-map]  ; destructure key/val into k & v
  ...)

其他时候,您可以在其前面加上 aseqthe-seq 之类的字母。

我经常使用的另一个技巧是添加描述性后缀,例如

name-in
name-full
name-first

(是的,有一个 Clojure 函数 name)。

请注意,如果您确实将其命名为seq,您将创建一个隐藏clojure.core/seq 函数的局部变量(它不会被“覆盖”)。如果阴影的范围有限并且所讨论的名称清晰且适当(keyval 通常是这种做法的受害者),我通常只是“让它滑动”。对于name,我也可能会忽略clojure.core/name 的阴影,因为我很少使用该功能。

请注意,您可以隐藏自己的局部变量。这通常可以方便地将数据强制转换为特定格式:

(defn foo
  [items]
  ; assume we need a sorted vector with no duplicates
  (let [items (vec (sort (set (items))))]
    ...))

通过隐藏原始 items 参数,我们确保数据处于所需的形式,而无需提出两个好的描述性名称。当这种技术不太适合时,我经常会退回到后缀技巧,只需将它们命名为 items-initems 或类似名称。

有时,当需要多种表示形式时,指示类型的后缀很有价值。例如:

items
items-set
items-vec

type-str
type-kw
type-sym

还有很多其他的可能性。重点是让读者清楚地知道发生了什么,并避免为不知情的人制造陷阱。

如有疑问,请添加更多字母,以便新读者清楚发生了什么。

【讨论】:

    【解决方案2】:

    您不会覆盖clojure.core/seq。您将简单地使用本地绑定或 var 隐藏 var seq。始终可以使用完全限定名称来使用核心seq

    例子:

    
    ;; shadow core seq
    (def seq [1 2 3])
    WARNING: seq already refers to: #'clojure.core/seq in namespace: user, being replaced by: #'user/seq
    => #'user/seq
    
    
    ;; local binding 
    (defn print-something [seq]
      (prn seq)
      (prn (var seq)))
    => #'user/print-something
    
    
    ;; use fully qualified name
    (clojure.core/seq "abc")
    => (\a \b \c)
    
    
    (print-something "a")
    "a"
    #'user/seq
    => nil
    
    
    (prn seq)
    [1 2 3]
    => nil
    
    
    (var seq)
    => #'user/seq
    

    但是,隐藏clojure.core vars 并不是一个干净的做法,因为它可能会导致代码错误。如果有的话,它弊大于利。我通常根据代码上下文命名变量,如employee-id-sequrl-seq 等。有时,如果使用范围有限,可以使用xs 等短名称。您还可以查看clojure.core 实现以查找更多示例。

    一个很好的指南:https://github.com/bbatsov/clojure-style-guide#idiomatic-names

    我也推荐clj-kondoplugin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多