আপনি যদি এই শব্দটির সাথে পরিচিত না হন তবে রিফ্যাক্টরিং হল কোডের গুণমানকে পরিবর্তন না করে এটির মান উন্নত করার কাজ। এটি আপনার কোডের সাথে কাজ করা অনেক সহজ করে তুলবে৷
৷এই পোস্টে আপনি কিছু সাধারণ রুবি রিফ্যাক্টরিং কৌশল শিখবেন
চলুন শুরু করা যাক!
এক্সট্র্যাক্ট পদ্ধতি
সবচেয়ে সাধারণ রিফ্যাক্টরিংগুলির মধ্যে একটি হল 'এক্সট্রাক্ট পদ্ধতি' নামে পরিচিত। এই রিফ্যাক্টরিংয়ে আপনি একটি পুরানো পদ্ধতি থেকে একটি নতুন পদ্ধতিতে কিছু কোড সরান। এটি আপনাকে বর্ণনামূলক নাম সহ ছোট পদ্ধতির অনুমতি দেবে।
আসুন একটি উদাহরণ দেখি:
@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
আমরা এখানে যা করেছি তা হল আমাদের শর্তকে একটি বর্ণনামূলক নাম দেওয়া, যা এই কোডের ভবিষ্যতের পাঠকদের (আপনি সহ!) জন্য জিনিসগুলিকে অনেক সহজ করে তোলে।
পদ্ধতিকে মেথড অবজেক্ট দিয়ে প্রতিস্থাপন করুন
কখনও কখনও আপনার একটি বড় পদ্ধতি আছে যা নিয়ন্ত্রণের বাইরে চলে গেছে। এই ক্ষেত্রে রিফ্যাক্টর করা কঠিন হতে পারে কারণ বড় পদ্ধতিতে অনেক স্থানীয় ভেরিয়েবল থাকে। একটি সমাধান হল 'মেথড অবজেক্ট' রিফ্যাক্টরিং ব্যবহার করা।
"বড় পদ্ধতি হল যেখানে ক্লাস লুকিয়ে যায়।" - আঙ্কেল বব
আসুন একটি উদাহরণ দেখি:
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")
রিফ্যাক্টরিং করার জন্য আমরা একটি নতুন ক্লাস তৈরি করতে পারি এবং স্থানীয় ভেরিয়েবলকে ইনস্ট্যান্স ভেরিয়েবলে উন্নীত করতে পারি। এটি আমাদের আশেপাশে ডেটা পাস করার চিন্তা না করে এই কোডটিকে আরও রিফ্যাক্টর করার অনুমতি দেবে৷
আরে! আপনার রুবি দক্ষতা একটি বড় উপায়ে উন্নত করতে চান? আমার সুন্দর রুবি কোর্স 🙂
দেখুন
এটি হল 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)
উপসংহার
এই রিফ্যাক্টরিং কৌশলগুলি ব্যবহার করা আপনাকে একক দায়িত্বের নীতি মেনে চলতে এবং আপনার ক্লাস এবং পদ্ধতিগুলিকে নিয়ন্ত্রণে রাখতে সাহায্য করবে৷
আপনি যদি এই নিবন্ধটি উপভোগ করেন তবে দয়া করে এটি আপনার বন্ধুদের সাথে ভাগ করুন যাতে তারাও এটি উপভোগ করতে পারে 🙂