เป็นสไตล์ที่ดีที่จะกลับมาทับทิมอย่างชัดเจนหรือไม่?


155

มาจากพื้นหลัง Python ที่มี "วิธีที่ถูกต้องที่จะทำ" (เป็นวิธี "Pythonic") เสมอเมื่อพูดถึงสไตล์ฉันสงสัยว่าทับทิมนั้นมีอยู่จริงหรือไม่ ฉันใช้แนวทางสไตล์ของฉันเอง แต่ฉันคิดว่าจะปล่อยซอร์สโค้ดของฉันและฉันต้องการให้เป็นไปตามกฎที่ไม่ได้เขียนไว้ซึ่งอาจมีอยู่

มันเป็น "The Ruby Way" หรือไม่ที่จะพิมพ์ออกมาreturnในวิธีการอย่างชัดเจน? ฉันเคยเห็นมันเสร็จแล้วทั้งที่มีและไม่มี แต่มีวิธีที่ถูกต้องหรือไม่ อาจมีเวลาที่เหมาะสมในการทำหรือไม่? ตัวอย่างเช่น:

def some_func(arg1, arg2, etc)
  # Do some stuff...
  return value # <-- Is the 'return' needed here?
end

3
นี่เป็นคำถามที่เก่ามาก แต่สำหรับผู้ที่มีคำถามที่คล้ายกันแนะนำให้ใช้ Eloquent Ruby ของหนังสือ มันไม่ใช่ไกด์สไตล์มากพอ ๆ กับการแนะนำการเขียน Ruby แบบสำนวน ฉันหวังว่าผู้คนมากขึ้นจะอ่านมัน!
ไบรอันเรียน

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

คำตอบ:


226

คำถามเก่า (และ "ตอบ") แต่ฉันจะโยนในสองเซ็นต์ของฉันเป็นคำตอบ

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% ว่าเกิดอะไรขึ้น? มันจะไม่ส่งผลกระทบต่อความสามารถของโค้ดในการทำงานของคุณ


6
จุดที่น่าสนใจ ฉันคิดว่าจริง ๆ แล้วฉันพบสถานการณ์ที่คล้ายกันเมื่อฉันถามคำถามนี้ซึ่งผู้พัฒนาดั้งเดิมใช้ค่าส่งคืนโดยนัยในรหัสของพวกเขาและมันยากมากที่จะเข้าใจสิ่งที่เกิดขึ้น ขอบคุณสำหรับคำตอบ!
Sasha Chedygov

6
ฉันพบคำถามในขณะที่ Googling ได้รับผลตอบแทนโดยนัยเนื่องจากฉันเพิ่งถูกเผาโดยสิ่งนี้ ฉันได้เพิ่มตรรกะบางอย่างลงในส่วนท้ายของฟังก์ชันที่ส่งคืนสิ่งโดยปริยาย การโทรหาส่วนใหญ่จะไม่สนใจ (หรือตรวจสอบ) ค่าที่ส่งคืน แต่มีการโทรแล้วและล้มเหลว โชคดีที่อย่างน้อยมันก็ปรากฏขึ้นในการทดสอบการทำงานบางอย่าง
ทิมโฮลท์

16
ในขณะที่จริงมันเป็นสิ่งสำคัญสำหรับรหัสที่จะอ่านและละทิ้งคุณลักษณะที่รู้จักกันดีของภาษาการเขียนโปรแกรมในความโปรดปรานของการใช้คำฟุ่มเฟื่อยคือในความคิดของฉันการปฏิบัติที่ไม่ดี หากนักพัฒนาไม่คุ้นเคยกับ Ruby บางทีพวกเขาควรทำความคุ้นเคยก่อนที่จะแตะรหัส ฉันคิดว่ามันค่อนข้างโง่ที่จะต้องเพิ่มความยุ่งเหยิงของรหัสของฉันสำหรับเหตุการณ์ในอนาคตที่ผู้พัฒนาที่ไม่ใช่ Ruby บางคนต้องทำอะไรบางอย่างในภายหลัง เราไม่ควรลดภาษาให้เหลือส่วนที่เล็กที่สุด ส่วนหนึ่งของความงามของทับทิมคือเราไม่จำเป็นต้องใช้รหัส 5 บรรทัดเพื่อพูดอะไรบางอย่างที่ควรใช้เวลาเพียง 3
ไบรอันเรียน

