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