Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ลดความซับซ้อนของรหัสทับทิมของคุณด้วยหลักความแข็งแกร่ง

เดิมทีฉันเรียนรู้แนวคิดเหล่านี้มากมายจาก Confident Ruby หนึ่งในหนังสือ Ruby เล่มโปรดของฉัน ถ้าคุณชอบบทความนี้ คุณควรซื้อและอ่านทั้งหมด มีดังนั้น มีของดีอยู่เพียบ

current_userของคุณ เมธอดส่งคืน User ยกเว้นเมื่อไม่มีผู้ใช้และคืนค่าเป็นศูนย์ search เมธอดส่งคืน Array ของผลลัพธ์ เว้นแต่จะมีเพียงผลลัพธ์เดียว และส่งคืนผลลัพธ์นั้นแทน ดูเหมือนสมเหตุสมผลใช่มั้ย? อาจจะสะดวก!

แต่ในไม่ช้า การตัดสินใจเหล่านี้จะฝังโค้ดของคุณไว้ภายใต้คำสั่ง if จำนวนมาก อาจจะเป็น if kind_of? โรยให้ทั่ว หรือบางทีคุณอาจรู้สึกว่าต้องตรวจหา ทุกที่ หรือแย่กว่านั้น NoMethodError เริ่มปรากฏขึ้นทุกครั้งที่คุณจัดส่งคุณลักษณะใหม่ เดาว่าถึงเวลาสำหรับโปรแกรมแก้ไขด่วนอื่นแล้ว!

อย่างไรก็ตาม มีทางที่จะป้องกันสิ่งนี้ได้ และต้องใช้ความรอบคอบเพียงเล็กน้อย

หลักความแข็งแกร่ง

มีหลักการในการคำนวณว่า

อนุรักษ์นิยมในสิ่งที่ทำ เสรีในสิ่งที่ยอมรับจากผู้อื่น

คุณสามารถใช้หลักการนี้กับวิธี Ruby ของคุณได้ วิธีการที่คุณเขียนควรยอมรับอินพุตที่สมเหตุสมผล และควรส่งคืนผลลัพธ์ที่สอดคล้องกัน

เน้นที่ส่วนสุดท้าย:เมื่อมีคนเรียกวิธีการที่คุณเขียน พวกเขาควรจะรู้ว่าวิธีการนั้นจะส่งคืนอะไร

ใช้ความคิดอย่างรอบคอบเกี่ยวกับผลลัพธ์ของคุณ

ดูการใช้งาน ActiveRecord::Errors#on . ของ Rails 2.1 :

# File activerecord/lib/active_record/validations.rb, line 212
def on(attribute)
  attribute = attribute.to_s
  return nil unless @errors.has_key?(attribute)
  errors = @errors[attribute].map(&:to_s)
  errors.size == 1 ? errors.first : errors
end

เมื่อถูกเรียก ค่านี้อาจส่งคืน Array ของ String s, String , หรือ nil . ขึ้นอยู่กับผู้โทรที่จะพิจารณาว่ากำลังจัดการกับวัตถุประเภทใด นี่เป็นความคิดที่ไม่ดี:

  • ผู้โทรจะต้องสร้างโค้ดของตัวเองให้เป็นโคลนด้วยการตรวจสอบประเภทที่น่ารำคาญ

  • ผู้โทรต้องรู้มาก เกี่ยวกับวิธีการโทร อย่างน้อยที่สุด จำเป็นต้องทราบประเภทของอ็อบเจ็กต์ทุกประเภทที่เมธอดสามารถส่งคืนได้และเมื่อใดสามารถส่งคืนแต่ละประเภทได้

  • คุณมีเคสขอบเพิ่มเติมให้ทดสอบ หากคุณต้องการมั่นใจว่าโค้ดของคุณกำลังทำในสิ่งที่ควรจะทำ คุณต้องลองใช้ทั้งสามสถานการณ์

วิธีการของคุณควรสอดคล้องกับสิ่งที่พวกเขาส่งคืน หากคุณมักจะส่งคืน Array , ทำสิ่งที่คุณต้องทำเพื่อเสมอ คืนค่า Array . หากคุณมักจะส่งคืน User แต่บางครั้งกลับเป็นศูนย์ คุณสามารถสร้างวัตถุ Null User และคืนค่า นั่น แทนที่จะเป็นศูนย์

คุณอาจจะเข้มงวดน้อยลงด้วยซ้ำ:“ฉันจะส่งคืนบางสิ่งที่มี Taggable โมดูล". คุณสามารถใช้แบบทั่วไปมากกว่านี้:“ฉันจะส่งคืนบางอย่างด้วย id และ name คุณลักษณะ." สิ่งสำคัญคือความสม่ำเสมอและทำให้แน่ใจว่าผู้โทรรู้ว่าจะเกิดอะไรขึ้น

jQuery เป็นตัวอย่างที่น่าสนใจ เมธอด jQuery ส่วนใหญ่จะคืนค่า Array . ชนิดเดียวกัน -เหมือนวัตถุ ด้วยเหตุนี้ เมธอดของ jQuery จึงประกอบได้อย่างไม่น่าเชื่อ และคุณสามารถทำงานจำนวนมหาศาลได้ในโค้ดบรรทัดเดียว

และในกรณีที่คุณสงสัย Rails ได้แก้ไขวิธีการดังกล่าวในเวอร์ชันที่ใหม่กว่า:

# File activemodel/lib/active_model/errors.rb, line 133
def [](attribute)
  get(attribute.to_sym) || set(attribute.to_sym, [])
end

ตอนนี้มันส่งคืน Array . เสมอ . ง่ายกว่าสำหรับพวกเขาและง่ายกว่าสำหรับเรา

ฆ่าไม่สอดคล้อง

ครั้งต่อไปที่คุณพบว่าตัวเองกลับมา “An Array หรือ nil ” เพียงส่งคืน Array . ดู codebase ของคุณและดูว่าคุณกำลังใช้ kind_of? และ respond_to? . ดูว่าคุณสามารถ refactor วิธีการที่เรียกใช้โดยรหัสนั้นเพื่อส่งคืนประเภทเดียวได้หรือไม่

และดูเป็นสมมติฐานที่คุณสามารถทำได้เกี่ยวกับมูลค่าที่ส่งคืนของคุณกระเพื่อมผ่านโครงการของคุณ และทำให้โค้ดใกล้เคียงทั้งหมดของคุณง่ายขึ้น