25
ถ้าคำนั้นreturnเพิ่มความหมายทางความหมายลงในโค้ดทำไมล่ะ? มันแทบจะ verbose มาก - เราไม่ได้พูดถึง 5 บรรทัด vs 3 เพียงอีกหนึ่งคำ ฉันต้องการที่จะเห็นreturnอย่างน้อยในฟังก์ชั่น (อาจไม่ได้อยู่ในบล็อก) เพื่อแสดงสิ่งที่รหัสจริง บางครั้งคุณต้องส่งคืนฟังก์ชันกลาง - อย่าทิ้งreturnคำหลักสุดท้ายในบรรทัดสุดท้ายเพียงเพราะคุณทำได้ ฉันไม่ชอบการใช้คำฟุ่มเฟื่อย แต่ฉันชอบความมั่นคง
mindplay.dk

6
นี่คือคำตอบที่ดี แต่ก็ยังคงมีความเสี่ยงที่คุณเขียนวิธี Ruby ที่ตั้งใจจะเป็นโพรซีเดอร์ (aka ฟังก์ชันส่งคืนหน่วย) เช่นside_effect()และผู้พัฒนารายอื่นตัดสินใจที่จะ (ab) ใช้ค่าส่งคืนโดยนัยของโพรซีเดอร์ของคุณ ในการแก้ไขปัญหานี้คุณสามารถทำให้ขั้นตอนของคุณชัดเจนreturn nilขึ้น
Alex Dean

66

ไม่ได้รูปแบบทับทิมที่ดีโดยทั่วไปจะใช้ผลตอบแทนที่ชัดเจนสำหรับการกลับมาก่อนเท่านั้น Ruby มีขนาดใหญ่มากในการเขียนโค้ดมินิมัลลิสต์ / เวทมนต์โดยปริยาย

ที่กล่าวว่าหากการกลับมาอย่างชัดเจนจะทำให้สิ่งต่าง ๆ ชัดเจนขึ้นหรืออ่านง่ายขึ้นมันจะไม่เป็นอันตรายอะไรเลย


116
อะไรคือจุดมุ่งหมายของการทำให้โค้ดเรียบง่ายถ้ามันส่งผลให้เกิดความสับสนสูงสุด
jononomo

@JonCrowell มันควรส่งผลให้เกิดเอกสารสูงสุด
jazzpi

29
@jazzpi หากคุณต้องหนักเอกสารรหัสของคุณเพื่อให้เป็นที่เข้าใจกันดีว่าคุณไม่ได้ฝึกศิลปะที่คุณกำลังฝึกซ้อมกอล์ฟรหัส
Schwern

2
มันไม่สับสนที่จะแยกผลตอบแทนขั้นสุดท้ายออกมามันสร้างความสับสนให้กับมัน - ในฐานะนักพัฒนา Ruby ที่returnมีความหมายทางอรรถศาสตร์ที่สำคัญอยู่แล้วในฐานะ EARLY EXIT ในฟังก์ชั่น
Devon Parsons

14
@DevonParsons คนในโลกจะสับสนอย่างไรreturnในบรรทัดสุดท้ายในฐานะ EARLY EXIT
DarthPaghius

31

ฉันใช้returnคำหลักเป็นการส่วนตัวเพื่อแยกความแตกต่างระหว่างสิ่งที่ฉันเรียกวิธีการทำงานเช่นวิธีการที่จะดำเนินการเป็นหลักสำหรับค่าตอบแทนของพวกเขาและวิธีการขั้นตอนที่จะดำเนินการเป็นหลักสำหรับผลข้างเคียงของพวกเขา ดังนั้นวิธีการที่ค่าส่งคืนมีความสำคัญรับคำreturnหลักพิเศษเพื่อดึงดูดความสนใจกับค่าตอบแทน

