เดิมทีฉันเรียนรู้แนวคิดเหล่านี้มากมายจาก 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 วิธีการที่เรียกใช้โดยรหัสนั้นเพื่อส่งคืนประเภทเดียวได้หรือไม่
และดูเป็นสมมติฐานที่คุณสามารถทำได้เกี่ยวกับมูลค่าที่ส่งคืนของคุณกระเพื่อมผ่านโครงการของคุณ และทำให้โค้ดใกล้เคียงทั้งหมดของคุณง่ายขึ้น