对于这个简单的逻辑,什么是惯用的Clojure?

Pau*_*ond 5 idiomatic clojure

我在Clojure中编写了一个简单的设计auth函数,它对我来说根本不是很惯用.有没有更好的方式来写这个:

(defn auth [username password] 
  (let [user-record (credential-fn username)]
    (if (and user-record (verify-pw password))
      (let [user-record (dissoc user-record :password)]
        {:status 200 :body user-record})
      {:status 401})))
Run Code Online (Sandbox Code Playgroud)

我认为有可能摆脱if使用if-let,但是if正在做一个布尔检查,我需要绑定user-record?卡住!

注意:dissoc正在删除密码,user-record因此它不会在正文中返回.

pon*_*zao 9

我认为你的功能最大的问题是它试图同时处理三件事:

  1. 检查用户名和密码是否对用户有效(credential-fnverify-pw)
  2. 清理记录数据 (dissoc user-record password)
  3. 构建环响应图({:status 401}vs. {:status 200 :body user-record})

我会考虑将您的代码分成两个独立的函数:

(defn authenticate
  [username password]
  (and (verify-pw password) 
       (dissoc (credential-fn username) :password)))

(defn login
  [username password]
  (if-let [user-record (authenticate username password)]
    {:status 200 :body user-record}
    {:status 401}))
Run Code Online (Sandbox Code Playgroud)