2013-06-27 2 views
3

Исходя из фона ООП, я сомневаюсь в рекомендуемом способе проектирования API в Clojure. Например, в качестве языка объектно-ориентированного (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

Чтобы предотвратить проблемы повторения, вы можете описать, что вы можете сделать функцию, которая возвращает функцию апи, которая запоминает ключи, (закрывает над ними)

(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")) 

Этом подход может быть менее популярен, чем когда-либо, и мое личное предпочтение - передать конфигурационную карту, хотя это только мое мнение.