qiu*_*fei 10 design-patterns clojure builder
我们通常在java中使用builder模式,如下所示:
UserBuilder userBuilder = new UserBuilder();
User John = userBuiler.setName("John")
.setPassword("1234")
.isVip(true)
.visableByPublic(false)
.build();
Run Code Online (Sandbox Code Playgroud)
某些属性具有默认值,而有些属性则没有.
在地图中传递属性可能是一种解决方案,但它会使参数真正变长:
(def john (make-user {:name "John" :pass "1234" :vip true :visible false}))
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,有一种优雅的方式来实现这一目标吗?
如果要构造一些clojure结构,可以在函数参数中使用解构模式.然后,您将实现您已编写的类似内容.
(defn make-user [& {:keys [name pass vip visible]}]
; Here name, pass, vip and visible are regular variables
; Do what you want with them
)
(def user (make-user :name "Name" :pass "Pass" :vip false :visible true))
Run Code Online (Sandbox Code Playgroud)
我怀疑你能用比这更少的代码做些什么.
如果你想构建Java对象(使用它的setter),你可以使用Nicolas建议的方法.