2015-05-29 8 views
7

में पुनर्रचना अपने प्रोजेक्ट आकार {:firstName :lastName :address} साथ उपयोग कर रहा है "व्यक्ति" नक्शे, और मैं {:name {:firstName :lastName} :address} है कि आकार बदलना चाहते हैं, मैं यह सुनिश्चित करें कि मैं इसी परिवर्तन हर जगह इन कर दिया है मदद करने के लिए क्या कर सकते हैं वस्तुओं का उपयोग किया जाता है?स्ट्रक्चरल शुद्धता जबकि Clojure

जावा में, यह कहीं भी सरल है क्योंकि मेरे पास अभी भी व्यक्ति है। फर्स्टनाम एक संकलन त्रुटि जारी करेगा। क्लोजर I में को रनटाइम त्रुटि भी प्राप्त नहीं हुई है, लेकिन सर्वर पर केवल खराब डेटा सहेजा गया है। मुझे लगता है कि शुद्धता की गारंटी नहीं है, लेकिन ठीक-दांत-कॉम्ब्स के अलावा अन्य क्या है?

+1

यदि आप संकलन-समय त्रुटियों को चाहते हैं, तो आप 'core.typed' का उपयोग करने पर भी विचार कर सकते हैं। –

+0

जो उत्तर दिए गए हैं वे अच्छे हैं, लेकिन मुझे लगता है कि यह एक ऐसी स्थिति हो सकती है जिसमें नियमित अभिव्यक्ति खोज और परिचित एक अच्छे प्रोग्रामर के संपादक के साथ परिचितता बहुत उपयोगी हो। यदि नियमित अभिव्यक्ति पर्याप्त लचीली नहीं हैं, और आपके पास एक बड़ा कोड बेस है, तो स्ट्रिंग मैनिपुलेशन के लिए आपकी पसंदीदा भाषा में टेक्स्ट मैनिपुलेशन स्क्रिप्ट को कोडिंग करने के लायक भी हो सकते हैं। या आप क्लोजर का भी उपयोग कर सकते हैं। यह क्लोजर स्रोत पढ़ने में बहुत अच्छा है, और क्लोजर मैक्रोज़ क्लोजर स्रोत को फिर से लिखने में अच्छा है। यह सब इस बात पर निर्भर करता है कि आपको कितना कोड रिफैक्टर करना है। – Mars

उत्तर

6

क्लोजर में पुस्तकालय हैं जो डेटा परिभाषा और सत्यापन प्रदान करते हैं। उदाहरण के लिए, आप https://github.com/Prismatic/schema

संकलन-समय बनाम रनटाइम त्रुटियों की कठिनाई के संबंध में उपयोग कर सकते हैं ... ठीक है, यह समस्या क्लोजर के लिए अद्वितीय नहीं है। जॉन कारमैक को उद्धृत करने के लिए: "लिस्प की चुनौती आपके कार्यक्रम को चलाने के लिए मिल रही है, हास्केल की चुनौती इसे संकलित करने के लिए मिल रही है।"

4

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

कहा करने के बाद, आप थोड़ा अपने मामले में अवसरों में सुधार कर सकता है अगर आप अपने person (और अभी भी नक्शे के बारे में अच्छी बातें बनाए रखने) बनाने के लिए इसके निर्माता समारोह के साथ एक रिकॉर्ड इस्तेमाल किया:

(defrecord Person [name address]) 

;; Okay. No problem 
(def scott (->Person {:firstname "Scott" :lastname "Lowe"} 
        "23 Hope Street, Edinburgh")) 
;; But then... 
(def scott (->Person "Scott" 
        "Lowe" 
        "23 Hope Street, Edinburgh")) 
;; Boom! 
ArityException Wrong number of args (3) passed to: user/eval990/->Person--1005 

अब इस उदाहरण रनटाइम पर समस्या को पकड़ता है, और यह स्पष्ट रूप से केवल कुछ साधारण मामलों में मदद करेगा। लेकिन स्थिर विश्लेषण उपकरण विकास समय पर इस बग पर भी उठाएंगे (उदाहरण के लिए: इंटेलिजे के लिए उपलब्ध कर्सर जैसे क्लोजर प्लगइन्स)।