जब आप अपना रेल्स ऐप लिख रहे होते हैं, तो आप एक ऐसी समस्या में पड़ सकते हैं जिसे आप एक अलग डेटा स्टोर के साथ अधिक आसानी से हल कर सकते हैं। उदाहरण के लिए, आपके पास एक लीडरबोर्ड हो सकता है जो यूजर्स को आपकी साइट पर सवालों के जवाब देने के लिए मिले पॉइंट्स की संख्या के आधार पर रैंक करता है। रेडिस सॉर्टेड सेट्स के साथ, बहुत सारा कार्यान्वयन आपके लिए किया जाता है। बहुत बढ़िया! लेकिन आप रेडिस के साथ इंटरैक्ट करने वाले कोड को कहां रखते हैं?
आपका User मॉडल रेडिस से बात कर सकता है:
class User < ActiveRecord::Base
def award_points(points)
Redis.current.zincrby("leaderboard", points, id)
end
end
लेकिन अब आपका User मॉडल एक यूजर को प्रतिनिधित्व करने, रेडिस से बात करने, और लीडरबोर्ड प्रबंधित करने की जिम्मेदारी रखता है! ये User को समझना और टेस्ट करना कठिन बना देता है, और ये वही है जो आप नहीं चाहते।
इसके बजाय, आप रेडिस अनुरोधों को एक नए ऑब्जेक्ट में लपेट सकते हैं जो इसका प्रतिनिधित्व करता है कि आप रेडिस का उपयोग किस लिए कर रहे हैं। उदाहरण के लिए, आप एक Leaderboard क्लास बना सकते हैं जो रेडिस कम्युनिकेशन को लपेटती है, नहीं ActiveRecord::Base से इनहेरिट करती, लेकिन फिर भी app/models डायरेक्टरी में रहती है। ये इस तरह दिखेगा:
class Leaderboard
def award_points_to_user(user_id, points)
Redis.current.zincrby("leaderboard", points, user_id)
end
end
class User < ActiveRecord::Base
def award_points(leaderboard, points)
leaderboard.award_points_to_user(id, points)
end
end
ये दोनों क्लासेज app/models में रह सकती हैं, लेकिन अब आप अपने एक्टिवरिकॉर्ड मॉडल्स को अतिरिक्त लॉजिक से दूषित नहीं कर रहे हैं। Leaderboard क्लास रेडिस के साथ कम्युनिकेशन का प्रबंधन करती है, इसलिए User क्लास को अब इस बात की परवाह नहीं करनी पड़ती कि लीडरबोर्ड कैसे कार्यान्वित किए जाते हैं। ये इसे टेस्ट करना भी आसान बनाता है।
नई जिम्मेदारियों के लिए नई क्लासेज बनाकर आप बहुत कुछ हासिल करते हैं, और app/models उन्हें रखने के लिए एक बेहतरीन जगह है। आपको अपनी फीचर के कार्यान्वयन के लिए किसी अन्य सर्विस पर निर्भर रहने के लाभ मिलते हैं, जबकि आपका कोड समझने, काम करने और टेस्ट करने में आसान रहता है।
इसे आज़माएं
क्या आप किसी नेटवर्क सर्विस कम्युनिकेशन के बारे में सोच सकते हैं जिसे सीधे आपके एक्टिवरिकॉर्ड मॉडल्स, कंट्रोलर्स, या व्यूज़ से कॉल किया जाता है? उस कोड को एक नॉन-एक्टिवरिकॉर्ड डेटा मॉडल में ले जाने की कोशिश करें, और देखें कि क्या आपका कोड समझने, काम करने और टेस्ट करने में आसान हो जाता है। फिर, मुझे ईमेल भेजें और मुझे बताएं कि ये कैसा रहा!
बस याद रखें:
कंप्यूटर साइंस की सभी समस्याओं को इंडिरेक्शन के एक और स्तर से हल किया जा सकता है।
— डेविड व्हीलर
...बहुत अधिक इंडिरेक्शन की समस्या को छोड़कर।
— केव्लिन हेनी