Что лучшее альтернативно к неконтролируемому оператору переключения?

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

У вас есть два варианта:

  1. Расширить текущий элемент управления VizFrame, который вы используете, чтобы переопределить / реализовать то, что вам нужно
  2. Использовать сторонний элемент управления отображать графики. Я бы порекомендовал вам проверить мою реализацию openui5-chartjs

10
задан gonzobrains 25 November 2012 в 23:30
поделиться

10 ответов

Почему Вы хотели бы переписать их в другой структуре? Если у Вас действительно есть 20 случаев, которые должны быть обработаны индивидуально, переключатель/случай является способом пойти. Большая цепочка того, если/затем логика была бы ужасна для поддержания.

Полиморфизм является другой опцией при использовании объектно-ориентированного языка. Каждый подкласс реализовал бы свою собственную функциональность в методе.

16
ответ дан 3 December 2019 в 14:00
поделиться

Полиморфизм. Но это не может быть тривиальный рефакторинг.

Некоторые примеры и судьи:

Рефакторинг (книги Googe)

Запах кода Оператора переключения и Полиморфизм

Рефакторинг операторов переключения

6
ответ дан 3 December 2019 в 14:00
поделиться

Как другие указали, это зависит от оператора переключения. Однако в прошлом я осуществил рефакторинг операторы переключения путем продолжения следующим образом. Предположим, что у нас есть оператор переключения как это с большим количеством повторяющегося кода

switch(x){
   case 1:
     makeitso("foo");
     globalLog += "foo";
   case 2:
     makeitso("bar");
     globalLog += "bar";
   case 3:
     makeitso("baz");
     globalLog += "baz";
   ...
   default:
      throw("input error");
}

первое, что нужно сделать состоит в том, чтобы распознать части, которые обще (в реальном мире, это, вероятно, будет немного более существенно),

makeitso([some string]);
globalLog += [some string];

и превратите это в функцию

function transformInput(somestring) {
     makeitso(somestring);
     globalLog += somestring;
}

затем для частей, которые изменяются в каждом случае, используйте хеш или массив;

var transformvalues = ["foo", "bar", "baz"];

отсюда мы можем сделать это:

var tvals = ["foo", "bar", "baz" ... ];
function transformInput(somestring) {
     makeitso(somestring);
     globalLog += somestring;
}
var tval = tvals[x];
if(tval!==undefined) {
     transformInput(tval);
} else {
    throw ("invalid input");
} 

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

5
ответ дан 3 December 2019 в 14:00
поделиться

Три предложения (повторяющий некоторых уже данных):

  1. Возможно, переключатель не так плох, как Вы думаете. Это может быть ужасно, если блоки случая являются большими. Сократите их путем извлечения логики в методы.

  2. На языке OO полиморфизм мог бы быть ответом, как многие указали.

  3. На функциональном языке, как JavaScript, пишут функцию, которая возвращает функцию, которую необходимо выполнить для любого входа. Это могло бы использовать сам оператор переключения, или он мог бы использовать справочную таблицу.

4
ответ дан 3 December 2019 в 14:00
поделиться

Нет ничего неправильно с наличием 20 случаев в операторе переключения. Можно привести в порядок код путем рефакторинга и, по крайней мере, переместить обработку случая в методы/функции.

2
ответ дан 3 December 2019 в 14:00
поделиться

Вы могли всегда использовать справочную таблицу.

2
ответ дан 3 December 2019 в 14:00
поделиться

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

Также может случиться так, что использование переключателя с 20 случаями может на самом деле быть лучшим планом действий для него. Пока это читаемо, и каждый результат ясно передает то, что действие нет никакой потребности действительно осуществить рефакторинг его.

2
ответ дан 3 December 2019 в 14:00
поделиться

если это работает без главных ошибок (не главный, я подразумеваю, что они не заставляют Вас вытащить волосы), почему беспокойство осуществляет рефакторинг его? Не осуществляйте рефакторинг все.

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

0
ответ дан 3 December 2019 в 14:00
поделиться

Это зависит, что делает оператор переключения.

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

Если это соответствует (говорят), что целое число против списка позволенных значений, можно создать базовый класс и ряд производных классов для каждого значения. Затем независимо от того, что генерирует целочисленные данные, во-первых может создать экземпляр производного класса со всем оператором переключения "ответы" вместо этого.

Третья опция состоит в том, чтобы создать структуру данных, которая отображает шаблоны на действия (т.е. функционирует или возражает с виртуальными методами). Можно искать значение переключателя в этих данных strucutre и выполнить соответствующие меры.

0
ответ дан 3 December 2019 в 14:00
поделиться

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

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

Если Вы действительно действительно должны, то Шаблон разработки Посетителя является общей заменой случая переключателя, хотя необходимо отметить, что он действительно имеет недостатки. (т.е. проверьте www.objectmentor.com/resources/articles/acv.pdf),

2
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

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