আপনার রেইলস অ্যাপ লিখার সময়, আপনি এমন একটি সমস্যায় পড়তে পারেন যা আপনি একটি ভিন্ন ডেটা স্টোর দিয়ে সহজে সমাধান করতে পারেন। উদাহরণস্বরূপ, আপনার একটি লিডারবোর্ড থাকতে পারে যা ইউজারকে র্যাঙ্ক করে তাদের সাইটে প্রশ্নের উত্তর দিয়ে পাওয়া পয়েন্টের সংখ্যা অনুযায়ী। Redis Sorted Sets দিয়ে, ইমপ্লিমেন্টেশনের অনেক অংশই আপনার জন্য করা থাকে। চমৎকার! কিন্তু আপনি Redis-এর সাথে ইন্টারঅ্যাক্ট করার কোড কোথায় রাখবেন?
আপনার User মডেল Redis-এ কথা বলতে পারে:
class User < ActiveRecord::Base
def award_points(points)
Redis.current.zincrby("leaderboard", points, id)
end
end
তবে এখন আপনার User মডেল একজন ইউজারকে রিপ্রেজেন্ট করার দায়িত্ব ধরে, Redis-এ কথা বলছে, এবং লিডারবোর্ড ম্যানেজ করছে! এটি User-কে বুঝতে কঠিন করে এবং টেস্ট করতে কঠিন করে, এবং এটি আপনি যা চান তার বিপরীত।
বদলে, আপনি Redis রিকোয়েস্টগুলো একটি নতুন অবজেক্টে র্যাপ করতে পারেন যা রিপ্রেজেন্ট করে আপনি Redis কিসের জন্য ব্যবহার করছেন। উদাহরণস্বরূপ, আপনি একটি Leaderboard ক্লাস তৈরি করতে পারেন যা Redis কমিউনিকেশন র্যাপ করে, না 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 ক্লাস Redis-এ কমিউনিকেশন ম্যানেজ করে, তাই User ক্লাসকে আর লিডারবোর্ড কীভাবে ইমপ্লিমেন্ট করা হয় সেটি কয়েক করলে হবে না। এটি টেস্ট করাও সহজ করে।
নতুন দায়িত্বের জন্য নতুন ক্লাস তৈরি করলে আপনি অনেক কিছু পান, এবং app/models সেগুলো রাখার একটি চমৎকার জায়গা। আপনি আপনার ফিচারের ইমপ্লিমেন্টেশনের জন্য অন্য সার্ভিসে লিন করার বেনিফিট পান, সাথে সাথে আপনার কোড সহজে কাজ করার লायक রাখেন।
চেষ্টা করুন
আপনি কি কোনো নেটওয়ার্ক সার্ভিস কমিউনিকেশন চিনতে পারেন যা সরাসরি আপনার ActiveRecord মডেল, কন্ট্রোলার, বা ভিউ থেকে কল হয়? সেটি একটি নন-ActiveRecord ডেটা মডেলে মুভ করার চেষ্টা করুন, এবং দেখুন আপনার কোড কি বুঝতে, কাজ করতে, এবং টেস্ট করতে সহজ হয়। তারপর, আমাকে ইমেইল পাঠান এবং বলুন কীভাবে গেল!
শুধু মনে রাখুন:
কম্পিউটার সায়েন্সের সকল সমস্যা অন্য একটি লেভেল অফ ইন্ডিরেকশন দিয়ে সমাধান করা যায়।
— ডেভিড হুইলার
...তবে "তúl many layers of indirection" সমস্যা ছাড়া।
— কেভলিন হেনি