আপনার রেইলস প্রজেক্টে ব্যবহার করার জন্য সেরা রুবি জেমগুলো কী কী?
এই আর্টিকেলে সেটি আপনি জানবেন!
আমি আপনাকে ৭টি জেম দেব, কিন্তু পুরনো জেমগুলো নয় যা আপনি লক্ষ লক্ষ বার দেখেছেন, আমি আপনাকে কিছু জেম শেয়ার করবো যা খুব সহায়ক কিন্তু কম পরিচিত।
তবে তার আগে…
একটি সতর্কতা।
আমি এমন ডেভেলপারদের দেখেছি যারা প্রায় সব কিছুর জন্য জেম খین্ছে নেয়।
যদি এটি রিমোটলি সহায়ক লাগে।
এক মুহূর্ত চিন্তা না করে যে সেটি তাদের সমস্যা সমাধান করছে কিনা, সেটি সেরা অপশন কিনা, ভালো মেইনটেইনড ও ডকুমেন্টেড কিনা, ইত্যাদি।
এটি একটি ভুল।
কেন?
কারণ আপনার প্রজেক্ট যত বেশি জিনিসের ওপর ডিপেন্ড করবে, জিনিসগুলো পরিবর্তন হলে সেটি ব্রেক হওয়ার সম্ভাবনা তত বেশি।
এবং জিনিসগুলো সবসময় পরিবর্তন হয়।
নতুন রেইলস ভার্সন, নতুন রুবি ভার্সন, নতুন ফিচার, ইত্যাদি।
उसক সাথ…
জেমগুলো আপনাকে অনেক কাজ বাঁচাতে পারে, কোড ক্লিন করতে সাহায্য করতে পারে, এবং সিকিউরিটি ইস্যু এড়াতে পারে, তাই বুদ্ধিমানভাবে ব্যবহার করুন!
এখন:
চলুন লিস্টে যাই।
১. মরত রুট খুঁজে বের করুন কোড ক্লিন রাখতে
আপনার রেইলস অ্যাপ্লিকেশন বড় হলে, আপনি 점점 বেশি রুট জমা করবেন।
আপনি কোড পরিবর্তন করবেন এবং এই রুটগুলো পুরনো হয়ে যাবে।
আর দরকার নেই…
কিন্তু সেগুলো আপনার config/routes.rb এ পড়ে থাকবে, ম্যানেজ করা কঠিন করে দিয়ে।
কোন রুটগুলো ডিলিট করতে হবে সেটি কীভাবে জানবেন?
traceroute নামক একটি জেম আছে।
এটি আপনার রুটগুলো লোড করে এবং সেগুলো আপনার ডিফাইন করা কন্ট্রোলার অ্যাকশনদের সাথে তুলনা করে।
কিন্তু এখন এর দুটি লিমিটেশন রয়েছে:
- রেইলস ৬ সাপোর্ট করে না
- ইমপ্লিসিট কন্ট্রোলার অ্যাকশন ডিটেক্ট করে না
রেইলস ৬ সাপোর্ট যোগ করতে আমি একটি পুল রিকোয়েস্ট পাঠিয়েছিলাম, কিন্তু আমার নিজের একটি ভার্সনও আছে যেটিতে এই লিমিটেশনগুলো নেই।
আপনি এখানে পেতে পারেন।
২. আপনার মাইগ্রেশন নিরাপদ করুন সমস্যা এড়াতে
রেইলস মাইগ্রেশন ভুল হলে অনেক সমস্যা সৃষ্টি করতে পারে।
উদাহরণ:
একটি কলাম রিমুভ করলে সমস্যা হয় কারণ রেইলসের একটি কলাম ক্যাশ রয়েছে, এবং মাইগ্রেশন রান করলে এই ক্যাশ রিসেট হয় না।
আরেক উদাহরণ:
আপনি যদি একটি ইনডেক্স যোগ করেন এবং PostgreSQL রান করছেন, তবে পুরো টেবিল লক থাকবে যতক্ষণ না অপারেশনটি কমপ্লিট হয়।
আপনার ইউজারদের জন্য ভালো নয়।
আপনার অ্যাপ্লিকেশন সেই লক করা টেবিলের সাথে কাজ করার রিকোয়েস্ট রেসপন্ড করতে পারবে না।
ভালো খবর?
আপনাকে এই সব জিনিস মনে রাখতে হবে না।
strong_migrations জেমের সাহায্যে, আপনি প্রোডাকশনে যাওয়ার আগে জানতে পারবেন আপনার কাছে অনসেফ মাইগ্রেশন আছে কিনা।
৩. অনসেফ ট্রানজ্যাকশন প্রিভেন্ট করুন
একটি রেইলস ট্রানজ্যাকশন কথায় "all or nothing" অপারেশন হয়ে থাকা উচিত।
এটি এইরকম দেখে:
Book.transaction do # ... end
কিন্তু আপনি যদি transaction কন্ট্রোলের বাইরে কিছু করেন, যেমন ফাইলে লিখা, বা API রিকোয়েস্ট করা, তবে এই "all or nothing" ইফেক্ট আর সত্য নয়।
আপনি কল্পনা করতে পারেন, এতে সব ধরনের সমস্যা হয়।
সমাধান কী?
খুব হাই-টেক নয়, সত্যি "সাইড ইফেক্ট" এড়িয়ে চলুন, বা ট্রানজ্যাকশনের "বাইরের ওয়ার্ল্ড" কে প্রভাবিত করা জিনিসগুলো করবেন না।
isolator জেম এতে সাহায্য করতে পারে।
এটি আপনার সকল ট্রানজ্যাকশন অডিট করে নিশ্চিত করতে যে সেগুলো নিরাপদ।
আপনাকে শুধু জেমটি ইনস্টল করতে হবে, তারপর যখন এটি একটি খারাপ transaction ডিটেক্ট করবে এটি এক্সেপশন রেইজ করবে।
এবার ট্রাই করুন!
৪. আপনার স্লো টেস্ট খুঁজে বের করুন এবং সেগুলো ফাস্ট করুন
স্লো টেস্ট মজার নয়।
কিন্তু আপনার টেস্টগুলো কেন স্লো সেটি খুঁজে বের করার এবং ফিক্স করার টুল রয়েছে!
এই টুলগুলোর মধ্যে একটি হলো test-prof + ruby-prof কম্বিনেশন।
এভাবে ব্যবহার করুন:
TEST_RUBY_PROF=1 rake
আউটপুট:
%self total self wait child calls name 43.21 2.001 2.001 0.000 0.000 1 Kernel#sleep 2.97 0.184 0.138 0.000 0.046 1640 Array#permutation 1.39 0.064 0.064 0.000 0.000 144 PG::Connection#async_exec
এখানে আমি স্পষ্টভাবে আমার sleep কলটি দেখতে পাচ্ছি, কিন্তু এটি সহজেই একটি API কল, বড় ফাইল পড়া, স্লো SQL ক্যোয়ারী, ইত্যাদি হতে পারে।
আপনি আরেকটা জিনিস করতে পারেন ইভেন্ট প্রোফাইলার ব্যবহার করে।
এভাবে:
EVENT_PROF='sql.active_record' EVENT_PROF_EXAMPLES=1 rake
এটি আপনাকে খুঁজে দেবে কোন টেস্টগুলো স্লোয়েস্ট ক্যোয়ারী রান করছে।
বতে, রেইলস ৬ প্যারালাল টেস্টিং যোগ করেছে, আপনি যদি বর্তমান প্রজেক্ট আপগ্রেড করেন তবে test/test_helpers.rb এ এনেবল করতে হবে।
৫. আপনার ডেটা আরও কনসিস্টেন্ট করুন
ভ্যালিডেশনগুলো দুর্দান্ত।
কিন্তু আপনি কোন ফ্রেমওয়ার্ক ব্যবহার করছেন আপনার ওয়েব অ্যাপ্লিকেশন বানাতে সেটি মattet করবে না।
আপনি সবসময় আপনার ভ্যালিডেশন বাইপাস করতে পারেন ডেটা সরাসরি ডেটাবেসে ইম্পোর্ট করে, র AWS SQL দিয়ে রেকর্ড তৈরি করে, বা আপনার ORM-এর এমন মেথড ব্যবহার করে যা ভ্যালিডেশন স্কিপ করে।
অন্য কথায়…
আপনার ভ্যালিডেশনগুলো শুধু ইউজার এরর থেকে আপনাকে রক্ষা করে, ডেভেলপার এরর থেকে না।
এই ডেভেলপার এররগুলো আপনার ডেটাকে ইনকনসিস্টেন্ট করতে পারে।
ভালো খবর?
আধুনিক SQL ডেটাবেসের অধিকাংশ - যদি সব নয় - "কনস্ট্রেইন্টস" ইমপ্লিমেন্ট করে, ভ্যালিডেশনের মতো নিয়মের সেট, কিন্তু ডেটাবেস লেভেলে।
তাই আপনি যদি আপনার ডেটা কনসিস্টেন্সি বাড়াতে চান তবে আপনাকে এই কনস্ট্রেইন্টস ইমপ্লিমেন্ট করতে হবে।
একটি জেম যা সাহায্য করতে পারে সেটি হলো database_consistency।
এই জেম কীভাবে ব্যবহার করবেন?
প্রথম, আপনাকে এটি ইনস্টল করতে হবে, সেখানে কোন রহস্য নেই।
দ্বিতীয়, আপনি টার্মিনালে bundle exec database_consistency রান করুন, যে প্রজেক্টটি চেক করতে চান সেটির ভিতরে।
এটি এমন একটি রিপোর্ট দেবে:
fail Comment title column should be required in the database fail Comment author column should be required in the database
এরপর কী?
মিসিং ডেটাবেস কনস্ট্রেইন্ট যোগ করুন, এই কেসে not-null, একটি change_column_null মাইগ্রেশন দিয়ে।
৬. রিফ্যাক্টরিং টাইম! আপনার কোডের সবচেয়ে খারাপ অফেন্ডাররা কারা?
কোড উন্নত করতে চান, কিন্তু কোথায় থেকে শুরু করবেন নিশ্চিত নন?
কিছু মেট্রিক্স নিন!
অনেক কোড মেট্রিক্স রয়েছে, যেমন সাইক্লোম্যাটিক কমপ্লেক্সিটি এবং চার্ন। চার্ন আপনার কোডে সময়ের সাথে সাথে পরিবর্তনের হার দেখে।
কীভাবে?
আপনার গিট চেঞ্জ হিস্টরি ব্যবহার করে।
ফলাফল?
সাবশে বেশি পরিবর্তন হওয়া ফাইলগুলোর একটি লিস্ট।
আপনি যদি ৯০% সময় আপনার User মডেল পরিবর্তন করতে বিতান… এটি সম্ভবত একটি বড় ফাইল সাথে দীর্ঘ মেথড। রিফ্যাক্টরিংর জন্য একটি দুর্দান্ত ক্যান্ডিডেট!
এই ধারাবাহিকভাবে পরিবর্তনশীল ফাইলগুলো খুঁজে বের করতে সাহায্য করে একটি জেম যার নাম attractor।
এভাবে রান করুন:
attractor report -p app
এটি একটি HTML রিপোর্ট তৈরি করে, এবং হাই-চার্ন ফাইলগুলোর একটি লিস্ট যা আপনি আপনার রিফ্যাক্টরিং ফোকাস করতে ব্যবহার করতে পারেন।
ভালো জিনিস!
৭. প্রোডাকশনে কোন কোড ব্যবহার হচ্ছে এবং কোনটি না সেটি জানুন
আপনার কোড উন্নত করতে সাহায্য করার আরেকটি টুল দিয়ে শেষ করি।
এটির নাম coverband।
আপনি এই জেমটি প্রোডাকশনে রান করলে (লো ওভারহেড), আপনি পাবেন কোন কোড রান হচ্ছে তার একটি কভারেজ রিপোর্ট।
আপনি এমন ব্যবহার না হওয়া ভিউও ট্র্যাক করতে পারেন!

এটি আপনাকে কোড ডিলিট করার এবং প্রজেক্ট ক্লিন করার সময় ডিসিশন নেওয়ায় সাহায্য করতে পারে।
অনব্যবহৃত কোড জমা হলে দেবেন না!
সারসংক্ষেপ
আপনি ৭টি শক্তিশালী এবং কম পরিচিত রুবি জেম সম্পর্কে জানেছেন যা আপনি আপনার (প্রায়শই রেইলস) প্রজেক্টে ব্যবহার করতে পারেন আপনার টেস্ট ফাস্ট করতে, কোড উন্নত করতে এবং সেফটি বাড়াতে।
জেম অবিউজ সম্পর্কে ছোট সতর্কতা মনে রাখবেন, কিন্তু নতুন জেম ট্রাই করার থেকে আপনাকে আটকে রাখবেন না।
আপনি যদি আপনার রুবি স্কিল উন্নত করতে চান এবং ব্লগটি সাপোর্ট করতে চান, আমার রুবি বই, Ruby Deep Dive-র একটি কপি কেনার কথা ভাবুন। 🙂
পড়ার জন্য ধন্যবাদ!