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