हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है?
समस्या यह है कि Rails आर्किटेक्चर, मॉडल-व्यू-कंट्रोलर, आपको अपने कोड को रखने के लिए एक बुनियादी संरचना देता है।
लेकिन यह पर्याप्त नहीं है।
आपके व्यूज़ बड़े और लॉजिक से भरे हो जाते हैं जब उनका लक्ष्य जानकारी प्रस्तुत करना होता है।
आपके कंट्रोलर्स उन विवरणों को रखते हैं जो कंट्रोलर के लिए उसके आवश्यक कार्य करने के लिए आवश्यक से परे हैं।
समाधान क्या है?
हमने इन समस्याओं को हल करने के लिए डिज़ाइन पैटर्न के रूप में दो समाधान बनाए हैं।
- द प्रेजेंटर पैटर्न
- द सर्विस ऑब्जेक्ट पैटर्न
हर कोई इस बात पर सहमत नहीं है कि उन्हें कैसे ठीक से लागू किया जाए, लेकिन मैं आपको वह संस्करण दूंगा जो मेरे लिए काम करता है।
आइए इन पैटर्न का पता लगाएं!
Rails में Presenters का उपयोग कैसे करें
व्यूज़ प्रस्तुति के लिए हैं, इसका मतलब है HTML, CSS, और ERB (एंबेडेड Ruby)।
व्यूज़ में कोई ActiveRecord क्वेरी नहीं होनी चाहिए।
और अधिकांश लॉजिक को छोड़ दिया जाना चाहिए यदि आप अपने व्यूज़ को यथासंभव साफ और काम करने में आसान रखना चाहते हैं।
"लॉजिक" से मेरा मतलब है if स्टेटमेंट्स और टर्नरी ऑपरेटर्स के साथ निर्णय लेना
अब सवाल है...
कैसे?
व्यूज़ में लॉजिक को संभालने के लिए आपका पहला टूल हेल्पर्स का उपयोग करना है।
हेल्पर्स बहुत अच्छे हैं जब भी आपके पास एक ग्लोबल फॉर्मेटिंग मेथड होता है जिसका उपयोग आप कई व्यूज़ में करते हैं।
उदाहरण के लिए:
Markdown रेंडर करना, एक विशिष्ट फॉर्मेट में तारीखें दिखाना, टेक्स्ट से विशिष्ट शब्दों को हटाना, आदि।
इस तरह:
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>
वहाँ आप जाएं!
- हमने व्यू से सभी लॉजिक को हटा दिया
- हमने फॉर्मेटिंग और निर्णय लेने के संचालन के लिए सार्थक नाम जोड़े
- हम कोड डुप्लिकेट किए बिना अन्य व्यूज़ में इस क्लास का पुनः उपयोग कर सकते हैं
यही है कि आप Rails में प्रेजेंटर का उपयोग कैसे करते हैं 🙂
Service Objects का उपयोग कैसे करें
आपके कंट्रोलर्स को केवल दूसरों को बताना चाहिए कि क्या करना है, उन्हें इस बारे में कोई ज्ञान नहीं होना चाहिए कि ट्वीट कैसे भेजें, ग्राहक से शुल्क कैसे लें या PDF फाइलें कैसे जनरेट करें।
ये ऑपरेशन डेलिगेट किए जाने चाहिए एक सर्विस ऑब्जेक्ट को।
एक सर्विस ऑब्जेक्ट, जैसा कि मैं इसे परिभाषित करता हूं, एक Ruby मॉड्यूल है जो एक एक्शन को पूरा करने के लिए लॉजिक को एनकैप्सुलेट करता है।
उदाहरण:
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 जैसी फाइल।
आप इसका उपयोग कैसे करते हैं?
क्योंकि Rails app/ से सब कुछ ऑटोलोड करता है, यह कोड आपके कंट्रोलर्स में उपलब्ध होगा।
उदाहरण:
class UsersController
def create
# ...
TwitterService.send_welcome_message(user.twitter_handle)
end
end
यही है सर्विस ऑब्जेक्ट पैटर्न एक्शन में।
सारांश
आपने दो उपयोगी Rails पैटर्न सीखे हैं जो बुद्धिमानी से उपयोग किए जाने पर आपके प्रोजेक्ट की कोड क्वालिटी को बेहतर बनाने में मदद करेंगे!
अब उन्हें लागू करने की आपकी बारी है 🙂
पढ़ने के लिए धन्यवाद।