Я пишу библиотеку Clojure, и мне интересно, как лучше всего устанавливать параметры конфигурации библиотеки.
Многие библиотеки (например, в clojure-contrib) используют параметр глобального уровня, такой как *buffer-size*
, который пользователь может установить, вызвав для них set!
. Но это не кажется мне лучшим способом, поскольку он создает глобальное состояние и есть вероятность конфликта имен.
Другой способ — передавать параметры при каждом вызове функции, которая от них зависит. Если параметров много, то можно использовать их карту вместо передачи отдельных.
В качестве примера предположим, что я пишу кэш-библиотеку.
Используя первый подход, у меня есть глобальные параметры, такие как *cache-size*, *expiry-time*, *cache-dir*
и т. Д. Пользователь set!
использует их (или нет, и пусть они будут по умолчанию) и вызывает такие функции, как (set-in-cache id obj)
и (get-from-cache id)
.
Используя второй подход, пользователь сначала создает карту параметров и передает ее каждому вызову.
(def cache-parameters {:cache-size 1000
:expiry-time: 1440
:cache-dir "c:\\cache"})
(set-in-cache cache-parameters id obj)
(get-from-cache cache-parameters id)
Итак, какой способ предпочтительнее в Clojure и почему?