2013-11-15 12 views
5

Chciałbym pokornie zapytać ...var lub ref/atom/agent dla stałych wartości?

Co, "var lub ref/atom/agent dla stałych wartości?", Pytam? Oczywiście używam vars dla stałych wartości.

Ale zawsze zastanawiałem się, który powinienem używać, gdy wartości działają jak stałe, ale powinny być przypisane w czasie wykonywania, a nie w czasie kompilacji (kiedy kody są czytane).

Na przykład pomyśl o niektórych właściwościach języka Java zapisanych w pliku konfiguracyjnym użytkownika. Powinny być przypisane w czasie wykonywania, ponieważ dane nie znajdują się w kodach. Należy je jednak zdefiniować przed odczytaniem danych, ponieważ inne kody je odsyłają.

W tym przypadku

kiedy używać 'var użytkownika ?:

  • zdefiniować' var, albo po prostu zadeklarować „var'S (kiedy to jest w porządku).
  • A następnie ponownie zdefiniuję te zmienne za pomocą funkcji, które odczytują pliki opcji.
  • Ale trudno jest nadpisać "var" lub czuć się dziwnie, aby zdefiniować funkcje wewnętrzne var.

kiedy mogę używać ref/Atom/agenta ?:

  • przypisać Ref/atom/agentów „var jest.
  • Następnie aktualizuję te ref/atom/agent przez funkcje, które odczytują pliki opcji.
  • Ale ponieważ wartości są używane w całym programie, więc martwię się o ich koszty.
  • ... i używanie zbyt wielu makr @ jest dość denerwujące.

Nie wiem, co powinienem użyć.

Czego używasz w tych przypadkach?

"var? "ref/atom/agent's? czy nawet "opóźnienie"?

Z góry dziękuję.

+0

Dlaczego nie zdefiniujesz zmiennego synchronicznie w pierwszym wierszu po uruchomieniu programu? w tym przypadku nie musisz nadpisywać tego var gdzie indziej, po drugiej stronie, jeśli denerwujesz się przez pisanie '@ my-var' wszędzie można zdefiniować funkcję opakowania, która zwraca' @ my-var' – hsestupin

+0

Dzięki za odpowiedź. Jak mogę zdefiniować mój var synchronicznie? Nie sądzę, że rozumiem, co masz na myśli. Sądziłem, że vary nie są czymś synchronicznym. Czy chodziło ci o przypisanie poprawek do zmiennych i zresetowanie (zaktualizowanie) certyfikatów do inicjowania? –

+1

Mam na myśli, że w twojej przestrzeni nazw 'ns.with-const' z tą stałą pierwszą linią kodu będzie' (def my-const (some-computations)) '. Dopóki to wyrażenie nie będzie oceniać wszystkich przestrzeni nazw, które spróbują użyć lub wymagają 'ns.with-const', nie rozpocznie się ich własny kod. I nie ma warunków wyścigowych w tym modelu. Kiedy twoja stała zostanie obliczona - staje się zdefiniowana i wszystko działa dobrze. Mam nadzieję, że to wyjaśnienie ma sens – hsestupin

Odpowiedz

2

Jeśli wszystko lub grupa "stałych", które bierzesz, możesz się nauczyć w jednym momencie, nazwijmy je "właściwościami".

I zróbmy config że "Suck je":

(defn resource [path] 
    (when path 
    (-> (Thread/currentThread) .getContextClassLoader (.getResource path)))) 

(def props 
    (edn/read-string 
    (slurp (io/file (resource (System/getProperty "your.conf")))))) 

(defn conf [& path]     ;; e.g. (conf :db :uri) 
    (get-in props (vec path))) 

właściwościach (na przykład "stałe") plik „swojej.conf”byłoby w linii:

{:db 
    {:uri "datomic:mem://dbname" 
    :other-property 42} 

:rabbit 
     {:host "192.168.1.17" 
     :port 5672 
     :exchange "xyz-exchange" 
     :queue "zq" 
     :exchange.type "direct" 
     :vhost "/some-broker" 
     :username "user" 
     :password "strong"}} 

później w programie/innych nazw można uzyskać dostęp do wszystkich to właściwości jak:

(conf :db :uri)    ;; will "constant"ly return "datomic:mem://dbname" 
(conf :rabbit :host)   ;; will "constant"ly return "192.168.1.17" 
(conf :db :other-property) ;; will "constant"ly return 42 

W«prawdziwym życiu», w«rekwizyty»var powyżej może potencjalnie sprawdzić ścieżkę "-D", mieć wartości domyślne i obsługiwać wyjątki, ale jest nieco uproszczona, aby zilustrować ten punkt:

Powiązane problemy