Альтернатива заявлению "switch"
Я не хочу использовать Switch в своем коде, поэтому я ищу альтернативу
Пример с коммутатором:
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
У меня есть только заметка о вашем втором подходе, вы не должны использовать Array для хранения нечисловых индексов (которые вы бы назвали в других языках - ассоциативный массив).
Вы должны использовать простой объект.
Кроме того, вы можете проверить, существует ли аргумент 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
// ...
}
Ответ 2
Я использовал такую структуру сегодня:
var chosenColor = 'red';
var colorString = {
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.';
Мне нравится, что это действительно небольшое количество кода для выбора строки, основанной на выборе.
Вы также можете передать его функции:
alert({
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.');
Ответ 3
Вы можете использовать литералы объектов и попытаться поймать ловушку по умолчанию:
function write(what) {
var colors = {
'Blue': function(){ alert('Light-Blue'); },
'Red': function(){ alert('Deep-Red'); },
'Green': function(){ alert('Deep-Green'); }
}
try {colors[what]();}
catch(err) {colors['Green']();}//default behaviour
}
write('Pink');
Ответ 4
Вопрос 2:
Как правило, если вы можете заменить настраиваемые структуры управления поиском по словарю, вы в полном порядке. Он легко читается и очень элегантен - придерживайтесь его.
Ответ 5
Мне пришлось делать сравнение для группового типа реквизитов объектов для списка и не хотели делать переключатель/случай для всех возможностей, поэтому сначала я сделал массив объектов, присваивающих числовому рангу, так что случай стал простым сравнением. Это всего лишь 4 возможности, но вы получаете дрейф того, как расширить это до ситуации, когда переключатель/случай становится неуправляемым:
function mySort2 (item1, item2) {
var matrix = {
'repair': 4,
'r/r': 3,
'part': 2,
'misc': 1
};
(matrix[item1.category] < matrix[item2.category]) ? return +1 : return -1;
//если возможно, плохие данные нужно проверить для этого первого???
i1=matrix[item1.category] || null;
i2=matrix[item2.category] || null;
if (i1==null){
// handle bad data in item 1
return +1; // put it after 2
}
if (i2==null){
// ditto
return -1; //put 1 first
}
if (i1<i2)
return +1;
else
return -1;
}
Ответ 6
Альтернативой является определение класса с помощью метода write
и переопределение в подклассах Red
и Blue
для правильной работы.
Является ли это лучше, чем предлагаемое вами решение, зависит от вашей конкретной ситуации.
Ответ 7
Ты уже там уже много. Если возможно, вы можете добавить вспомогательную функцию, чтобы упростить настройку. Например:
function setup(what)
{
colors[what] = function() { alert(what); };
}
EDIT:
Если то, что вы хотите сделать для каждого варианта, более сложно, это не сработает. Как упоминалось в комментариях @roe, это использует глобальные цвета, на которые часто нахмурились.
Ответ 8
Как я уже сказал, это здорово. Единственное, что я могу добавить к вашему решению, это то, что, возможно, лучше локализовать ваш colors
.
function write(what) {
var colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
colors[what]();
}