Как установить параметры конфигурации в библиотеке clojure? - PullRequest
2 голосов
/ 23 июля 2010

Я пишу библиотеку 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 и почему?

1 Ответ

3 голосов
/ 23 июля 2010

На самом деле вы не можете set! такие вещи, как c.c.io *buffer-size*, если вы не установите для них локальную привязку потока с помощью binding, with-bindings и т. Д. Есть только несколько Vars, для которых локально для потокапривязки устанавливаются механизмами Clojure более низкого уровня, такими как *warn-on-reflection* и *read-eval*, что делает их set! доступными на верхнем уровне;Определяемые пользователем переменные не могут быть set! на верхнем уровне.Корневая привязка Var может быть изменена, например, с помощью alter-var-root, intern, def, .bindRoot ..., но это следует использовать с осторожностью.

Что касается восстанавливаемых Vars иЯвные параметры - часть вопроса: использование явных параметров почти всегда нормально и, как правило, предпочтительнее, просто из-за повышенной возможности сопровождения функций, которые четко отображают все фрагменты данных, от которых они зависят.При этом, если какой-то фрагмент конфигурации, вероятно, будет задан один раз, а затем использован практически каждым вызовом функции в приложении / библиотеке когда-либо, это может привести к тому, что более разумный код определит ушную переменную Var, задокументирует ее и поместит конфигурациюв нем (и это может быть один из тех редких случаев, когда изменение корневой привязки Var вне формы, которая определяет, может быть в порядке).

Подводя итог, используйте свое лучшее суждение, если не уверены - ошибаться всторона явной передачи параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...