У JavaScript, чи повернення з заяви перемикання вважається кращою практикою, ніж використання перерви?


198

Варіант 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 Добре запитання. Я сам це задумався, і, хоча я знаю, що це працює просто повернутися, я не знаю, чи це найкраща практика. Цікаво подивитися, що думає громада.
Елі

Відповіді:


266

Перерва дозволить продовжити обробку функції. Просто повернутися з вимикача добре, якщо це все, що ви хочете зробити у функції.


6
Отже, з огляду на приклад мого запитання, відповідь - так. Але якщо у вас є функція, де вам потрібно продовжувати рух, очевидно, перерва була б тим, що ви використовували б.
Code Maverick

9
Відповідь Марка Костелло змусила мене ще трохи подякувати за ваше запитання. Я думаю, ти шукаєш загальну інструкцію "найкращої практики", але в конкретному прикладі, який ти наводив, найкраща практика 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] : "";, але це завжди повертає за замовчуванням у моєму конкретному випадку.
Code Maverick

У моєму коді була помилка (пропущена 2-а "в "Two"), але вона працює для мене ... ось простий тест:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

Я не використовував твій приклад, а лише техніку. Подивіться на моє запитання та натисніть посилання на мій jsFiddle, щоб побачити, про що я говорю.
Code Maverick

9

Це залежить, якщо ваша функція складається лише з заяви перемикача, то я думаю, що це добре. Однак якщо ви хочете виконувати будь-які інші операції в межах цієї функції, це, мабуть, не чудова ідея. Вам також, можливо, доведеться врахувати свої вимоги зараз, а не в майбутньому. Якщо ви хочете змінити свою функцію з першого варіанту на другий варіант, знадобиться більше рефакторингу.

Однак, враховуючи, що в заявах 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 - Як ви хочете підтримувати хтось інший код, використовуючи такі хитрощі? (Довіряйте прекомпілятору, щоб оптимізувати подібні речі)
T4NK3R,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.