Я не хочу использовать Переключатель в своем коде, таким образом, я ищу некоторую альтернативу
Пример с переключателем:
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]();
}
Мои вопросы:
У меня только замечание по поводу вашего второго подхода, вы не должны использовать массив для хранения нечисловых индексов (что в других языках называется ассоциативным массивом).
Вы должны использовать простой 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
// ...
}
Вопрос 2:
Вообще, если вы можете заменить пользовательские структуры управления поиском по словарю, то все в полном порядке. Это легко читается и очень элегантно - придерживайтесь этого.
Альтернативой является определение класса с помощью метода write
и переопределение этого метода в подклассах Red
и Синий
поступать правильно.
Лучше ли это предложенного вами решения, зависит от вашей конкретной ситуации.
Как я уже сказал, это здорово. Единственное, что я могу добавить к вашему решению, это то, что, возможно, лучше локализовать ваши цвета
.
function write(what) {
var colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
colors[what]();
}
Вы уже практически все сделали. Если возможно, вы можете добавить вспомогательную функцию, чтобы облегчить настройку. Например:
function setup(what)
{
colors[what] = function() { alert(what); };
}
EDIT:
Если то, что вы хотите сделать для каждой опции, сложнее, очевидно, что это не сработает. Как упоминалось в комментариях @roe, здесь используются глобальные цвета, что часто не одобряется.