什么是构建模式的clojure方式?

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)

所以,我的问题是,有一种优雅的方式来实现这一目标吗?

Vla*_*eev 9

如果要构造一些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建议的方法.

  • 为了完整性,回答你的默认值,解构支持默认值为`或':`(defn make-user [&{:keys [name pass vip visible]:或{vip true}}]` (2认同)