通过包装函数创建新的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))
答案 0 :(得分:3)
Stuart Sierra suggests没有使用前缀。他的想法是纯函数可以用它的实现来代替,因此一个简单的名词在这个意义上比动词更好。
答案 1 :(得分:1)
我同意(image ...)
是看起来最好的版本。但是,你是对的,你可以很容易地用局部变量来遮蔽函数。你能做什么?
命名空间用于解决Clojure的Lisp-1性质引入的问题:
(let [image (png/image "file.png")] ...)
或者,当您在同一名称空间中时,您应该提供更好的变量名称:image
有点通用;尝试更精确的内容,例如avatar
或thumbnail
。另请注意,有时image
是赋予变量的最佳名称。
您还可以为变量名添加前缀或后缀,例如user-image
,old-image
或new-image
。
关于函数,make-
前缀并不错:它是可读的,明确的,它修复了遮蔽现有绑定的问题。所以不要太快丢弃它。这个前缀往往比new-
更常见,这有点不清楚:有时你有旧的和新的数据,其中 new 是一个形容词。
答案 2 :(得分:0)
我认为->
是一个有趣的前缀,它已被defrecord
生成的工厂函数使用。