ฉันใช้ความแตกต่างเดียวกันเมื่อเรียกเมธอด: เมธอดที่ใช้งานได้รับวงเล็บเมธอดโพรซีเดอร์ไม่ได้

และสุดท้าย แต่ไม่น้อยผมยังใช้ความแตกต่างที่มีบล็อก: บล็อกการทำงานได้รับเครื่องหมายปีกกาบล็อกขั้นตอน (บล็อคเช่นที่ว่า "ทำ" อะไรบางอย่าง) ได้รับ/doend

อย่างไรก็ตามฉันพยายามที่จะไม่นับถือศาสนาเกี่ยวกับเรื่องนี้: ด้วยบล็อก, วงเล็บปีกกาและdo/ endมีลำดับความสำคัญที่แตกต่างกันและแทนที่จะเพิ่มวงเล็บที่ชัดเจนเพื่อทำให้การแสดงออกชัดเจนฉันแค่เปลี่ยนไปใช้สไตล์อื่น เช่นเดียวกันสำหรับการเรียกใช้เมธอด: หากการเพิ่มวงเล็บรอบรายการพารามิเตอร์จะทำให้โค้ดอ่านง่ายขึ้นฉันทำได้แม้ว่าเมธอดที่เป็นปัญหาจะเป็นขั้นตอนตามธรรมชาติ


1
ตอนนี้ฉันไม่ได้ผลตอบแทนใด ๆ ใน "หนึ่งสมุทร" ซึ่งคล้ายกับสิ่งที่คุณทำและฉันทำทุกอย่างเหมือนกัน เป็นการดีที่จะรู้ว่าฉันไม่ได้เป็นอย่างสมบูรณ์ในสไตล์ของฉัน :)
Sasha Chedygov

@Jorg: คุณใช้รหัสส่งคืนก่อนกำหนดหรือไม่ สิ่งนั้นทำให้เกิดความสับสนกับโครงการ / ขั้นตอนการทำงานหรือไม่?
Andrew Grimm

1
@Andrew Grimm: ใช่และใช่ ฉันกำลังคิดที่จะพลิกกลับ ส่วนใหญ่ของวิธีการของฉันคือการอ้างอิงโปร่งใส / บริสุทธิ์ / การทำงาน / สิ่งที่คุณต้องการที่จะเรียกมันต่อไปดังนั้นจึงทำให้รู้สึกถึงการใช้แบบฟอร์มที่สั้นกว่าที่นั่น และวิธีการที่เขียนในรูปแบบการใช้งานมีแนวโน้มที่จะไม่ได้รับผลตอบแทนตั้งแต่เนิ่นๆเพราะนั่นหมายถึงความคิดของ "ขั้นตอน" ซึ่งไม่สามารถใช้งานได้มาก แม้ว่าฉันไม่ชอบผลตอบแทนที่อยู่ตรงกลาง ฉันจะใช้พวกเขาในตอนแรกเป็นผู้คุมหรือท้ายที่สุดเพื่อลดความยุ่งยากในการควบคุม
Jörg W Mittag

คำตอบที่ดี แต่จริง ๆ แล้วมันเป็นการปฏิบัติที่ดีกว่าในการเรียกวิธีการขั้นตอนด้วย () และวิธีการใช้งานโดยไม่ต้อง - ดูคำตอบของฉันด้านล่างเพื่อดูว่าทำไม
Alex Dean

13

จริงๆแล้วสิ่งสำคัญคือการแยกแยะระหว่าง:

  1. ฟังก์ชั่น - วิธีการดำเนินการสำหรับค่าตอบแทนของพวกเขา
  2. ขั้นตอน - วิธีการดำเนินการสำหรับผลข้างเคียงของพวกเขา

