हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है?
समस्या यह है कि रेल आर्किटेक्चर, मॉडल-व्यू-कंट्रोलर, आपको अपना कोड डालने के लिए एक बुनियादी संरचना देता है।
लेकिन यह काफी नहीं है।
आपके विचार बड़े और तर्क से भरे होते हैं जब उनका लक्ष्य जानकारी प्रस्तुत करना होता है।
नियंत्रक के लिए आवश्यक कार्य करने के लिए जो आवश्यक है उससे परे आपके नियंत्रक विवरण रखते हैं।
समाधान क्या है?
इन समस्याओं को हल करने के लिए हमने डिज़ाइन पैटर्न के रूप में दो समाधान तैयार किए हैं।
- प्रस्तुतकर्ता पैटर्न
- सेवा ऑब्जेक्ट पैटर्न
हर कोई इस बात से सहमत नहीं है कि उन्हें वास्तव में कैसे लागू किया जाए, लेकिन मैं आपको वह संस्करण दूंगा जो मेरे लिए काम करता है।
आइए इन पैटर्न को एक्सप्लोर करें!
रेल में प्रस्तुतकर्ताओं का उपयोग कैसे करें
व्यूज प्रेजेंटेशन के लिए हैं, यानी एचटीएमएल, सीएसएस, और ईआरबी (एम्बेडेड रूबी)।
कोई ActiveRecord नहीं होना चाहिए विचारों में प्रश्न।
और अधिकांश तर्क को छोड़ देना चाहिए यदि आप चाहते हैं कि आपके विचार यथासंभव स्वच्छ और काम करने में आसान हों।
<ब्लॉकक्वॉट>"तर्क" से मेरा मतलब है कि बयानों और टर्नरी ऑपरेटरों के साथ निर्णय लेना
अब सवाल है...
कैसे?
विचारों में तर्क को संभालने के लिए आपका पहला उपकरण सहायकों का उपयोग करना है।
जब भी आपके पास एक वैश्विक स्वरूपण पद्धति होती है जिसे आप कई दृश्यों में उपयोग करते हैं तो सहायक बहुत अच्छे होते हैं।
उदाहरण के लिए :
मार्कडाउन का प्रतिपादन, विशिष्ट प्रारूप में तिथियां दिखाना, टेक्स्ट से विशिष्ट शब्दों को हटाना आदि।
इसे पसंद करें :
module DateHelper
def date_as_month_and_year(date)
date.strftime("%B %Y")
end
end
आप इस कोड को app/helpers . के अंतर्गत सहेज सकते हैं फ़ोल्डर और date_helper.rb फ़ाइल।
यहां एक युक्ति दी गई है :
हमेशा तर्कों के माध्यम से सहायक विधियों में इनपुट पास करें, कभी भी आवृत्ति चर पर भरोसा न करें।
यह आपको बहुत परेशानी से बचाएगा।
सहायक विधियों की सीमाएं हैं , खासकर यदि आप उनका उपयोग अपने विचारों में प्रत्येक स्वरूपण आवश्यकता के लिए करते हैं।
वे किसी भी प्रकार के संगठन का निर्माण और अभाव करते हैं।
समाधान आ रहा है!
प्रस्तुतकर्ता वस्तु के साथ जटिल सशर्त और स्वरूपण विधियों को बदलें
मान लें कि आपके पास ऐसा दृश्य है:
<p>
Post title: <%= post.title.gsub("forbidden word", "") %>
<%= link_to "Read post", post, class: "w-75 p-3 text-#{post.draft? ? "orange" : "green"} border-#{post.draft? ? "orange" : "green"}" %>
</p>
बहुत छोटा दृश्य, है ना?
लेकिन इन टर्नरी ऑपरेटरों और डुप्लीकेट कोड के साथ यह बहुत जटिल लगता है।
अच्छा नहीं!
आइए इसे हल करने के लिए एक प्रस्तुतकर्ता वर्ग बनाएं।
यहां बताया गया है :
class PostPresenter
def initialize(post)
@post = post
end
def title_without_forbidden_words
@post.title.gsub("forbidden word", "")
end
def css_color
@post.draft? ? "orange" : "green"
end
end
इसे app/presenters/post_presenter.rb के अंतर्गत सहेजें , presenters बनाएं फ़ोल्डर अगर आपके पास नहीं है।
अब आप दृश्य बदल सकते हैं।
इसे पसंद करें :
<% presenter = PostPresenter.new(post) %>
<p>
Post title: <%= presenter.title_without_forbidden_words %>
<%= link_to "Read post", post, class: "w-75 p-3 text-#{presenter.css_color} border-#{presenter.css_color}" %>
</p>
वहाँ तुम जाओ!
- हमने दृश्य से सभी तर्क हटा दिए हैं
- हमने प्रारूपण और निर्णय लेने के कार्यों के लिए सार्थक नाम जोड़े हैं
- कोड की नकल किए बिना हम इस वर्ग को अन्य दृश्यों में पुन:उपयोग कर सकते हैं
इस तरह आप रेल में प्रस्तुतकर्ताओं का उपयोग करते हैं 🙂
सेवा वस्तुओं का उपयोग कैसे करें
आपके नियंत्रकों को केवल दूसरों को बताना चाहिए कि उन्हें क्या करना है, उन्हें इस बारे में कोई जानकारी नहीं होनी चाहिए कि ट्वीट कैसे भेजें, ग्राहक से शुल्क कैसे लें या पीडीएफ फाइलें कैसे बनाएं।
ये संचालन प्रत्यायोजित किया जाना चाहिए सेवा वस्तु के लिए।
एक सेवा वस्तु, जैसा कि मैं इसे परिभाषित करता हूं, एक रूबी मॉड्यूल है जो एक क्रिया को पूरा करने के लिए तर्क को समाहित करता है।
उदाहरण :
module TwitterService
def self.send_welcome_message(twitter_handle)
client.update("@#{twitter_handle} welcome to 'Oranges & Apples', we hope you enjoy our juicy fruit!")
end
def self.client
@client ||= Twitter::REST::Client.new do |config|
config.consumer_key = "..."
config.consumer_secret = "..."
config.access_token = "..."
config.access_token_secret = "..."
end
end
end
कन्वेंशन इसे एक app/services . के तहत सहेजना है फ़ोल्डर, और एक फ़ाइल जैसे twitter_service.rb ।
आप इसका उपयोग कैसे करते हैं?
क्योंकि रेल app/ . से सब कुछ स्वतः लोड कर देता है , यह कोड आपके नियंत्रकों में उपलब्ध होगा।
उदाहरण :
class UsersController
def create
# ...
TwitterService.send_welcome_message(user.twitter_handle)
end
end
यह सेवा ऑब्जेक्ट पैटर्न कार्रवाई में है।
सारांश
आपने दो उपयोगी रेल पैटर्न सीखे हैं जो समझदारी से उपयोग किए जाने पर आपके प्रोजेक्ट की कोड गुणवत्ता को बेहतर बनाने में आपकी मदद करेंगे!
उन्हें लागू करने की अब आपकी बारी है 🙂
पढ़ने के लिए धन्यवाद।