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

রুবি রিফ্যাক্টরিং মাস্টার করুন: ক্লিনার কোডের জন্য অপরিহার্য টেকনিক

আপনি যদি এই টার্মটি জানেন না, রিফ্যাক্টরিং হলো কোডের কোয়ালিটি উন্নত করা যা করে সেটি কী করে সেটা পরিবর্তন না করে। এটি আপনার কোডকে অনেক সহজ করে দেবে কাজ করার জন্য।

এই পোস্টে আপনি কিছু সাধারণ রুবি রিফ্যাক্টরিং টেকনিক শিখবেন

চলুন শুরু করি!

Extract Method (মেথড এক্সট্রাক্ট করা)

সর্বाधিক সাধারণ রিফ্যাক্টরিংগুলোর একটি হলো ‘extract method’। এই রিফ্যাক্টরিংএ আপনি একটি পুরনো মেথড থেকে কিছু কোড একটি নতুন মেথডে সরিয়ে আনেন। এটি আপনাকে ছোট ছোট মেথড রেখে দেয় যেগুলোর নাম ডেসক্রিপ্টিভ।

একটি উদাহরণ দেখা যাক:

 @sold_items = %w( onions garlic potatoes ) def print_report puts "*** Sales Report for #{Time.new.strftime("%d/%m/%Y")} ***" @sold_items.each { |i| puts i } puts "*** End of Sales Report ***" end 

আমরা এই মেথডের সবচেয়ে বদশूरत অংশটি, বর্তমান ডেট জেনারেশন, এক্সট্রাক্ট করে শুরু করতে পারি।

 def print_report puts "*** Sales Report for #{current_date} ***" @sold_items.each { |i| puts i } puts "*** End of Sales Report ***" end def current_date Time.new.strftime("%d/%m/%Y") end 

এটি ইতিমধ্যে ভালো পড়া যায়, কিন্তু আমরা একটু বেশি যেতে পারি। আরও কয়েকটি মেথড এক্সট্রাক্ট করে আমরা এই কোডে শেষ করতে পারি:

 def print_report print_header print_items print_footer end def print_header puts "*** Sales Report for #{current_date} ***" end def current_date Time.new.strftime("%d/%m/%Y") end def print_items @sold_items.each { |i| puts i } end def print_footer puts "*** End of Sales Report ***" end 

হ্যাঁ, কোডটি এখন লম্বা, কিন্তু কি এটি পড়া সহজ নয়? ছোট মেথডগুলো থেকে ভয় পাবেন না, এগুলো আপনার কোডের জন্য ভালো।

কন্ডিশনাল রিফ্যাক্টরিং

আপনি জটিল কন্ডিশনালগুলোকেও মেথডে রিফ্যাক্টর করতে পারেন যাতে সেগুলো আরও পড়া সহজ হয়।

উদাহরণ:

 def check_temperature if temperature > 30 && (Time.now.hour >= 9 && Time.now.hour <= 17) air_conditioner.enable! end end 

এই if স্টেটমেন্টের দ্বিতীয় অংশ 그리 সুন্দর পড়া যায় না, তাই আমরা এটি একটি মেথডে এক্সট্রাক্ট করি:

 def check_temperature if temperature > 30 && working_hours air_conditioner.enable! end end def working_hours Time.now.hour >= 9 && Time.now.hour <= 17 end 

আমরা এখানে করেছি আমাদের কন্ডিশনকে একটি ডেসক্রিপ্টিভ নাম দিয়েছি, যা এই কোডের ভবিষ্যৎ রিডারদের (আপনাকেও অন্তর্ভুক্ত করে) জন্য জিনিসগুলো অনেক সহজ করে দিয়েছে।

Replace Method with Method Object (মেথডকে মেথড অবজেক্ট দিয়ে রিপ্লেস)

কখনো কখনো আপনার একটি বড় মেথড থাকে যা আউট অফ কন্ট্রোল হয়ে গেছে। এই কেসে রিফ্যাক্টর করা কঠিন হতে পারে কারণ বড় মেথডগুলোর সাধারণত অনেক লোকাল ভেরিয়েবল থাকে। একটা সমাধান হলো ‘Method Object’ রিফ্যাক্টরিং ব্যবহার করা।

“বড় মেথডগুলো হলো যেখানে ক্লাসগুলো লুকিয়ে থাকে।” - Uncle Bob

একটি উদাহরণ দেখা যাক:

 require 'socket' class MailSender def initialize @sent_messages = [] end def send_message(msg, recipient = "rubyguides.com") raise ArgumentError, "message too small" if msg.size < 5 formatted_msg = "[New Message] #{msg}" TCPSocket.open(recipient, 80) do |socket| socket.write(formatted_msg) end @sent_messages << [msg, recipient] puts "Message sent." end end sender = MailSender.new sender.send_message("testing") 

রিফ্যাক্টরিং করার জন্য আমরা একটি নতুন ক্লাস তৈরি করতে পারি এবং লোকাল ভেরিয়েবলগুলোকে ইনস্ট্যান্স ভেরিয়েবলে প্রমোট করতে পারি। এটি আমাদের ডেটা পাস করার চিন্তা ছাড়া আরও রিফ্যাক্টর করতে দেবে।

হে! আপনার রুবি স্কিল বড়ভাবে উন্নত করতে চান? আমার Beautiful Ruby Course চেক আউট করুন 🙂

রিফ্যাক্টরিং পরের MailSender ক্লাস:

 class MailSender def initialize @sent_messages = [] end def deliver_message(message) send(message) @sent_messages << message puts "Message sent." end def send(msg) TCPSocket.open(msg.recipient, 80) { |socket| socket.write(msg.formatted_msg) } end end 

এবং এটি হলো আমরা যে নতুন ক্লাসটি আমদানি করলাম:

 class Message attr_reader :msg, :recipient def initialize(msg, recipient = "rubyguides.com") raise ArgumentError, "message too small" if msg.size < 5 @msg = msg @recipient = recipient end def formatted_msg "[New Message] #{msg}" end end sender = MailSender.new msg = Message.new("testing") sender.deliver_message(msg) 

উপসংহার

এই রিফ্যাক্টরিং টেকনিকগুলো ব্যবহার করলে আপনি সিঙ্গল রেসপন্সিবিলিটি প্রিন্সিপাল মেনটেইন করতে পারবেন এবং আপনার ক্লাস ও মেথডগুলো কন্ট্রোলের অধীনে রাখতে পারবেন।

এই আর্টিকেলটি আপনার ভালো লাগলে আপনার বন্ধুদের সাথে শেয়ার করুন যাতে তারা ও এনজয় করতে পারে 🙂


  1. রুবিতে ইউনিক্স ডেমন বোঝা: একটি থিয়োরেটিক্যাল গাইড

  2. Unicorn কে Nginx-এ কানেক্ট করা: রুবিতে ইউনিক্স সকেটের প্র্যাক্টিক্যাল গাইড

  3. রুবিতে নিউরাল নেটওয়ার্ক ডিমিস্টিফাই: শুরুকারীদের গাইড

  4. রুবি ২.৬-এ ৯টি গুরুত্বপূর্ণ উন্নতির অন্বেষণ