Ruby ไม่มีวิธีการแยกความแตกต่างแบบดั้งเดิม - ซึ่งทำให้คุณเสี่ยงต่อการเขียนโพรซีเดอร์side_effect()และผู้พัฒนารายอื่นตัดสินใจที่จะใช้ค่าตอบแทนโดยปริยายของโพรซีเดอร์ของคุณในทางที่ผิด (โดยทั่วไปถือว่าเป็นฟังก์ชันที่ไม่บริสุทธิ์)

ในการแก้ไขปัญหานี้ให้นำหนังสือของสกาล่าและแฮสเค็ลออกมาและให้กระบวนการของคุณกลับมาอย่างชัดเจนnil( Unitหรือ()ในภาษาอื่น ๆ )

ถ้าคุณทำตามนี้แล้วใช้returnไวยากรณ์ที่ชัดเจนหรือไม่เพียงกลายเป็นเรื่องของสไตล์ส่วนตัว

เพื่อแยกความแตกต่างระหว่างฟังก์ชั่นและขั้นตอนเพิ่มเติม:

  1. คัดลอกความคิดที่ดีของJörg W Mittag ในการเขียนบล็อกที่ใช้งานได้ด้วยเครื่องหมายปีกกาและบล็อกขั้นตอนด้วย do/end
  2. เมื่อคุณเรียกใช้โพรซีเดอร์ให้ใช้()ในขณะที่เมื่อคุณเรียกใช้ฟังก์ชัน

โปรดทราบว่าJörg W Mittag จริงสนับสนุนวิธีอื่น ๆ - หลีกเลี่ยง()สำหรับขั้นตอน - แต่ที่ไม่แนะนำเพราะคุณต้องการด้านที่มีผลต่อการเรียกวิธีการที่จะแตกต่างอย่างชัดเจนจากตัวแปรโดยเฉพาะอย่างยิ่งเมื่อ arity เป็น 0 เห็นคู่มือสไตล์ Scala กับวิธีการภาวนาสำหรับ รายละเอียด


หากฉันต้องการค่าที่ส่งคืนจากfunction_aและfunction_aถูกเขียนเพื่อโทร (และสามารถทำงานได้โดยการโทรเท่านั้น) procedure_bดังนั้นจึงเป็นfunction_aฟังก์ชั่นอย่างแท้จริงหรือไม่ มันคืนค่าตอบสนองความต้องการของคุณสำหรับฟังก์ชั่น แต่มันมีผลข้างเคียงตอบสนองความต้องการของขั้นตอน
Devon Parsons

2
คุณถูกต้อง Devon - function_aอาจมีprocedure_...สายการโทรได้เหมือนprocedure_aต้นไม้ที่มีfunction_...สายเรียกเข้าจริงๆ เช่นเดียวกับ Scala แต่ต่างจาก Haskell ไม่มีการรับประกันใน Ruby ว่าฟังก์ชั่นนั้นไม่มีผลข้างเคียง
Alex Dean

8

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


ดังที่กล่าวไปแล้วเหตุผลหลักสำหรับการใช้งานreturns อย่างชัดเจนคือมันสับสนสำหรับผู้ที่มาจากภาษาอื่น

  • ประการแรกสิ่งนี้ไม่ได้ จำกัด เฉพาะ Ruby เท่านั้น ตัวอย่างเช่น Perl มีผลตอบแทนโดยนัยเช่นกัน
  • ประการที่สองคนส่วนใหญ่ที่เกี่ยวข้องกับเรื่องนี้มาจากภาษาอัลกอล ส่วนใหญ่เป็นวิธี"ระดับต่ำ"กว่าทับทิมดังนั้นคุณต้องเขียนรหัสเพิ่มเติมเพื่อให้ได้สิ่งที่ทำ

heuristic ทั่วไปสำหรับความยาวของเมธอด (ไม่รวม getters / setters) ใน java คือหน้าจอเดียว ในกรณีดังกล่าวคุณอาจไม่เห็นคำจำกัดความวิธีการและ / หรือลืมไปแล้วว่าคุณกลับมาจากที่ใด

