Пиша библиотека на Clojure и се чудя каква е най-добрата практика за задаване на конфигурационни параметри на библиотека.
Много библиотеки (като тези в clojure-contrib) използват параметър на глобално ниво като *buffer-size*
, който потребителят може да зададе, като им извика set!
. Но това не изглежда най-добрият начин за мен, тъй като създава глобално състояние и има шансове за сблъсък на имена.
Другият начин е да подадете параметрите във всяко извикване на функция, което зависи от тях. Ако има много параметри, може да се използва карта от тях, вместо да се подават отделни.
Като пример, да кажем, че пиша кеш библиотека.
Използвайки първия подход, имам глобални параметри като *cache-size*, *expiry-time*, *cache-dir*
и т.н. Потребителят ги set!
s (или не и ги оставя да бъдат по подразбиране) и извиква функции като (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 и защо?