来自OOP背景,我对Clojure中推荐的API设计方法有疑问。例如,在OOP语言(这里是Python)中,为了使用某些API,我会这样做:
api = someWebService()
api.setWriteApiKey(WRITE_API_KEY)
api.sampleloadSong('file.mp3')
在上面的示例中,我设置了一次API密钥并一次又一次地调用关联的方法,而没有再次传递API密钥。在Clojure或任何其他LISP系列语言中推荐的方法是什么?
我是否需要在每个函数调用中传递密钥,如下所示:
(sampleloadSong "WRITE_API_KEY" "file.mp3")
还是有其他更好的方法。
答案 0 :(得分: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"))
这种方法可能不像过去那样受欢迎,我个人倾向于传递配置图,尽管这只是我的意见。