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

গ الملح Rails কন্ট্রোলারকে ক্লিন, টেস্টযোগ্য কোডে রূপান্তর করুন

রেইলস ক্যারিয়ারের কোনো মুহূর্তে, আপনি এমন কন্ট্রোলার মুখোমুখি হবেন যা আপনাকে প্রোগ্রামিং ছেড়ে দেয়ার মন করাবে। সেটাতে একটি পুরো ফিচারের সব কোড থাকতে পারে। ১৫টা `before_filter` থাকতে পারে যেগুলো ইনস্ট্যান্স ভেরিয়েবল দিয়ে কমিউনিকেট করে এবং নির্দিষ্ট অর্ডারে কল না হলে সব ভাঙে। এবং অবশ্যই, এর টেস্টগুলো এমন দেখাবে:

test "index" do get :index assert_response :success end 

চমৎকার। ১০০% টেস্ট কভারেজ, ঠিক না?

খুব ভালো হয়তো Augen বন্ধ করে প্রেটেন্ড করুন সেটা নেই। কিন্তু একদিন সেটাতে বাগ ফিক্স করতে হবে। এবং একজন ভালো সফটওয়্যার ডেভেলপার হিসেবে, আপনি কোডকে পাওয়ার চেয়ে ভালো অবস্থায় রেখে যেতে চান।

তবে ভালো টেস্ট ছাড়া রিফ্যাক্টর কীভাবে করবেন?

কিভাবেই হোক টেস্ট করুন

রিফ্যাক্টর করার জন্য ভালো টেস্ট দরকার, কিন্তু এই কোডের ওপর ভালো টেস্ট লিখা যাবে না যতক্ষণ রিফ্যাক্টর না করুন। তাহলে কী করা যাবে?

খুব খারাপ লেখা কন্ট্রোলার হলেও, আপনি ইন্টিগ্রেশন টেস্ট লিখতে পারেন যা কিছু ডেটা কন্ট্রোলারে পাঠাবে এবং রেসপন্স এক্সপেক্ট করবে। এখন, আপনার লিখা টেস্টগুলো নিশ্চিত করবে কন্ট্রোলারের এক্সিস্টিং বিহেভিয়র রিফ্যাক্টর করার সময় চেঞ্জ হয় না।

এই টেস্টগুলো یونিট টেস্টের মত ফোকাসড নয়। কিন্তু এই হাই-লেভেল টেস্টগুলো আপনাকে কনফিডেন্স দেবে যে আপনি যে রিফ্যাক্টরিং করতে যাচ্ছেন সেটা সব ভাঙবে না। এবং টেস্ট লিখার প্রক্রিয়া আপনাকে কোড ভালোভাবে বুঝতে সাহায্য করবে, যা রিফ্যাক্টর কীভাবে করবেন সেটা ডিসাইড করতে হেল্প করবে।

ডিপেন্ডেন্সি ভাঙুন

খারাপ কন্ট্রোলার কোড কেন খারাপ? অধিকাংশ সময়, `before_filter`স, হেল্পার মেথড, বা ২০০ লাইনের ফাংশনের বিভিন্ন অংশের মাঝে ইমপ্লিসিট ডিপেন্ডেন্সি থাকে। এটা অwahn맨 রিফ্যাক্টরিংও হতে পারে। কোড ভালো করতে হলে এই ডিপেন্ডেন্সিগুলো ভাঙতে হবে।

রেইলস কন্ট্রোলারের জন্য ডিপেন্ডেন্সি ভাঙার সহজ উপায় আছে। `before_filter`স, হেল্পার মেথড, সুপারক্লাস মেথড, এবং কোথাও কন্ট্রোলার-ইশ কোড লুকানো থাকতে পারে - সেগুলোর কোড কপি করুন। তারপর সেই মেথড কলগুলো কপি করা কোড দিয়ে রিপ্লেস করুন।

আপনি সাময়িকভাবে আপনার কোড un-DRY করছেন, যেন পরে আরও বুঝতে পারা রকমে রিফ্যাক্টর করতে পারেন। এটা বদশ見える, কিন্তু এখন আপনার সব কোড খুল্লামখুল্লা। আপনি বুঝতে পারবেন কোন পিসগুলো ইন্টারঅ্যাক্ট করছে এবং সব কীভাবে ফ্লো করছে।

