2013-11-15 13 views
5

मैं विनम्रतापूर्वक पूछना चाहता हूं ...var या ref/atom/agent?

क्या, "निरंतर मूल्यों के लिए var या ref/atom/agent?", क्या मैं पूछता हूं? बेशक, मैं निरंतर मूल्यों के लिए वर्रों का उपयोग करता हूं।

लेकिन मुझे हमेशा आश्चर्य हुआ कि जब मूल्य स्थिरांक की तरह कार्य करता है तो मुझे किस का उपयोग करना चाहिए, लेकिन संकलन-समय (जब कोड पढ़े जाते हैं) के बजाय उन्हें रन-टाइम में असाइन किया जाना चाहिए।

उदाहरण के लिए, उपयोगकर्ता की कॉन्फ़िगरेशन फ़ाइल में लिखी गई कुछ जावा गुणों को सोचें। उन्हें रन-टाइम में असाइन किया जाना चाहिए क्योंकि डेटा कोड में नहीं है। लेकिन डेटा को पढ़ने से पहले उन्हें भी परिभाषित किया जाना चाहिए, क्योंकि अन्य कोड उन्हें संदर्भित करते हैं।

इस मामले में,

जब मैं प्रयोग करते हैं 'वर के ?:

  • मैं परिभाषित' वर की है, या बस 'वर का (जब कि ठीक है) की घोषणा।
  • और फिर मैं उन फ़ाइलों द्वारा फिर से 'var' को फिर से परिभाषित करता हूं जो विकल्प फ़ाइलों को पढ़ते हैं।
  • लेकिन 'var के ओवरराइट करने के लिए यह भयानक लगता है, या' var के अंदर के कार्यों को परिभाषित करने के लिए यह अजीब लगता है।

मैं रेफरी/एटम/एजेंट ?:

  • मैं रेफरी/एटम/एजेंटों आवंटित 'वर के लिए उपयोग करते हैं करते हैं।
  • तब मैं उन फ़ाइलों द्वारा उन रेफरी/परमाणु/एजेंटों को अद्यतन करता हूं जो विकल्प फ़ाइलों को पढ़ते हैं।
  • लेकिन चूंकि मूल्य पूरे कार्यक्रम में उपयोग किए जाते हैं इसलिए मुझे उनकी लागत की चिंता है।
  • ... और बहुत से @ मैक्रोज़ का उपयोग कुछ हद तक परेशान कर रहे हैं।

मुझे नहीं पता कि मुझे क्या उपयोग करना चाहिए।

आप उन मामलों में क्या उपयोग करते हैं?

'var's? 'रेफरी/एटम/एजेंट? या यहां तक ​​कि 'देरी है?

अग्रिम धन्यवाद।

+0

प्रोग्राम शुरू होने पर पहली पंक्ति में आप अपने var को तुल्यकालिक रूप से परिभाषित क्यों नहीं करते? तो इस मामले में आपको कहीं और उस var को ओवरराइट करने की आवश्यकता नहीं है। दूसरी तरफ यदि आप लिखकर परेशान हैं '@ my-var' हर जगह आप केवल एक रैपर फ़ंक्शन को परिभाषित कर सकते हैं जो उत्तर देने के लिए धन्यवाद '@ my-var' – hsestupin

+0

देता है। मैं अपने var को तुल्यकालिक रूप से कैसे परिभाषित करूं? मुझे नहीं लगता कि मैं समझता हूं कि आपका क्या मतलब है। मैंने सोचा कि युद्ध कुछ तुल्यकालिक नहीं हैं। क्या आपका मतलब है कि वर्धों को रेफरी करना और प्रारंभिकरण के लिए रीफ्रेश (अपडेट) रीसेट करना था? –

+1

मेरा मतलब है कि आपके नामस्थान 'ns.with-const' पर कोड की निरंतर पहली पंक्ति होगी' (मेरा my-const (कुछ computations) def 'होगा। इसलिए जब तक यह अभिव्यक्ति उन सभी नामस्थानों का मूल्यांकन नहीं कर रही है जो 'ns.with-const' का उपयोग करने या आवश्यकता करने की कोशिश करते हैं, वे अपने कोड का मूल्यांकन शुरू नहीं करेंगे। और इस मॉडल में कोई दौड़ की स्थिति नहीं है। जब आपकी कॉन्स की गणना की जाएगी - यह परिभाषित चींटी बन जाती है सबकुछ ठीक काम करता है। आशा है कि यह स्पष्टीकरण समझ में आता है – hsestupin

उत्तर

2

यदि सभी, या "समूह" के समूह, जो आप ले रहे हैं, समय पर एक बिंदु पर सीखा जा सकता है, चलिए उन्हें "गुण" कहते हैं।

और के एक config है कि "में उन्हें चूसना" हैं बनाते हैं:

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

आपका गुण (जैसे, "स्थिरांक") फ़ाइल "अपने।conf "की तर्ज में होगा:

(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 

में:

{: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"}} 
फिर बाद में

अपने कार्यक्रम/अन्य नामस्थान में आप के रूप में यह सब गुण का उपयोग कर सकते" वास्तविक जीवन "," सहारा "var उपर्युक्त संभावित रूप से "-D" पथ की जांच करेगा, डिफ़ॉल्ट होगा, और अपवादों को संभालेगा, लेकिन यह बिंदु को चित्रित करने के लिए थोड़ा सा सरल है।

संबंधित मुद्दे