Dalam JavaScript, apakah kembali dari pernyataan beralih dianggap praktik yang lebih baik daripada menggunakan istirahat?

198

Opsi 1 - beralih menggunakan kembali:

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

        default: return "";
    }    
}

Opsi 2 - beralih menggunakan istirahat:

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

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

        case 2: 
            retVal = "Two";
            break;

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

    return retVal;
}

Saya tahu bahwa keduanya berfungsi, tetapi apakah satu lagi merupakan praktik terbaik? Saya cenderung menyukai Opsi 1 - beralih menggunakan return terbaik, karena lebih bersih dan sederhana.


Ini adalah jsFiddle dari contoh spesifik saya menggunakan teknik yang disebutkan dalam komentar @ 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;
}

Untuk memanggil fungsi, saya akan melakukannya dengan cara berikut:

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

Masalahnya di sini adalah bahwa ia selalu mengembalikan tidak terdefinisi. Saya menduga bahwa itu karena nilai aktual objek lewat dan bukan properti. Apa yang akan saya lakukan untuk memperbaikinya dengan menggunakan teknik yang dijelaskan dalam komentar @ ic3b3rg ?

Code Maverick
sumber
4
+1 pertanyaan bagus. Saya sendiri sudah bertanya-tanya, dan sementara saya tahu itu berhasil untuk kembali, saya tidak tahu apakah ini praktik terbaik. Penasaran ingin melihat apa yang dipikirkan masyarakat.
Eli

Jawaban:

266

Istirahat akan memungkinkan Anda melanjutkan pemrosesan dalam fungsi. Baru saja kembali dari saklar baik-baik saja jika itu semua yang ingin Anda lakukan dalam fungsi.

ic3b3rg
sumber
6
Jadi, diberikan contoh dalam pertanyaan saya, jawabannya adalah ya. Tetapi, jika Anda memiliki fungsi di mana Anda harus terus berjalan, jelas istirahat akan menjadi apa yang akan Anda gunakan.
Code Maverick
9
@Mark Costello menjawab membuat saya berterima kasih sedikit lebih banyak tentang pertanyaan Anda. Saya pikir Anda sedang mencari pedoman umum "praktik terbaik", tetapi dalam contoh spesifik yang Anda berikan, praktik terbaik adalah return {1:"One",2:"Two,3:"Three"}[opt];. Jika Anda memerlukan default maka itu akan menjadivar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg
@ ic3b3rg - Saya telah mengedit pertanyaan saya dengan contoh spesifik saya mencoba memanfaatkan teknik Anda return (opt in o) ? o[opt] : "";, tetapi selalu mengembalikan default dalam kasus khusus saya.
Code Maverick
Ada kesalahan ketik dalam kode saya (hilang 2 "in "Two") tetapi berfungsi untuk saya ... inilah tes sederhana:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
Saya tidak menggunakan contoh Anda, hanya tekniknya. Lihatlah pertanyaan saya dan klik tautan ke jsFiddle saya untuk melihat apa yang saya bicarakan.
Code Maverick
9

Itu tergantung, jika fungsi Anda hanya terdiri dari pernyataan switch, maka saya pikir itu baik-baik saja. Namun, jika Anda ingin melakukan operasi lain dalam fungsi itu, itu mungkin bukan ide bagus. Anda juga mungkin harus mempertimbangkan kebutuhan Anda sekarang dibandingkan di masa depan. Jika Anda ingin mengubah fungsi Anda dari opsi satu ke opsi dua, diperlukan lebih banyak refactoring.

Namun, mengingat bahwa dalam pernyataan if / else itu adalah praktik terbaik untuk melakukan hal berikut:

var foo = "bar";

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

Berdasarkan ini, argumen dapat dibuat bahwa opsi satu adalah praktik yang lebih baik.

Singkatnya, tidak ada jawaban yang jelas, sehingga selama kode Anda mematuhi standar yang konsisten, dapat dibaca, dan dapat dipertahankan - artinya jangan mencampur dan mencocokkan opsi satu dan dua di seluruh aplikasi Anda, itu adalah praktik terbaik yang harus Anda lakukan. berikut.

Mark Costello
sumber
2
Praktik terbaik dalam contoh itu adalahreturn foo == "bar";
ic3b3rg
10
Saya minta maaf jika saya mengganggu Anda tetapi dalam hal ini saya masih menyederhanakan: return foo == "bar" ? 0 : 100;atau bahkan return [100,0][foo == "bar"];.
ic3b3rg
4
@ ic3b3rg - Seharusnya yang menjadi: return [100,0][+(foo == "bar")]; ?
Antrian
3
@Queue Anda benar karena boolean harus dikonversi ke integer, tapi saya akan melakukannya dengan cara ini:return [100,0][foo == "bar" & 1];
ic3b3rg
7
@ ic3b3rg && Antrian - Bagaimana Anda ingin mempertahankan kode orang lain menggunakan trik seperti itu? (Percayai precompiler untuk mempercepat hal-hal seperti itu)
T4NK3R