来自 OOP 背景,我对 Clojure 中推荐的 API 设计方式有疑问。例如在 OOP 语言(此处为 Python)中,为了使用一些 API,我会这样做:
api = someWebService()
api.setWriteApiKey(WRITE_API_KEY)
api.sampleloadSong('file.mp3')
在上面的示例中,我设置了一次 API key 并一次又一次地调用关联的方法,而没有再次传递 API key 。在 Clojure 或任何其他 LISP 语言家族中,推荐的做法是什么?
我是否需要像这样在每个函数调用中传递 key :
(sampleloadSong "WRITE_API_KEY" "file.mp3")
或者有没有其他更好的方法。
最佳答案
为了防止您描述的重复问题,您可以创建一个函数,该函数返回一个记住键的 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} ....)
还有另一种常见的方法,人们将键定义为可动态绑定(bind)的符号,并要求调用者适本地绑定(bind)它:
(def *api-key* :unset)
(defn api .... use *api-key* )
来自调用者的命名空间:
(binding [*api-key* WRITE_API_KEY]
(api :add-song "foo.mp3"))
这种方法可能不像以前那样流行,我个人更喜欢传递配置映射,尽管这只是我的意见。
关于Clojure/LISP REST 客户端设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354198/