Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

मजबूती सिद्धांत के साथ रूबी कोड विश्वसनीयता बढ़ाएं

मैंने मूल रूप से इनमें से कई विचारों को कॉन्फिडेंट रूबी से सीखा, जो मेरी पसंदीदा रूबी किताबों में से एक है। यदि आप इस पोस्ट को पसंद करते हैं, तो आपको इसे खरीदना चाहिए और पूरी चीज पढ़नी चाहिए। वहां बहुत अच्छी चीजें हैं।

आपका current_user मेथड एक User वापस करता है, सिवाय जब कोई यूजर नहीं होता और यह nil वापस करता है। एक search मेथड परिणामों का एक Array वापस करता है, जब तक कि केवल एक परिणाम न हो, और यह उस परिणाम को वापस कर देता है। उचित लगता है, है ना? शायद सुविधाजनक भी!

लेकिन जल्द ही, ये निर्णय आपके कोड को if स्टेटमेंट्स के पहाड़ के नीचे दबा देंगे। शायद यह हर जगह छिड़के हुए if kind_of? का एक गुच्छा है। या शायद आपको लगता है कि आपको हर जगह nil की जांच करनी होगी। या बदतर, NoMethodErrors हर बार दिखाई देने लगते हैं जब आप एक नई फीचर शिप करते हैं। लगता है एक और हॉटफिक्स का समय आ गया है!

इसे रोकने का एक तरीका है, हालांकि, और इसमें बस थोड़ी सी विचारशीलता लगती है।

मजबूती सिद्धांत

कंप्यूटिंग में एक सिद्धांत है जो कहता है,

आप जो करते हैं उसमें रूढ़िवादी बनें, दूसरों से जो स्वीकार करते हैं उसमें उदार बनें।

आप इस सिद्धांत को अपने रूबी मेथड पर लागू कर सकते हैं। आपके द्वारा लिखे गए मेथड को उचित इनपुट स्वीकार करना चाहिए, और सुसंगत आउटपुट वापस करना चाहिए।

अंतिम भाग पर ध्यान केंद्रित करते हुए: जब कोई आपके द्वारा लिखे गए मेथड को कॉल करता है, तो उन्हें ठीक-ठीक पता होना चाहिए कि वह मेथड क्या वापस करेगा।

अपने आउटपुट के बारे में विचारशील बनें

रेल्स 2.1 के ActiveRecord::Errors#on के कार्यान्वयन पर एक नज़र डालें:

# File activerecord/lib/active_record/validations.rb, line 212 def on(attribute) attribute = attribute.to_s return nil unless @errors.has_key?(attribute) errors = @errors[attribute].map(&:to_s) errors.size == 1 ? errors.first : errors end 

जब कॉल किया जाता है, तो यह या तो Strings का एक Array, एक String, या nil वापस कर सकता है। यह कॉलर पर निर्भर करता है कि वह यह पता लगाए कि वह किस प्रकार के ऑब्जेक्ट के साथ काम कर रहा है। यह एक बुरा विचार है:

  • कॉलर को अपने स्वयं के कोड को घुसपैठ करने वाले टाइप-चेकिंग के साथ गंदा करना पड़ता है।

  • कॉलर को उस मेथड के बारे में बहुत कुछ जानना होगा जिसे वह कॉल कर रहा है। न्यूनतम, उसे मेथड द्वारा वापस किए जा सकने वाले हर प्रकार के ऑब्जेक्ट को जानना होगा और प्रत्येक प्रकार को कब वापस किया जा सकता है।

  • आपके पास टेस्ट करने के लिए अधिक एज केस हैं। यदि आप आश्वस्त होना चाहते हैं कि आपका कोड वही कर रहा है जो उसे करना चाहिए, तो आपको सभी तीन परिदृश्यों को आजमाना होगा।

आपके मेथड को इस बारे में सुसंगत होना चाहिए कि वे क्या वापस करते हैं। यदि आप आमतौर पर एक Array वापस करते हैं, तो हमेशा एक Array वापस करने के लिए आपको जो करना है वह करें। यदि आप आमतौर पर एक User वापस करते हैं, लेकिन कभी-कभी nil वापस करते हैं, तो आप एक नल यूजर ऑब्जेक्ट बना सकते हैं और nil के बजाय वह वापस कर सकते हैं।

