Clojure:我应该预先添加new或make-to构造函数吗?

时间:2016-01-25 16:37:30

标签: clojure

通过包装函数创建新的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))

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我同意(image ...)是看起来最好的版本。但是,你是对的,你可以很容易地用局部变量来遮蔽函数。你能做什么?

  • 命名空间用于解决Clojure的Lisp-1性质引入的问题:

    (let [image (png/image "file.png")] ...)
    
  • 或者,当您在同一名称空间中时,您应该提供更好的变量名称:image有点通用;尝试更精确的内容,例如avatarthumbnail。另请注意,有时image 是赋予变量的最佳名称。

  • 您还可以为变量名添加前缀或后缀,例如user-imageold-imagenew-image

  • 关于函数,make-前缀并不错:它是可读的,明确的,它修复了遮蔽现有绑定的问题。所以不要太快丢弃它。这个前缀往往比new-更常见,这有点不清楚:有时你有旧的新的数据,其中 new 是一个形容词。

答案 2 :(得分:0)

我认为->是一个有趣的前缀,它已被defrecord生成的工厂函数使用。