บนมืออื่น ๆ ในทับทิมดีที่สุดคือการยึดติดกับวิธีการน้อยกว่า 10 เส้นยาว เมื่อพิจารณาแล้วจะมีใครสงสัยว่าทำไมเขาถึงต้องเขียนเพิ่มอีก ~ 10% งบเมื่อพวกเขามีนัยโดยนัย


เนื่องจาก Ruby ไม่มีวิธีการที่เป็นโมฆะและทุกสิ่งนั้นกระชับกว่านี้มากคุณเพียงแค่เพิ่มค่าใช้จ่ายโดยไม่คำนึงถึงผลประโยชน์หากคุณไปกับreturns อย่างชัดเจน


1
"นี่เป็นหนึ่งในอนุสัญญาที่ชุมชนปฏิบัติตามอย่างเคร่งครัด" ประสบการณ์ของฉันคือไม่ผู้คนจะไม่ปฏิบัติตามอย่างเคร่งครัดเว้นแต่พวกเขาจะเป็นนักพัฒนาทับทิมที่มีประสบการณ์มาก
ทิมโฮลท์

1
@ TimHolt ฉันคงโชคดีมาก (:
ndnenkov

1
@ndn เห็นด้วยอย่างสมบูรณ์ สิ่งสำคัญคือเมื่อเมธอด (หรือคลาส) เริ่มเกิน 5/100 บรรทัดแล้วคุณควรพิจารณาสิ่งที่คุณพยายามทำ จริงๆแล้วกฎของ Sandi เป็นกรอบความคิดสำหรับการคิดเกี่ยวกับโค้ดซึ่งต่างจากกฎเกณฑ์ที่กำหนดไว้ ส่วนใหญ่ของรหัสที่ฉันพบไม่เป็นปัญหาเพราะมันเป็นข้อ จำกัด เทียม - มันมักจะตรงข้าม - ชั้นเรียนที่มีความรับผิดชอบหลายวิธีที่ยาวกว่าหลายชั้นเรียน โดยพื้นฐานแล้วมีคนจำนวนมากเกินไป "กระโดดฉลาม" - ทำหน้าที่ผสม
ไบรอันที่รัก

1
บางครั้งการประชุมยังเป็นความคิดที่ไม่ดี แบบแผนโวหารที่ต้องอาศัยเวทย์มนตร์ทำให้ประเภทผลตอบแทนยากที่จะคาดเดา ไม่ได้เปรียบอะไรนอกจากการกดปุ่ม 7 ครั้งและไม่สอดคล้องกับภาษาอื่นเกือบทั้งหมด หาก Ruby เคยทำการรวมรูปแบบ Python 3 และการทำให้เรียบง่ายขึ้นฉันหวังว่าทุกสิ่งจะเป็นตัวแรกในเขียง
Shayne

2
ยกเว้นชัดเจนมันไม่ได้ทำให้อ่านง่ายขึ้น! ความมหัศจรรย์และความเข้าใจไม่ได้เป็นเช่นนี้
Shayne

4

ฉันเห็นด้วยกับเบ็นฮิวจ์และไม่เห็นด้วยกับทิมโฮลท์เพราะคำถามดังกล่าวระบุวิธีการที่ไพ ธ อนทำและถามว่ารูบี้มีมาตรฐานที่คล้ายคลึงกันหรือไม่

มันทำ

นี่เป็นคุณสมบัติที่เป็นที่รู้จักกันดีของภาษาที่ทุกคนคาดว่าจะทำการแก้ไขปัญหาในทับทิมควรได้รับการคาดหวังว่าจะรู้เกี่ยวกับมัน


3
ฉันเห็นด้วยกับคุณในทางทฤษฎี แต่ในทางปฏิบัติโปรแกรมเมอร์ทำผิดพลาดและทำให้สับสน ในกรณีที่เรารู้ว่าคุณใช้ "==" ในเงื่อนไขและไม่ใช่ "=" แต่เราทุกคนเคยทำผิดพลาดมาก่อนและไม่ได้ตระหนักถึงมันจนกระทั่งในภายหลัง
Tim Holt

1
@ TimHolt ฉันไม่ได้พูดถึงกรณีการใช้งานใด ๆ โดยเฉพาะฉันแค่ตอบคำถาม เป็นสไตล์ที่ไม่ดีอย่างชัดเจนตามที่ชุมชนเลือกเพื่อใช้returnคำหลักเมื่อไม่จำเป็น
Devon Parsons

3
ยุติธรรมพอสมควร ฉันกำลังบอกว่าสไตล์ที่คุณพูดถึงสามารถนำไปสู่ความผิดพลาดได้หากคุณไม่ระวัง จากประสบการณ์ของฉันฉันสนับสนุนสไตล์ที่แตกต่าง
Tim Holt

1
@ TimHolt โดยวิธีการคำถามนี้ถูกถามวิธีก่อนที่จะเขียนคู่มือสไตล์ดังนั้นคำตอบที่ไม่เห็นด้วยไม่จำเป็นต้องผิดเพียงแค่ล้าสมัย ฉันสะดุดที่นี่ แต่อย่างใดและไม่เห็นลิงก์ที่ฉันให้ไว้ดังนั้นฉันจึงคิดว่าคนอื่นอาจมาที่นี่ด้วย
Devon Parsons

1
มันไม่ได้เป็น "มาตรฐาน" อย่างเป็นทางการ คู่มือรูปแบบทับทิมที่ใช้โดย rubocop และเชื่อมโยงในข้างต้นด้วยการอ้างสิทธิ์ที่มีโดย Devon Parsons ถูกสร้างขึ้นโดยแฮ็กเกอร์ทับทิมที่ไม่ใช่คอร์ ดังนั้นความคิดเห็นโดย Devon จึงเป็นความจริงที่ผิด แน่นอนคุณอาจจะใช้มัน แต่มันก็ไม่ได้มาตรฐาน
shevy

1

มันเป็นเรื่องของสไตล์ที่คุณชอบเป็นส่วนใหญ่ คุณต้องใช้การคืนคำหลักหากคุณต้องการกลับจากที่อื่นในระหว่างวิธีการ


0

อย่างที่เบ็นพูด ความจริงที่ว่า 'ค่าส่งคืนของวิธีการทับทิมเป็นค่าตอบแทนของคำสั่งสุดท้ายในร่างกายฟังก์ชั่น' ทำให้คำหลักผลตอบแทนที่จะไม่ค่อยใช้ในวิธีการทับทิมส่วนใหญ่

def some_func_which_returns_a_list( x, y, z)
  return nil if failed_some_early_check


  # function code 

  @list     # returns the list
end

4
คุณยังสามารถเขียน "กลับศูนย์ถ้า failed_some_early_check" ถ้าความตั้งใจของคุณยังคงเป็นที่ชัดเจน
ไมค์ไม้

@Gishu ฉันจริง ๆ แล้วบ่นเกี่ยวกับคำสั่ง if ไม่ใช่ชื่อวิธี
Andrew Grimm

@Andrew .. โอ้จุดจบที่หายไป :) เข้าใจแล้ว คงที่เพื่อปลอบใจความคิดเห็นอื่น ๆ เช่นกันจากไมค์
Gishu

ทำไมif failed_check then nil else @list endล่ะ นั่นคืออย่างแท้จริงการทำงาน
cdunn2001

@ cdunn2001 ไม่ชัดเจนว่าทำไมถ้าอย่างนั้นมีฟังก์ชั่นอื่น .. เหตุผลสำหรับสไตล์นี้ก็คือมันช่วยลดการซ้อนผ่านทางออกก่อน IMHO อ่านได้มากขึ้นด้วย
Gishu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.