Альтернатива оператору “переключателя”

Я не хочу использовать Переключатель в своем коде, таким образом, я ищу некоторую альтернативу

Пример с переключателем:

function write(what) {

  switch(what) {

    case 'Blue':
      alert ('Blue');
    break;

    ...

    case 'Red':
      alert ('Red');
    break;

  }

}

Пример без переключателя:

colors = [];

colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };


function write(what) {

  colors[what]();

}

Мои вопросы:

  1. Вы знаете какие-либо другие альтернативы?
  2. Это лучшее решение?
19
задан John Saunders 21 February 2010 в 19:33
поделиться

5 ответов

У меня только замечание по поводу вашего второго подхода, вы не должны использовать массив для хранения нечисловых индексов (что в других языках называется ассоциативным массивом).

Вы должны использовать простой Object.

Также вы можете проверить, существует ли аргумент what, переданный вашей функции write, как свойство вашего объекта colors и посмотреть, является ли он функцией, чтобы вы могли вызвать его без ошибок во время выполнения:

var colors = {};

colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };


function write(what) {
  if (typeof colors[what] == 'function') {
    colors[what]();
    return;
  }
  // not a function, default case
  // ...
}
20
ответ дан 30 November 2019 в 04:11
поделиться

Вопрос 2:

Вообще, если вы можете заменить пользовательские структуры управления поиском по словарю, то все в полном порядке. Это легко читается и очень элегантно - придерживайтесь этого.

1
ответ дан 30 November 2019 в 04:11
поделиться

Альтернативой является определение класса с помощью метода write и переопределение этого метода в подклассах Red и Синий поступать правильно.

Лучше ли это предложенного вами решения, зависит от вашей конкретной ситуации.

0
ответ дан 30 November 2019 в 04:11
поделиться

Как я уже сказал, это здорово. Единственное, что я могу добавить к вашему решению, это то, что, возможно, лучше локализовать ваши цвета.

function write(what) {
    var colors = [];
    colors['Blue'] = function() { alert('Blue'); };
    colors['Red'] = function() { alert('Red'); };
    colors[what]();
}
0
ответ дан 30 November 2019 в 04:11
поделиться

Вы уже практически все сделали. Если возможно, вы можете добавить вспомогательную функцию, чтобы облегчить настройку. Например:

function setup(what)
{
    colors[what] = function() { alert(what); };
}

EDIT:
Если то, что вы хотите сделать для каждой опции, сложнее, очевидно, что это не сработает. Как упоминалось в комментариях @roe, здесь используются глобальные цвета, что часто не одобряется.

0
ответ дан 30 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: