Существует ли язык программирования с лучшим подходом для операторов прерывания switch? - PullRequest
18 голосов
/ 10 июня 2010

Это тот же самый синтаксис, что и во многих языках:

switch (someValue) {

  case OPTION_ONE:
  case OPTION_LIKE_ONE:
  case OPTION_ONE_SIMILAR:
    doSomeStuff1();
    break; // EXIT the switch

  case OPTION_TWO_WITH_PRE_ACTION:
    doPreActionStuff2();
    // the default is to CONTINUE to next case

  case OPTION_TWO:
    doSomeStuff2();
    break; // EXIT the switch

  case OPTION_THREE:
    doSomeStuff3();
    break; // EXIT the switch

}

Теперь все, что вы знаете, требуется оператор break, потому что switch будет переходить к следующему case, когда break заявление отсутствует.У нас есть пример этого с OPTION_LIKE_ONE, OPTION_ONE_SIMILAR и OPTION_TWO_WITH_PRE_ACTION.Проблема в том, что нам нужен только этот «переход к следующему делу» очень-очень-очень редко.И очень часто мы ставим перерыв в конце case.

Для новичка очень легко забыть об этом.И один из моих учителей C даже объяснил нам это, как будто это была ошибка в языке C (не хочу говорить об этом:)

Я хотел бы спросить, есть ли другие языки, которые яне знаю (или забыл) о том, что обрабатывает switch / case следующим образом:

switch (someValue) {

  case OPTION_ONE:  continue; // CONTINUE to next case
  case OPTION_LIKE_ONE:  continue; // CONTINUE to next case
  case OPTION_ONE_SIMILAR:
    doSomeStuff1();
    // the default is to EXIT the switch

  case OPTION_TWO_WITH_PRE_ACTION:
    doPreActionStuff2();
    continue; // CONTINUE to next case

  case OPTION_TWO:
    doSomeStuff2();
    // the default is to EXIT the switch

  case OPTION_THREE:
    doSomeStuff3();
    // the default is to EXIT the switch

}

Второй вопрос: есть ли исторический смысл того, почему это так в C?Может быть, продолжить, чтобы следующий случай использовался гораздо чаще, чем мы используем его в наши дни?

Ответы [ 17 ]

1 голос
/ 11 июня 2010

Чистое предположение, но:

Я иногда пишу C или Java, в которых я говорю что-то вроде:

switch (tranCode)
{
  case 'A':
  case 'D':
  case 'R':
    processCredit();
    break;
  case 'B':
  case 'G':
    processDebit();
    break;
  default:
    processSpecial();
}

То есть я намеренно использую fall-thru, чтобы позволить нескольким значениям срабатыватьта же операция.

Интересно, думал ли об этом изобретатель C, когда создавал оператор SWITCH, это было бы нормальным использованием?

1 голос
/ 10 июня 2010

ОП говорит о "проваливании", но очень редко я когда-либо был этим обеспокоен.

Много-много раз, однако меня беспокоили не расширяемые проекты.Иными словами, операторы «switch (kbHit)» с несколькими сотнями ключей - это кошмар обслуживания, частое место для «божьих методов» и гигантские кучи спагетти-кода.

ИспользованиеПереключатель часто является признаком плохого объектно-ориентированного программирования.Как ответил другой человек, «2 использования Switch в 48 исходных файлах» в одном из его приложений показывают программиста, который не сильно полагается на эту конструкцию.Исходя из его метрики, я предполагаю, что он, по крайней мере, хороший структурированный программист и, вероятно, также понимает OOP / OOD.метод описания объектов, навязанный им, мог бы реализовать контейнер «инверсии управления», который публикует «нажатие клавиши» и позволяет подписчикам подключать свои обработчики для «кода клавиатуры x».Это может сделать чтение вашего кода намного проще.

0 голосов
/ 08 сентября 2011

Лима делает это так:

if someValue == ?1 ::
   OPTION_ONE: fall
   OPTION_LIKE_ONE: fall
   OPTION_ONE_SIMILAR:
     doSomeStuff1[]
     ;; the default is to EXIT the switch

   OPTION_TWO_WITH_PRE_ACTION:
     doPreActionStuff2[]
     fall                 ;; fall through to the next case

   OPTION_TWO:
     doSomeStuff2[]

   OPTION_THREE:
     doSomeStuff3[]
0 голосов
/ 12 июня 2010

Больше языков без ошибок:

XSLT JSTL Алголь PL / 1

0 голосов
/ 10 июня 2010

Tcl автоматически не проваливается.

0 голосов
/ 10 июня 2010

В объектно-ориентированных языках используется шаблон Цепочка ответственности . Как это реализовано, может отличаться. То, что вы описываете в своем примере, - это смешивание конечного автомата с поведением путем использования оператора switch. Для вашего конкретного примера подходящей реализацией будет шаблон цепочки ответственности с параметром, который цепочка оценивает как шаблон State , который мутирует по мере продвижения по цепочке.

0 голосов
/ 10 июня 2010

языков слишком много, и я не могу с уверенностью ответить, что такого языка нет, при условии, что он является «производным» от C по синтаксису, потому что другие языки используют другой синтаксис и где случай не «естественно» продолжается существует, например Fortran. Я не знаю языков, в которых используется явное продолжение, чтобы перейти к следующему случаю.

Я полагаю, что это историческая причина, потому что такой случай можно запрограммировать на «низком уровне». Более того, синтаксический аспект падежа относится к метке, и разрыв работает как в циклах, так что вы можете представить себе такой эквивалент:

if ( case == 1 ) goto lab1;
if ( case == 2 ) goto lab2;
if ( case == 3 ) goto lab3;    
//...
default:
  // default
  goto switch_end;
lab1:
  // do things
  goto switch_end; // if break is present
lab2:
  // do things, and follow to lab3
lab3:
  // lab3 stuffs
  goto switch_end;
//
...
switch_end:  // past all labS.
...