2013-06-27 40 views
3

來自OOP背景,我對Clojure中推薦的API設計方法有所懷疑。例如,在一個面向對象的語言(Python的在這裏),使用一些API,我會做這樣的:Clojure/LISP REST客戶端設計

api = someWebService() 
api.setWriteApiKey(WRITE_API_KEY) 
api.sampleloadSong('file.mp3') 

在上面的例子中,我設置的API鍵一次,一次又一次地調用相關的方法,而沒有經過API密鑰。在Clojure或任何其他LISP語言家族中推薦這樣做的方式是什麼?

我需要通過在每個鍵和每個函數調用這樣的:

(sampleloadSong "WRITE_API_KEY" "file.mp3") 

或有任何其他更好的辦法。

+1

生成一個不可變的API對象,您將一次又一次地使用:'(make-api「鍵」...「)(樣本加載 - 歌曲api歌曲)''。即使在命令式語言中,它實際上也是一個相當合理的設計。 –

+0

@ om-nom-nom你可以用一個簡短的例子來解釋它嗎? – Sibi

回答

5

爲了防止你所描述的重複問題,你可以使返回記得鍵API函數的函數,(關閉了他們)

(defn make-client [key] (partial api key)) 

再後來在你的程序:

(let [api-fn (make-client WRITE_API_KEY)] 
    (api-fn :sample-song "song.mp3") 
    ... 
    (api-fn :delete-song "other-song.mp3")) 

儘管許多人認爲最好將配置圖作爲第一個參數傳遞給每個api調用。

(api {:key WRITE_API_KEY} ....) 

還有另一種常見的方法,人們對這個鍵作爲一個動態綁定的符號,並要求調用者適當地將其綁定:從呼叫者的名字空間

(def *api-key* :unset) 

(defn api .... use *api-key*) 

(binding [*api-key* WRITE_API_KEY] 
    (api :add-song "foo.mp3")) 

這方法可能不像以前那麼受歡迎,我個人偏好它通過一個配置圖,儘管這只是我的看法。