2013-06-27 39 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")) 

这方法可能不像以前那么受欢迎,我个人偏好它通过一个配置图,尽管这只是我的看法。