কম্পিউটার টিউটোরিয়াল

যখন ActiveRecord মডেল খুব ভারী হয়: কমপ্লেক্সিটি চেনা ও ম্যানেজ করা

রেইলস ব্লগ, বই পড়লে বা কনফারেন্স টক দেখলে, মডেল স্লিম রাখার много কিছু শিখবেন।

এই টেকনিকগুলো চমৎকার, কারণ আপনার মডেলগুলো বড় বা জটিল হয়ে যাবে হ্যান্ডেল করতে। কিন্তু আপনি কি চান মডেল শুধু persistence, associations, এবং validations-র জন্য দায়ী থাকুক? আপনার ActiveRecord মডেলে কতটুকু লজিক থাকা উচিত সেটা কীভাবে ডিসাইড করবেন?

স্লিম। কিন্তু খুব স্লিম নয়।

Active Record প্যাটার্ন সেরা কাজ করে যখন আপনার মডেলগুলো ডেটাবেস স্কিমার সাথে নিকটভাবে মেলে। সেটার জন্য ডিজাইন করা! তবে এটা মানে কী?

  • কোনো কোড যদি ActiveRecord মডেলের পয়েন্ট অফ ভিউ থেকে কাজ করে, সেটা মডেলে যেতে পারে।

  • যদি কোড একাধিক টেবিল/অবজেক্ট ছড়িয়ে কাজ করে, এবং কোনো ক্লিয়ার ওয়নার নেই, সেটা Servic Object-এ যেতে পারে।

  • অ্যাট্রিবিউট-লাইক যেকোনো জিনিস (অ্যাসোসিয়েশন বা অন্যান্য অ্যাট্রিবিউট থেকে ক্যালকুলেটেড অ্যাট্রিবিউট) ActiveRecord মডেলে যেতে পারে।

  • যদি লজিক একাধিক মডেল একসাথে সেভ বা আপডেট করতে orchestre করে, সেটা ActiveModel Form Object-এ যেতে পারে।

  • যদি কোড মূলত ভিউতে মডেল ডিসপ্লে বা ফরম্যাট করার জন্য, সেটা রেইলস হেল্পার বা প্রেজেন্টারে যেতে পারে।

এই গাইডলাইনের বাইরে, বড় হয়ে যাওয়া যেকোনো ক্লাস রিফ্যাক্টর করার সাধারণ রুলগুলো ফলো করুন। কিন্তু সাধারণত, ActiveRecord মডেলে কিছু লজিক রাখতে বুরা ফিল করবেন না। সেগুলো সেটার জন্যই মেইন্টেইন করা হয়!

তাহলে, যেহেতু রেইলস Active Record প্যাটার্ন বাছায়, মডেলে কিছু লজিক থাকা লজিক্যাল। কিন্তু রেইলস সেটা কেন বাছায় ক্লিনার প্যাটার্ন ছাড়া?

রুবি কী করত?

Patterns of Enterprise Application Architecture-এ, Active Record প্যাটার্ন Row Data Gateway এবং Data Mapper-এর মাঝপথে আছে। Row Data Gateway হলো টেবিল রোয়ের মোষ্টলি ডাম্ব OO র‍্যাপার, সবচেয়ে স্লিম মডেল। Data Mappers Active Record চেয়ে কমপ্লেক্স, এবং মূলত বিজনেস লজিক শুধু ধারণকারী অবজেক্ট এবং persistence লজিক শুধু ধারণকারী অবজেক্টের মাঝে কনভার্ট করতে ব্যবহৃত হয়।

রুবির কনটেক্সটে, Active Record নিঃসন্দেহে সঠিক ডিফল্ট প্যাটার্ন।

কেন বলছি?

রুবি ডিজাইন করা হয়েছে প্রোগ্রামারকে খুশি করার জন্য। ক্লিনেন্স এবং কনভেনিয়েন্সের মধ্যে ট্রেড-অফ ফোর্স করা হলে, প্রায়শই কনভেনিয়েন্স বাছায়।

মানে, Array-র পাবলিক API-তে ১০০-এর বেশি মেথড আছে। একই জিনিসের অ্যালিয়াস মেথডও খুব আছে। কারণ কিছু ডেভেলপার .detect লিখতে পছন্দ করে .find-এর চেয়ে।

সেটা কনটেক্সটে, রেইলস ডিফল্ট হিসেবে এমন প্যাটার্ন বাছাবে যা কনভেনিয়েন্ট, আরও ফ্লেক্সিবল বা বেশি OO purity বা না - এটা বুঝতে পারা। এটা রুবি-ওয়ে। এবং আমি এটা ভালোবাসি।

প্রয়োজন হলে আপনি সবসময় আরও ফ্লেক্সিবল প্যাটার্নে রিফ্যাক্টর করতে পারেন। কিন্তু YAGNI।

  1. ডেটা মডেলের উত্ক্রম

  2. ডজ্যাঙ্গোতে মডেলে ডেটা ইম্পোর্ট করা

  3. ডজ্যাঙ্গোতে মডেল ডেটা এক্সপোর্ট করা

  4. TensorFlow-এ সিকোয়েনশিয়াল মডেল কখন ব্যবহার করব এবং উদাহরণ