คำถามเก่า (และ "ตอบ") แต่ฉันจะโยนในสองเซ็นต์ของฉันเป็นคำตอบ
TL; DR - คุณไม่จำเป็นต้องทำ แต่มันสามารถทำให้โค้ดของคุณชัดเจนยิ่งขึ้นในบางกรณี
แม้ว่าจะไม่ได้ใช้การส่งคืนอย่างชัดเจนอาจเป็น "วิธีทับทิม" แต่ก็เป็นความสับสนที่โปรแกรมเมอร์ทำงานกับรหัสที่ไม่คุ้นเคยหรือไม่คุ้นเคยกับคุณสมบัติของ Ruby
มันเป็นตัวอย่างที่วางแผนไว้ แต่ลองนึกภาพว่ามีฟังก์ชั่นเล็ก ๆ น้อย ๆ เช่นนี้ซึ่งบวกหนึ่งจำนวนที่ผ่านไปและกำหนดให้กับตัวแปรอินสแตนซ์
def plus_one_to_y(x)
@y = x + 1
end
นี่หมายความว่าเป็นฟังก์ชั่นที่คืนค่าหรือไม่? เป็นการยากที่จะบอกว่านักพัฒนาหมายถึงอะไรเพราะทั้งคู่กำหนดตัวแปรอินสแตนซ์และส่งกลับค่าที่กำหนดเช่นกัน
สมมติว่าในภายหลังโปรแกรมเมอร์อื่น (อาจไม่คุ้นเคยกับวิธีที่ Ruby ส่งคืนโดยอิงตามบรรทัดสุดท้ายของโค้ดที่เรียกใช้) มาพร้อมและต้องการที่จะใส่คำสั่งการพิมพ์สำหรับการบันทึกและฟังก์ชั่นกลายเป็น ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
ตอนนี้ฟังก์ชั่นที่ถูกทำลายถ้ามีอะไรที่คาดว่าจะมีค่าที่ส่งกลับ หากไม่มีสิ่งใดคาดหวังว่าจะได้รับมูลค่าที่คืนมาก็ดี เห็นได้ชัดว่าหากมีการลดลงของ chain code สิ่งที่เรียกว่าคาดหวังว่าจะได้ค่าที่ส่งคืนกลับมาก็จะล้มเหลวเนื่องจากไม่ได้รับสิ่งที่คาดหวังกลับมา
คำถามจริงในตอนนี้คือสิ่งใดที่คาดว่าจะได้รับผลตอบแทนจริงหรือ? สิ่งนี้หักหรือไม่? มันจะทำลายบางสิ่งในอนาคตหรือไม่ ใครจะรู้! การตรวจสอบโค้ดทั้งหมดของการโทรทั้งหมดจะแจ้งให้คุณทราบ
ดังนั้นสำหรับฉันอย่างน้อยที่สุดแนวทางการปฏิบัติที่ดีที่สุดก็คือให้ชัดเจนว่าคุณจะคืนสิ่งใดสิ่งหนึ่งหากเรื่องนั้นเป็นเรื่องสำคัญ
ดังนั้นในกรณีของฟังก์ชั่นตัวอย่างเล็ก ๆ น้อย ๆ ของเราสมมติว่าเราต้องการให้มันคืนค่ามันจะถูกเขียนแบบนี้ ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
และมันจะชัดเจนมากสำหรับโปรแกรมเมอร์ที่จะคืนค่าและยากกว่าสำหรับพวกเขาที่จะทำลายมันโดยไม่ทราบ
อีกทางเลือกหนึ่งสามารถเขียนเช่นนี้และออกจากงบกลับ ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
แต่ทำไมต้องละทิ้งคำออกไป ทำไมไม่เพียงแค่ใส่เข้าไปในนั้นและทำให้มันชัดเจน 100% ว่าเกิดอะไรขึ้น? มันจะไม่ส่งผลกระทบต่อความสามารถของโค้ดในการทำงานของคุณ