Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी रिफैक्टरिंग में महारत: क्लीनर कोड के लिए आवश्यक तकनीकें

यदि आप इस शब्द से परिचित नहीं हैं, तो रिफैक्टरिंग वह कार्य है जो कोड की गुणवत्ता को बिना बदले सुधारता है कि वह क्या करता है। यह आपके कोड के साथ काम करना बहुत आसान बना देगा।

इस पोस्ट में आप कुछ सामान्य रूबी रिफैक्टरिंग तकनीकें सीखेंगे

शुरू करते हैं!

मेथड निकालें

सबसे आम रिफैक्टरिंग में से एक जिसे 'मेथड निकालें' के नाम से जाना जाता है। इस रिफैक्टरिंग में आप एक पुराने मेथड से कुछ कोड को एक नए मेथड में ले जाते हैं। यह आपको वर्णनात्मक नामों के साथ छोटे मेथड्स रखने की अनुमति देगा।

आइए एक उदाहरण देखते हैं:

 @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) 

निष्कर्ष

इन रिफैक्टरिंग तकनीकों का उपयोग करने से आपको सिंगल रिस्पॉन्सिबिलिटी सिद्धांत का पालन करने और अपनी क्लासेस और मेथड्स को नियंत्रण में रखने में मदद मिलेगी।

यदि आपको यह लेख पसंद आया तो कृपया इसे अपने दोस्तों के साथ शेयर करें ताकि वे भी इसका आनंद ले सकें 🙂


  1. यूनिकॉर्न को Nginx से जोड़ें: रूबी में यूनिक्स सॉकेट के लिए एक व्यावहारिक गाइड यूनिकॉर्न को Nginx से जोड़ें: रूबी में यूनिक्स सॉकेट के लिए एक व्यावहारिक गाइड

    रूबी एप्लिकेशन सर्वर आमतौर पर Nginx जैसे वेब सर्वर के साथ उपयोग किए जाते हैं। जब कोई उपयोगकर्ता आपके रेल्स ऐप से कोई पेज अनुरोध करता है, तो Nginx अनुरोध को एप्लिकेशन सर्वर को सौंप देता है। लेकिन वास्तव में यह कैसे काम करता है? Nginx यूनिकॉर्न से कैसे बात करता है? सबसे कुशल विकल्पों में से एक है यूनि

  1. रूबी में न्यूरल नेटवर्क को समझना: एक शुरुआती गाइड रूबी में न्यूरल नेटवर्क को समझना: एक शुरुआती गाइड

    इस पोस्ट में, हम न्यूरल नेटवर्क की मूल बातें सीखेंगे और कैसे हम उन्हें रूबी का उपयोग करके लागू कर सकते हैं! यदि आप कृत्रिम बुद्धिमत्ता और डीप लर्निंग से प्रभावित हैं लेकिन अनिश्चित हैं कि कैसे शुरू करें, तो यह पोस्ट आपके लिए है! हम प्रमुख अवधारणाओं को उजागर करने के लिए एक सरल उदाहरण के माध्यम से चले

  1. Ruby 2.6 में 9 प्रमुख संवर्द्धन का अन्वेषण Ruby 2.6 में 9 प्रमुख संवर्द्धन का अन्वेषण

    Ruby का एक नया संस्करण नई सुविधाओं और प्रदर्शन सुधारों के साथ आ रहा है। क्या आप परिवर्तनों के साथ बने रहना चाहेंगे? आइए एक नज़र डालते हैं! अंतहीन रेंज (Endless Ranges) Ruby 2.5 और पुराने संस्करण पहले से ही अंतहीन रेंज का एक रूप (Float::INFINITY के साथ) का समर्थन करते हैं, लेकिन Ruby 2.6 इसे अगले स्त