JavaScript'te, switch ifadesinden çıkmak break kullanmaktan daha iyi bir uygulama mıdır?


199

Seçenek 1 - Dönüş kullanarak geçiş yapın:

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

        default: return "";
    }    
}

Seçenek 2 - Ara kullanarak geçiş:

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

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

        case 2: 
            retVal = "Two";
            break;

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

    return retVal;
}

Her ikisinin de işe yaradığını biliyorum, ama en iyi uygulamalardan biri daha mı? Seçenek 1'i beğenme eğilimindeyim - daha temiz ve daha basit olduğu için dönüşü en iyi şekilde kullanın.


@ İc3b3rg'nin yorumlarında bahsedilen tekniği kullanarak benim özel örneğimin bir jsFiddle'ı :

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;
}

İşlevi çağırmak için bunu aşağıdaki şekillerde yaparım:

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

Burada sorun her zaman tanımsız döndürüyor olmasıdır. Ben bunun özellik değil nesnenin gerçek değeri geçerken çünkü tahmin ediyorum. @ İc3b3rg'nin yorumlarında açıklanan tekniği kullanarak bunu düzeltmek için ne yapmalıyım ?


4
+1 Güzel soru. Bunu kendim merak ettim ve sadece geri dönmenin işe yaradığını bilirken, en iyi uygulama olup olmadığını bilmiyorum. Topluluğun ne düşündüğünü merak ediyorum.
Eli

Yanıtlar:


267

Bir ara, işlevde işlemeye devam etmenizi sağlar. İşlevde yapmak istediğiniz tek şey varsa, sadece anahtardan çıkmak iyidir.


6
Yani, sorumdaki örnek göz önüne alındığında, cevap evet. Ancak, devam etmeniz gereken bir fonksiyonunuz varsa, açıkçası bir mola vereceğiniz şey olacaktır.
Kod Maverick

9
@ Mark Costello'nun cevabı, sorunuz hakkında biraz daha teşekkür etmemi sağladı. Bence genel bir "en iyi uygulama" kılavuzu arıyorsunuz, ancak verdiğiniz spesifik örnekte en iyi uygulama return {1:"One",2:"Two,3:"Three"}[opt];. Varsayılana ihtiyacınız varsa, bu olurduvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - Tekniğimi tekniğinizi kullanmaya çalışırken özel örneğimle düzenledim return (opt in o) ? o[opt] : "";, ancak özel durumumda her zaman varsayılanı döndürüyor.
Kod Maverick

""Two"var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
Kodumda

Örneğini kullanmıyordum, sadece tekniği. Soruma bakın ve neden bahsettiğimi görmek için jsFiddle'ımın bağlantısını tıklayın.
Kod Maverick

9

Bu, eğer fonksiyonunuz sadece switch ifadesinden oluşuyorsa, bunun iyi olduğunu düşünüyorum. Ancak, bu işlev içinde başka işlemler yapmak istiyorsanız, muhtemelen iyi bir fikir değildir. İhtiyaçlarınızı, şimdi ve gelecekte de dikkate almanız gerekebilir. İşlevinizi birinci seçenekten ikinci seçeneğe değiştirmek isterseniz, daha fazla yeniden düzenleme gerekecektir.

Ancak, if / else ifadeleri dahilinde aşağıdakileri yapmak en iyi yöntemdir:

var foo = "bar";

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

Buna dayanarak, birinci seçeneğin daha iyi bir uygulama olduğu argümanı yapılabilir.

Kısacası, net bir cevap yoktur, bu nedenle kodunuz tutarlı, okunabilir, sürdürülebilir bir standarda bağlı olduğu sürece - yani uygulamanız boyunca bir ve iki seçenekleri karıştırmayın ve eşleştirmeyin, bu en iyi uygulama olmalıdır takip etme.


2
Bu örnekteki en iyi uygulamareturn foo == "bar";
ic3b3rg

10
Seni rahatsız ettiğim için özür dilerim ama bu durumda hala basitleştirebilirim: return foo == "bar" ? 0 : 100;hatta return [100,0][foo == "bar"];.
ic3b3rg

4
@ ic3b3rg - olmamalı yani: return [100,0][+(foo == "bar")]; ?
Kuyruk

3
@Sueue Boolean'ın tamsayıya dönüştürülmesi gerektiği için haklısınız, ancak bunu şu şekilde yaparım:return [100,0][foo == "bar" & 1];
ic3b3rg

7
@ ic3b3rg && Queue - Böyle hileler kullanarak bir başkasının kodunu nasıl korumak istersiniz? (Böyle şeyleri hızlandırmak için ön
derleyiciye güvenin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.