ใน JavaScript การกลับมาจากคำสั่ง switch ถือเป็นการปฏิบัติที่ดีกว่าการใช้ตัวแบ่ง?


199

ตัวเลือกที่ 1 - สลับใช้การส่งคืน:

function myFunction(opt) 
{
    switch (opt) 
    {
        case 1: return "One";
        case 2: return "Two";
        case 3: return "Three";

        default: return "";
    }    
}

ตัวเลือก 2 - สลับการใช้ตัวแบ่ง:

function myFunction(opt) 
{
    var retVal = "";

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}

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


นี่คือ jsFiddle ของตัวอย่างเฉพาะของฉันโดยใช้เทคนิคที่กล่าวถึงในความคิดเห็นของ @ ic3b3rg :

var SFAIC = {};

SFAIC.common = 
{
    masterPages: 
    {
        cs: "CS_",
        cp: "CP_"
    },

    contentPages: 
    {
        cs: "CSContent_",
        cp: "CPContent_"    
    }
};

function getElementPrefix(page) 
{
    return (page in SFAIC.common.masterPages)
        ? SFAIC.common.masterPages[page]
        : (page in SFAIC.common.contentPages)
            ? SFAIC.common.contentPages[page]
            : undefined;
}

ในการเรียกใช้ฟังก์ชั่นฉันจะทำในวิธีต่อไปนี้:

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

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


4
+1 คำถามที่ดี ฉันสงสัยในสิ่งนี้ด้วยตัวเองและในขณะที่ฉันรู้ว่ามันใช้ได้ผลแค่คืนฉันไม่รู้ว่ามันเป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่ อยากรู้ว่าชุมชนคิดอย่างไร
อีไล

คำตอบ:


267

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


6
จากตัวอย่างในคำถามของฉันคำตอบคือใช่ แต่ถ้าคุณมีฟังก์ชั่นที่คุณต้องเดินหน้าต่อไปเห็นได้ชัดว่าการหยุดพักคือสิ่งที่คุณจะใช้
รหัสไม่ฝักใฝ่ฝ่ายใด

9
@Mark Costello คำตอบทำให้ฉันขอบคุณอีกเล็กน้อยเกี่ยวกับคำถามของคุณ ฉันคิดว่าคุณกำลังมองหาทั่วไป "การปฏิบัติที่ดีที่สุด" แนวทาง return {1:"One",2:"Two,3:"Three"}[opt];แต่ในตัวอย่างที่เฉพาะเจาะจงที่คุณให้การปฏิบัติที่ดีที่สุดคือ หากคุณต้องการค่าเริ่มต้นก็จะเป็นvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - ฉันได้แก้ไขคำถามของฉันพร้อมกับตัวอย่างเฉพาะของฉันที่พยายามใช้เทคนิคของreturn (opt in o) ? o[opt] : "";คุณ แต่จะส่งกลับค่าเริ่มต้นในกรณีเฉพาะของฉันเสมอ
รหัสไม่ฝักใฝ่ฝ่ายใด

มีการพิมพ์ผิดอยู่ในรหัสของฉัน (หายไป 2 "ใน"Two") แต่การทำงานสำหรับฉัน ... นี่คือการทดสอบง่ายๆ:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

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

9

ขึ้นอยู่กับว่าถ้าฟังก์ชั่นของคุณประกอบด้วยคำสั่ง switch เท่านั้นฉันคิดว่ามันดี อย่างไรก็ตามหากคุณต้องการดำเนินการอื่น ๆ ภายในฟังก์ชั่นนั้นอาจไม่ใช่ความคิดที่ดี คุณอาจต้องพิจารณาความต้องการของคุณตอนนี้กับในอนาคต หากคุณต้องการเปลี่ยนฟังก์ชั่นของคุณจากตัวเลือกที่หนึ่งเป็นตัวเลือกที่สองคุณจะต้องทำการปรับโครงสร้างใหม่อีกครั้ง

อย่างไรก็ตามในกรณีที่คำสั่ง if / else เป็นแนวปฏิบัติที่ดีที่สุดในการทำสิ่งต่อไปนี้:

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

จากสิ่งนี้ข้อโต้แย้งอาจทำให้ตัวเลือกที่หนึ่งเป็นแนวปฏิบัติที่ดีกว่า

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


2
แนวปฏิบัติที่ดีที่สุดในตัวอย่างนั้นคือreturn foo == "bar";
ic3b3rg

10
ฉันขอโทษถ้าฉันน่ารำคาญคุณ แต่ในกรณีที่ผมยังคงต้องการลดความซับซ้อน: หรือแม้กระทั่งreturn foo == "bar" ? 0 : 100; return [100,0][foo == "bar"];
ic3b3rg

4
@ ic3b3rg - ไม่ควรที่จะ: return [100,0][+(foo == "bar")]; ?
คิว

3
@Queue คุณถูกต้องในที่บูลีนควรถูกแปลงเป็นจำนวนเต็ม แต่ฉันจะทำอย่างนี้:return [100,0][foo == "bar" & 1];
ic3b3rg

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