(এই প্রসেসে, প্রতিবার চেঞ্জের পর টেস্ট রান করুন নিশ্চিত করতে যে ইনলাইনিং কিছু ভাঙছে না।)

টেস্টযোগ্য কোডের দিকে রিফ্যাক্টর করুন

এখন, আপনি কোড রি-রিফ্যাক্টর করার জন্য রেডি। সাধারণত বেসিক extract method, extract object, pull up method-টাইপ রিফ্যাক্টরিং ব্যবহার করবেন। কয়েকভাবে রিফ্যাক্টর করে দেখুন কী ভালো লাগে।

প্রথম কয়েক পাসে, আপনি হাই-লেভেল ইন্টিগ্রেশন টেস্টকে সেফটি নেট হিসেবে ব্যবহার করতে পারেন। কিন্তু শীঘ্রই আপনি কিছু ভালো চাইবেন।

রিফ্যাক্টর করার সময়, কোডকে আরও টেস্টযোগ্য করার সুযোগ খুঁজুন। এটা সাধারণত মানে টেস্ট ডাবল ইনজেক্ট করার জায়গা বানানো, অবজেক্টের মাঝের ডিপেন্ডেন্সি কমানো, এবং কন্ট্রোলারকে এমন অবজেক্টের ওপর নির্ভরশীল করা যা সহজে তৈরি ও یونিট টেস্ট করা যায়। টেস্টযোগ্য অবজেক্টে কোড সরিয়ে দিলে, আপনার কন্ট্রোলার ছোট, বুঝতে সহজ, এবং টেস্ট করতেও সহজ হবে।

নাম্বার্ড লিস্ট আকারে পাওয়া যাবে?

একবার বড় কন্ট্রোলার ভাঙার ধাপগুলো:

  1. কন্ট্রোলারের বিপরীতে হাই-লেভেল ইন্টিগ্রেশন টেস্ট চালু করুন।
  2. টেস্ট রান করুন, পাস করছে নিশ্চিত হন।
  3. `before_filter`স, সুপারক্লাস মেথড, এবং কোড লুকানো অন্যান্য অ্যাবস্ট্রাকশন ইনলাইন করুন।
  4. টেস্ট রান করুন, এখনও পাস করছে নিশ্চিত হন।
  5. একটি রিফ্যাক্টরিং করুন (extract method, extract service object, replace instance variable with local, ইত্যাদি)। দেখুন কোড কেমন লাগছে।
  6. টেস্ট রান করুন, পাস করছে নিশ্চিত হন।
  7. যদি কোড এক্সট্রাক্ট করলেন, এক্সট্রাক্ট করা অবজেক্ট বা মেথডের বিপরীতে কিছু ইউনিট টেস্ট লিখুন।
  8. টেস্ট রান করুন, পাস করছে নিশ্চিত হন।
  9. কন্ট্রোলার আরও কাজ চাইলে স্টেপ ৫-এ ফিরে যান।

পরবর্তী কী?

আরো শিখতে চাইলে, Working Effectively with Legacy Code হলো আনমেইনটেইনেবল কোড बिना টেস্ট लेकर সেটাকে কাজের উপযোগী বানানোর বাইবল। খুব সুপারিশ করছি, যদি আপনি ঘন ঘন বড় মোনোলিথিক কন্ট্রোলার মুখোমুখি হন (এবং যদি রিফ্যাক্টরিং আপনার কাছে আমার মত মজার হয়)।

এখন, আপনার হরর স্টোরি শুনা যাক! আপনার কাজ করা সবচেয়ে খারাপ কন্ট্রোলার কোড কেমন ছিল?

  1. ম্যাকএ C# কোডিং করার উপায়

  2. আইফোন দিয়ে কিউআর কোড স্ক্যান করার পদ্ধতি

  3. Minitest ডিমিস্টিফাইড: রুবিতে এটি কীভাবে কাজ করে

  4. গেম কন্ট্রোলারকে কিবোর্ডে সমস্যা মুক্তভাবে ম্যাপ করুন: ধাপে ধাপে গাইড