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

रूबी की स्ट्रैटेजी पैटर्न में महारत: एल्गोरिदम को डायनामिकली स्वैप करें और ओपन/क्लोज्ड सिद्धांत का पालन करें

आइए स्ट्रैटेजी डिज़ाइन पैटर्न के बारे में बात करते हैं!

यह डिज़ाइन पैटर्न आपको एक मेथड के अंदर मुख्य एल्गोरिदम को बदलने में मदद करता है।

आप इसे एक क्लास पास करके करते हैं जो इस एल्गोरिदम को लागू करता है, बजाय इसे क्लास में हार्डकोड करने के।

और जब मैं एल्गोरिदम कहता हूं तो मेरा मतलब फैंसी कंप्यूटर साइंस एल्गोरिदम से नहीं है, बल्कि किसी भी कोड से है जो परिणाम प्राप्त करने के लिए चरणों के अनुक्रम का पालन करता है।

स्ट्रैटेजी पैटर्न का उपयोग कब करें

यह पैटर्न वास्तव में कौन सी समस्या हल कर रहा है?

ओपन/क्लोज्ड सिद्धांत की समस्या।

यह सिद्धांत कहता है कि:

"सॉफ्टवेयर एंटिटीज (क्लासेस, मॉड्यूल्स, मेथड्स) विस्तार के लिए खुली होनी चाहिए और संशोधन के लिए बंद।"

इसका मतलब है कि एक क्लास को नई चीजें करने के लिए आपको क्लास को स्वयं नहीं बदलना चाहिए। यह आपके कोड को अधिक लचीला और मजबूत बनाता है।

लेकिन आप इसे कैसे पूरा करते हैं?

स्ट्रैटेजी पैटर्न जैसे डिज़ाइन पैटर्न का उपयोग करके 🙂

मान लीजिए आपके पास एक ReportGenerator क्लास है, और आप उसी डेटा का उपयोग करके कई प्रकार की रिपोर्ट फॉर्मेट्स जनरेट करना चाहते हैं।

आप प्रत्येक रिपोर्ट प्रकार के लिए एक मेथड लिख सकते हैं, लेकिन इसका मतलब होगा कि हर बार जब आप एक नया प्रकार जोड़ना चाहते हैं तो आपको क्लास को बदलना होगा (एक नया मेथड जोड़कर), ओपन/क्लोज सिद्धांत को तोड़ना।

या इससे भी बदतर!

आपके पास सभी प्रकार के if स्टेटमेंट्स के साथ एक विशाल एकल मेथड हो सकता है… ये अक्सर अच्छी तरह से समाप्त नहीं होते।

लेकिन क्या होगा अगर क्लास को यह नहीं पता होता कि रिपोर्ट्स को कैसे फॉर्मेट करना है?

क्या होगा अगर एल्गोरिदम क्लास के बाहर से आया?

तब हम जब चाहें फॉर्मेटिंग एल्गोरिदम को बदल सकते हैं बिना क्लास को बदले।

यह समस्या हल करता है।

और यही स्ट्रैटेजी पैटर्न के बारे में है।

स्ट्रैटेजी पैटर्न उदाहरण

एक स्ट्रैटेजी को एक सिंगल मेथड वाली क्लास के रूप में लागू किया जाता है।

यहां ReportGenerator क्लास के लिए कुछ फॉर्मेटिंग स्ट्रैटेजी हैं:

 require 'json' module ReportFormatters class JSON def self.format(data) data.to_json end end class PlainText def self.format(data) data.to_s end end class HTML def self.format(data) html = "" html << "
    " data.each { |product, amount| html << "
  • #{product}: #{amount}
  • " } html << "
" html end end end

ध्यान दें कि सभी स्ट्रैटेजी format मेथड को लागू करती हैं। यह मेथड रिपोर्ट जनरेटर क्लास द्वारा कॉल किया जाएगा।

यहां कोड है:

 class ReportGenerator def self.generate(data, formatter) formatter.format(data) end end data = { onions: 31, potatoes: 24, eggs: 10 } p ReportGenerator.generate(data, ReportFormatters::HTML) p ReportGenerator.generate(data, ReportFormatters::JSON) p ReportGenerator.generate(data, ReportFormatters::PlainText) 

अब:

यदि आप आउटपुट फॉर्मेट बदलना चाहते हैं ( HTML से PlainText ) तो आपको बस एक अलग स्ट्रैटेजी पास करनी होगी और यह तब तक काम करेगा जब तक स्ट्रैटेजी format मेथड को लागू करती है।

इस पैटर्न के बारे में सोचने का एक और तरीका यह है कि आप एक सलाहकार को काम पर रख रहे हैं जो एक विशिष्ट व्यावसायिक रणनीति में विशेषज्ञ है, सलाहकार आएगा और आपके लिए रणनीति लागू करेगा, फिर यह रणनीति एक विशिष्ट परिणाम उत्पन्न करेगी।

इसके विपरीत, डेकोरेटर पैटर्न जैसा पैटर्न क्रिसमस ट्री में नए आभूषण जोड़कर उसे अधिक आकर्षक बनाने जैसा है।

आप एक समय में केवल 1 रणनीति के साथ काम कर सकते हैं, लेकिन आप जितने चाहें उतने आभूषण रख सकते हैं।

वीडियो

सारांश

आपने स्ट्रैटेजी डिज़ाइन पैटर्न के बारे में सीखा, इसका उपयोग तब करें जब आपको अपने क्लास के काम के हिस्से को बदलने की आवश्यकता हो बिना क्लास को बदले।

पढ़ने के लिए धन्यवाद!

अगर आपको यह दिलचस्प लगा तो इस पोस्ट को ट्विटर पर शेयर करना न भूलें, इससे अधिक लोग इसका आनंद ले सकेंगे 🙂

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

    आइए grep मेथड के बारे में बात करते हैं। यह मेथड आपके लिए क्या कर सकता है? आप enumerable ऑब्जेक्ट्स को फ़िल्टर करने के लिए Grep का उपयोग कर सकते हैं, जैसे Arrays और Ranges। "लेकिन select पहले से ही ऐसा करता है!" हाँ, लेकिन grep अलग तरीके से काम करता है और अलग परिणाम उत्पन्न करता है। आइए कुछ

  1. रूबी ऑब्जेक्ट्स को डेकोरेटर पैटर्न से बढ़ाएं: एक व्यावहारिक गाइड रूबी ऑब्जेक्ट्स को डेकोरेटर पैटर्न से बढ़ाएं: एक व्यावहारिक गाइड

    डेकोरेटर डिज़ाइन पैटर्न क्या है? और आप इस पैटर्न का उपयोग अपने रूबी प्रोजेक्ट्स में कैसे कर सकते हैं? डेकोरेटर डिज़ाइन पैटर्न आपको क्लास को बदले बिना नई क्षमताएं जोड़कर एक ऑब्जेक्ट को बढ़ाने में मदद करता है। आइए एक उदाहरण देखें! लॉगिंग और प्रदर्शन इस उदाहरण में हम rest-client जैसे जेम का उपयोग करके

  1. रूबी एरे में महारत: व्यावहारिक उदाहरण और आवश्यक मेथड्स रूबी एरे में महारत: व्यावहारिक उदाहरण और आवश्यक मेथड्स

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