आप कम सख्त भी हो सकते हैं: "मैं Taggable मॉड्यूल शामिल करने वाली कोई चीज वापस करने जा रहा हूँ"। आप अधिक सामान्य जा सकते हैं: "मैं id और name विशेषताओं वाली कोई चीज वापस करने जा रहा हूँ।" महत्वपूर्ण बात स्थिरता है और यह सुनिश्चित करना कि आपका कॉलर जानता है कि क्या उम्मीद करनी है।

jQuery एक दिलचस्प उदाहरण है। अधिकांश jQuery मेथड एक ही प्रकार की Array-जैसी ऑब्जेक्ट वापस करते हैं। इस वजह से, jQuery के मेथड अविश्वसनीय रूप से कंपोजेबल हैं, और आप कोड की एक ही लाइन में पागल मात्रा में काम कर सकते हैं।

और यदि आप सोच रहे थे, तो रेल्स ने बाद के संस्करणों में उस मेथड को ठीक कर दिया:

# File activemodel/lib/active_model/errors.rb, line 133 def [](attribute) get(attribute.to_sym) || set(attribute.to_sym, []) end 

अब यह हमेशा एक Array वापस करता है। उनके लिए सरल, और हमारे लिए सरल।

असंगति को मारें

अगली बार जब आप खुद को "एक Array या nil" वापस करते हुए पाएं, तो बस एक Array वापस करें। अपने कोडबेस के माध्यम से देखें और देखें कि आप कहां kind_of? और respond_to? का उपयोग कर रहे हैं। देखें कि क्या आप उन मेथड को रिफैक्टर कर सकते हैं जिन्हें वह कोड कॉल करता है ताकि वे एक ही प्रकार वापस करें।

और देखें कि आपके रिटर्न वैल्यू के बारे में आप जो मान्यताएं बना सकते हैं, वे आपके प्रोजेक्ट के माध्यम से तरंगित होती हैं और आपके सभी आसपास के कोड को सरल बनाती हैं।

  1. Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड

    Map एक Ruby मेथड है जिसका उपयोग आप Arrays, Hashes और Ranges के साथ कर सकते हैं। map का मुख्य उपयोग डेटा को ट्रांसफॉर्म करना है। उदाहरण के लिए: स्ट्रिंग्स की एक सरणी दिए जाने पर, आप हर स्ट्रिंग पर जा सकते हैं और हर कैरेक्टर को UPPERCASE बना सकते हैं। या यदि आपके पास User ऑब्जेक्ट्स की एक सूची है... आ

  1. Ruby में N-क्वीन्स चुनौती में महारत: चरण-दर-चरण समाधान Ruby में N-क्वीन्स चुनौती में महारत: चरण-दर-चरण समाधान

    N-क्वीन्स एक दिलचस्प कोडिंग चुनौती है जहां आपको N * N बोर्ड पर N क्वीन्स रखनी होती हैं। यह ऐसा दिखता है: एक क्वीन्स सभी दिशाओं में चल सकती है: वर्टिकल हॉरिजॉन्टल डायगोनल समाधान (कई हो सकते हैं) को बोर्ड पर सभी क्वीन्स रखनी चाहिए और हर क्वीन्स हर दूसरी क्वीन्स की पहुंच से बाहर होनी चाहिए। इस लेख म

  1. अपने रूबी कोड को उन्नत करें: क्लीनर OOP डिज़ाइन के लिए सामंजस्य और कपलिंग में महारत हासिल करें अपने रूबी कोड को उन्नत करें: क्लीनर OOP डिज़ाइन के लिए सामंजस्य और कपलिंग में महारत हासिल करें

    सामंजस्य (Cohesion) और कपलिंग (Coupling) दो सबसे महत्वपूर्ण ऑब्जेक्ट-ओरिएंटेड सिद्धांत हैं। सामंजस्य एक क्लास के अंदर सभी मेथड्स के बीच संबंध के बारे में है। क्या वे इंस्टेंस वेरिएबल्स और पैरामीटर्स के उसी सेट का उपयोग कर रहे हैं, सभी एक ही लक्ष्य की ओर मिलकर काम कर रहे हैं? या हर मेथड एक-दूसरे से अ