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