3

来自 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")

或者有没有其他更好的方法。

4

1 回答 1

6

为了防止您描述的重复问题,您可以创建一个函数,该函数返回一个记住键的 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"))

这种方法可能不像以前那么受欢迎了,我个人更喜欢它传递一个配置映射,尽管这只是我的看法。

于 2013-06-27T23:09:12.337 回答