यदि आप इस शब्द से परिचित नहीं हैं, तो रिफैक्टरिंग वह कार्य है जो कोड की गुणवत्ता को बिना बदले सुधारता है कि वह क्या करता है। यह आपके कोड के साथ काम करना बहुत आसान बना देगा।
इस पोस्ट में आप कुछ सामान्य रूबी रिफैक्टरिंग तकनीकें सीखेंगे
शुरू करते हैं!
मेथड निकालें
सबसे आम रिफैक्टरिंग में से एक जिसे 'मेथड निकालें' के नाम से जाना जाता है। इस रिफैक्टरिंग में आप एक पुराने मेथड से कुछ कोड को एक नए मेथड में ले जाते हैं। यह आपको वर्णनात्मक नामों के साथ छोटे मेथड्स रखने की अनुमति देगा।
आइए एक उदाहरण देखते हैं:
@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)
निष्कर्ष
इन रिफैक्टरिंग तकनीकों का उपयोग करने से आपको सिंगल रिस्पॉन्सिबिलिटी सिद्धांत का पालन करने और अपनी क्लासेस और मेथड्स को नियंत्रण में रखने में मदद मिलेगी।
यदि आपको यह लेख पसंद आया तो कृपया इसे अपने दोस्तों के साथ शेयर करें ताकि वे भी इसका आनंद ले सकें 🙂