Clojure:我应该在构造函数的前面加上new或make吗?

Clojure:我应该在构造函数的前面加上new或make吗?,clojure,Clojure,当通过包装函数创建新的Java对象时,“构造函数”的命名标准是什么?我应该在函数名前面加上make-还是new-?或者仅仅称之为它返回的类型?在某一点上,我习惯于使用make-,因为这是在计划书SICP中使用的方法 例如,我将一些东西传递给一个函数,该函数最终返回一个Java类的实例。以下是几个例子: (def myimage1 (make-image "img.svg" 100 200)) ; These all return (def myimage2 (new-image "img.sv

当通过包装函数创建新的Java对象时,“构造函数”的命名标准是什么?我应该在函数名前面加上
make-
还是
new-
?或者仅仅称之为它返回的类型?在某一点上,我习惯于使用
make-
,因为这是在计划书SICP中使用的方法

例如,我将一些东西传递给一个函数,该函数最终返回一个Java类的实例。以下是几个例子:

(def myimage1 (make-image "img.svg" 100 200))  ; These all return
(def myimage2 (new-image "img.svg" 100 200))   ; an instance of
(def myimage3 (image "img.svg" 100 200))       ; javafx.scene.image.Image
创建仅Clojure结构(如映射等)是否也一样:

(def mystruct1 (make-custom-struct args))
(def mystruct2 (new-custom-struct args))
(def mystruct3 (custom-struct args))
我更喜欢没有
make-
new-
的最新版本,但通常情况下绑定(例如在
let
中)会有相同的名称,这会建议在构造函数名称之前加上前缀,或使用不同的绑定名称,例如:

(let [image (make-image "img.svg" 100 200)] ...)
(let [imuj (image "img.svg" 100 200)] ...)
但是,其他时候,我只想在不干扰
new-
或'make-'的情况下在线使用函数:

(do-something-with-an-image (image "img.svg" 100 200))

我认为
->
是一个有趣的前缀,它已经被
defrecord

生成的工厂函数使用,而Stuart Sierra没有使用前缀。他的想法是,一个纯函数可以用它的实现来代替,因此在这个意义上,一个简单的名词比动词更合适。

我同意
(image…
是看起来最好的版本。然而,您是对的,您可以很容易地用局部变量来隐藏函数。你能做什么

  • 名称空间在这里是为了解决Clojure的Lisp-1特性带来的问题:

    (let [image (png/image "file.png")] ...)
    
  • 或者,当您在同一名称空间中时,应该提供更好的变量名:
    image
    有点通用;尝试更精确的方法,如
    化身
    缩略图
    。还要注意,有时
    image
    是变量的最佳名称

  • 您还可以为变量名添加前缀或后缀,如
    用户图像
    旧图像
    新图像

  • 关于函数,
    make-
    前缀还不错:它可读、明确,并且修复了隐藏现有绑定的问题。因此,不要太快放弃它。这个前缀往往比
    new-
    更常见,这有点不清楚:有时您有新旧数据,其中new是一个形容词


虽然我同意
(图.
就是这个方法,你能把你的答案扩展到比微小的事实多一点吗。如果你把这个用于记录以外的事情,一定要仔细记录返回的东西不是预期的。作为一个非英语母语的人,请不要说出任何东西
imuj
,我不得不暂停一会儿,直到我“大声说出来”在我的脑海里用英语。