Clojure:我应该在构造函数的前面加上new或make吗?
当通过包装函数创建新的Java对象时,“构造函数”的命名标准是什么?我应该在函数名前面加上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
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
,我不得不暂停一会儿,直到我“大声说出来”在我的脑海里用英语。