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