2013-11-15 2 views
5

Ich möchte demütig fragen ...var oder ref/atom/agent für konstante Werte?

Was, "var oder ref/atom/agent für konstante Werte?", Frage ich? Natürlich verwende ich Vars für konstante Werte.

Aber ich fragte mich immer, welche ich verwenden sollte, wenn die Werte wie Konstanten wirken, aber sie sollten in der Laufzeit zugewiesen werden, anstatt in der Kompilierzeit (wenn die Codes gelesen werden).

Zum Beispiel, denke, einige Java-Eigenschaften in der Konfigurationsdatei des Benutzers geschrieben. Sie sollten zur Laufzeit zugewiesen werden, da die Daten nicht in den Codes enthalten sind. Aber sie sollten auch definiert werden, bevor die Daten gelesen werden, da die anderen Codes sie beziehen.

In diesem Fall

wenn verwende ich 'var ?:

  • Ichs definieren' var ist, oder erklären, nur ‚var ist (wenn das in Ordnung ist).
  • Und dann definiere ich diese 'Var' wieder durch Funktionen, die Optionsdateien lesen.
  • Aber es fühlt sich schrecklich an, 'var's zu überschreiben, oder es fühlt sich komisch an,' vars innere Funktionen zu definieren.

Wann verwende ich ref/Atom/Mittel ?:

  • I ref/Atom/Agenten ‚var des zuordnen.
  • Dann aktualisiere ich diese ref/atom/agents durch Funktionen, die Optionsdateien lesen.
  • Aber da die Werte im gesamten Programm verwendet werden, sorge ich mich um ihre Kosten.
  • ... und zu viele @ Makros sind etwas nervig.

Ich weiß nicht, was ich verwenden soll.

Was verwenden Sie in diesen Fällen?

'var's? 'ref/atom/agent's? oder sogar 'Verspätung'?

Vielen Dank im Voraus.

+0

Warum definieren Sie nicht Ihre var synchron in der ersten Zeile, wenn das Programm startet? In diesem Fall müssen Sie diese Datei nicht woanders überschreiben, auf der anderen Seite, wenn Sie beim Schreiben nervig sind '@ my-var' überall kann man einfach eine Wrapper-Funktion definieren, die' @ my-var' zurückgibt – hsestupin

+0

Danke fürs Beantworten. Wie definiere ich meine Var synchron? Ich glaube nicht, dass ich verstehe, was du meinst. Ich dachte, Vars sind nichts Synchrones. Meinten Sie, refs den vars zuzuordnen und die refs für die Initialisierung zurückzusetzen (zu aktualisieren)? –

+1

Ich meine an Ihrem Namespace 'ns.with-const' mit dieser konstanten ersten Zeile des Codes wäre' (def my-const (einige-Berechnungen)) '. Also, bis dieser Ausdruck alle Namespaces auswertet, die 'ns.with-const 'verwenden oder benötigen, wird nicht damit begonnen, ihren eigenen Code auszuwerten. Und bei diesem Modell gibt es keine Rennbedingungen. Wenn Ihr const berechnet wird - es wird definiert und alles funktioniert gut. Hoffe, diese Erklärung macht Sinn – hsestupin

Antwort

2

Wenn alle oder eine Gruppe von "Konstanten", die Sie einnehmen, zu einem bestimmten Zeitpunkt gelernt werden können, nennen wir sie stattdessen "Eigenschaften".

Und lassen Sie uns eine Config machen, die "saugen sie in" würde:

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

Ihre Eigenschaften (zum Beispiel "Konstanten") „Ihre Datei.conf“in den Linien würden:

{: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"}} 

Dann später in Ihrem Programm/andere Namespaces Sie alle diese Eigenschaften zugreifen:

(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 

In "wirklichen Leben", die "Requisiten" var oben würde möglicherweise einen "-D" -Pfad überprüfen, haben Standardwerte und behandeln Ausnahmen, aber es ist ein wenig vereinfacht, um den Punkt zu veranschaulichen.