Как обработать «переключатель / случай», когда новые параметры добавлены в выпуск ПО - PullRequest
0 голосов
/ 20 мая 2011

Как обрабатывать, когда когда-нибудь появляется новый релиз ПО, и он добавляет еще один индекс к switch case. Индекс представляет параметр в этом случае. Например,

Rel1: i = 1-5, 7 (исключая 6)

Rel2: я = 1-7

for (int i = 1; i<=7;i++)
{
  switch (i)
  {
    case 1: /*process data*/ break;
    case 2: /*process data*/ break;
    case 3: /*process data*/ break;
    case 4: /*process data*/ break;
    case 5: /*process data*/ break;
    // case 6: // REL 2
    case 7: /*process data*/ break;
    default: break;
  }
}

Могу ли я на самом деле проверить, добавив оператор if между этими случаями? Есть идея получше?

Ответы [ 5 ]

3 голосов
/ 20 мая 2011

#define какая версия это и затем используйте #ifdef.

  switch (i)
  {
    case 1: /*process data*/ break;
    case 2: /*process data*/ break;
    case 3: /*process data*/ break;
    case 4: /*process data*/ break;
    case 5: /*process data*/ break;
#ifdef REL_2
    case 6: /*process data*/ break;  // <-- executed only for REL_2
#endif
    case 7: /*process data*/ break;
    default: break;
  }
1 голос
/ 20 мая 2011

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

0 голосов
/ 20 мая 2011

Если вы хотите перехватить неожиданные значения, разве вы не должны ставить эту проверку в части default?

...
default:
    assert(false);   // We should never get here!
0 голосов
/ 20 мая 2011

Мне очень странно видеть switch вложенный в цикл ...

Похоже, вы выполняете канал.Тогда почему бы вам просто не определить это как единое целое.

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

0 голосов
/ 20 мая 2011

Вместо использования цикла for используйте цикл while с функцией генератора номера выпуска.

Псевдокод:

typedef enum {rel1, rel2} rel_t;

// Where 'ReleaseSequence' is a generator functor. Class that takes rel_t
// in constructor and creates an appropriate functor that returns the
// required sequence of numbers for a particular release

ReleaseSequence seq(rel1);
while (i = seq()) {
    switch (i) {
        case 1:...
        case 2:...
        case 3:...
        case 4:...
        case 5:...
        case 6:...
        case 7:...
        default:
               break;
    }
}
...