เป็นหลักการสไตล์การเข้ารหัส - เช่นหลักการออกทางเดียว
ผู้ที่ยังคงสงสัยว่าจะออกทางเดียวหรือหลายทางออกยังคงติดอยู่ในปลายปี 1960 ย้อนกลับไปการอภิปรายดังกล่าวมีความสำคัญเนื่องจากเราอยู่ในช่วงวัยเด็กของโปรแกรมเมอร์ที่มีโครงสร้างและมีค่ายจำนวนมากที่ประกาศว่าการค้นพบที่อยู่เบื้องหลังทฤษฎีโครงสร้างของโปรแกรม
มันเป็นสิ่งที่ควรได้รับการตั้งถิ่นฐานมานานแล้ว มีการตกลงกัน (เกือบ 4 ทศวรรษที่จะแม่นยำทั้งในแวดวงวิชาการและอุตสาหกรรม) แต่ผู้คน (ผู้ที่เป็นมืออาชีพหรือต่อต้าน) ไม่ได้ให้ความสนใจ
สำหรับคำตอบที่เหลือของฉันมันคือทั้งหมดที่เกี่ยวข้อง (สิ่งที่ไม่ได้อยู่ในซอฟต์แวร์?):
ใช่. เวลาส่วนใหญ่สำหรับเคสทั่วไปโดยมีข้อ จำกัด เฉพาะสำหรับเคสเคสและการสร้างโปรแกรมเฉพาะภาษา
เสมอหรือบางครั้ง
เวลาส่วนใหญ่.
มันแตกต่างกันมากแค่ไหน?
ขึ้นอยู่กับ
รหัสที่อ่านได้และรหัสที่อ่านไม่ได้ ความซับซ้อนที่เพิ่มขึ้น (ซึ่งเราควรทราบในตอนนี้เพิ่มความน่าจะเป็นในการแนะนำข้อผิดพลาด) เทียบกับความซับซ้อนที่ง่ายขึ้น (และเออร์โกความน่าจะเป็นข้อผิดพลาดเล็ก ๆ น้อย ๆ ) ภาษาที่คอมไพเลอร์ไม่เพิ่มผลตอบแทนโดยปริยาย เริ่มต้นที่ int (C และ C ++)
ในท้ายที่สุดมันเป็นทักษะที่ได้รับจากคน / ชั่วโมงหลังแป้นพิมพ์ บางครั้งมันก็โอเคที่จะมีคำสั่งคืนหลายรายการเช่นที่นี่ (ในบาง Pascal'esque pseudocode):
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
ความตั้งใจชัดเจนและอัลกอริธึมนั้นเล็กพอและไม่ซับซ้อนพอที่จะไม่รับประกันการสร้างตัวแปร 'ค่าสถานะ' ที่เก็บค่าส่งคืนในที่สุดที่ใช้ในจุดส่งคืนเดียว อัลกอริทึมอาจมีข้อผิดพลาด แต่โครงสร้างของมันนั้นง่ายพอที่ความพยายามในการตรวจสอบข้อผิดพลาดนั้นเล็กน้อยมาก
บางครั้งมันก็ไม่ได้ (ที่นี่ใช้รหัสเทียม C เหมือน):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
ที่นี่อัลกอริทึมไม่มีโครงสร้างอย่างง่ายและคำสั่งสวิตช์ (หนึ่งสไตล์ C) อนุญาตขั้นตอนที่ผ่านซึ่งอาจหรือไม่อาจทำโดยเจตนาเป็นส่วนหนึ่งของอัลกอริทึม
บางทีอัลกอริทึมนั้นถูกต้อง แต่เขียนได้ไม่ดี
หรืออาจเป็นเพราะแรงภายนอกที่เกินความสามารถของโปรแกรมเมอร์นี่คือการแสดงจริง (และถูกต้อง) ของอัลกอริทึมที่ต้องการอย่างถูกกฎหมาย
บางทีมันผิด
การเปิดเผยความจริงของสิ่งนี้ต้องใช้ความพยายามมากกว่าในตัวอย่างก่อนหน้า และในที่นี้มีบางสิ่งที่ฉันเชื่อมั่นอย่างยิ่ง (โปรดทราบว่าฉันไม่มีการศึกษาอย่างเป็นทางการเพื่อสำรองข้อมูลนี้):
สมมติว่าข้อมูลโค้ดที่คิดว่าถูกต้อง:
คำสั่งการส่งคืนหลายรายการเพิ่มความสามารถในการอ่านและความเรียบง่ายของข้อมูลโค้ดดังกล่าวหากข้อมูลโค้ดแสดงถึงอัลกอริธึมที่เรียบง่ายพร้อมโครงสร้างการไหลที่เรียบง่ายโดยเนื้อแท้ ง่ายๆฉันไม่ได้หมายถึงตัวเล็ก แต่ฉันหมายถึงความเข้าใจหรือหลักฐานโดยเนื้อแท้ที่ไม่จำเป็นต้องใช้ความพยายามในการอ่านที่ไม่สมส่วน (หรือชักนำให้ผู้คนอาเจียนอาเจียนสาปแช่งแม่ของใครบางคนหรือกลืนกระสุนเมื่อพวกเขาต้องอ่าน )
คำสั่งส่งคืนเดียวเพิ่มความสามารถในการอ่านและความเรียบง่ายของชิ้นส่วนของรหัสหากค่าส่งคืนถูกคำนวณตลอดการดำเนินการของอัลกอริทึมหรือถ้าขั้นตอนในอัลกอริทึมที่รับผิดชอบในการคำนวณสามารถรวมกลุ่มกันในที่ตั้งเดียว .
คำสั่งส่งคืนเดียวจะลดความสามารถในการอ่านและความเรียบง่ายของชิ้นส่วนของรหัสดังกล่าวหากต้องการการกำหนดให้กับตัวแปรแฟล็กหนึ่งตัวหรือมากกว่าโดยที่ตั้งของการมอบหมายดังกล่าวไม่ได้ตั้งอยู่อย่างสม่ำเสมอตลอดอัลกอริธึม
คำสั่ง return หลายรายการจะลดความสามารถในการอ่านและความเรียบง่ายของชิ้นส่วนของรหัสถ้าคำสั่ง return ไม่กระจายอย่างสม่ำเสมอในอัลกอริทึมและหากพวกเขากำหนดขอบเขตบล็อกของรหัสที่ไม่ได้มีขนาดหรือโครงสร้างเหมือนกัน
สิ่งนี้เกี่ยวข้องอย่างใกล้ชิดกับความซับซ้อนของข้อมูลโค้ดที่เป็นปัญหา และสิ่งนี้ก็สัมพันธ์กับความซับซ้อนของวัฏจักรและการหยุดนิ่ง จากนี้เราสามารถสังเกตได้ดังต่อไปนี้:
ยิ่งขนาดรูทีนย่อยหรือฟังก์ชั่นใหญ่ขึ้นเท่าไหร่โครงสร้างการไหลของการควบคุมภายในก็มีขนาดใหญ่ขึ้นและมีความซับซ้อนมากขึ้นเท่านั้นและความน่าจะเป็นที่คุณจะเผชิญกับคำถามว่า
บทสรุปของสิ่งนี้คือให้งานเล็ก ๆ ทำสิ่งเดียวและทำสิ่งเดียวเท่านั้น (และทำได้ดี) หากพวกเขาแสดงตัวชี้วัดความซับซ้อนของ cyclomatic และ halstead ที่มีขนาดเล็กในนามไม่เพียง แต่พวกมันจะถูกต้องและถูกนำไปใช้ในงานที่เข้าใจได้โครงสร้างภายในของพวกเขาจะค่อนข้างชัดเจนด้วยตนเอง
จากนั้นและเพียงคุณเท่านั้นที่สามารถทำได้อย่างง่ายดายและโดยไม่สูญเสียการนอนหลับมากคุณสามารถตัดสินใจว่าจะใช้ผลตอบแทนเดี่ยวและผลตอบแทนหลายรายการโดยไม่ต้องเสี่ยงกับการแนะนำข้อผิดพลาดด้วยตัวเลือกใดตัวเลือกหนึ่ง
หนึ่งอาจดูที่ทั้งหมดนี้และแนะนำว่าเมื่อผู้คนต่อสู้กับปัญหาของผลตอบแทนเดียวหรือหลายผลตอบแทนเป็นเพราะ - ไม่ชำนาญ, ความโง่เขลาหรือขาดจรรยาบรรณในการทำงาน - พวกเขาไม่ได้เขียนโค้ดที่สะอาดและมีแนวโน้มที่จะเขียน ฟังก์ชั่นมหึมาที่ไม่สนใจมาตรการ cyclomatic และ halstead อย่างสมบูรณ์