1

Я рефакторинг кода, который я написал, и я должен решить, хочу ли я поставить оператор switch в цикл while или повторить цикл while в каждом случае. Эти два способа являются чем-то вроде следующего псевдокода:Выключить оператор в цикл while или while в блоки case?

Вариант 1)

while (cnt > 0) { 
    switch (value) { 
    case A: 
     doSomething(); 
     break; 
    case B: 
     doSomethingElse(); 
     break; 
    ... 
    default: 
     default(); 
     break; 
    } 
    cnt--; 
} 

Вариант 2)

switch (value) { 
case A: 
    while(cnt > 0){ 
     doSomething(); 
     cnt--; 
     } 
case B: 
    while(cnt > 0){ 
     doSomethingElse(); 
     cnt--; 
     } 
... 
default: 
    while(cnt > 0){ 
     default(); 
     cnt--; 
     } 
} 

Я думаю, что первый вариант следует лучше СУХОЙ принцип, потому что я не повторяйте каждый раз while и cnt--. Хотя мне нравится немного лучше второй вариант, потому что, когда он выбирает случай в инструкции switch, он начинает зацикливаться в то время, и ему больше не нужно оценивать условие переключения.

Итак, какое из этих двух решений вы бы выбрали и почему?

NB: Мы можем предположить, что условие переключения (то есть переменная «значение» в приведенном ниже коде) не изменяется для всего цикла while, другими словами: операции doSomething(), doSomethingElse() и т. Д. . не влияют на оператор switch.

NB2: В реальном коде, над которым я работаю, цикл while может быть очень большим. «ЦНТ», для некоторых тестов, может быть порядка 10^9

ответ

4

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

+0

Это не пример цикла «antipattern» вообще, поскольку значение цикла не управляет коммутатором. –

1

Варианта 2 является более простым, как вы ставите акцент на switch -statement и того, чтобы работать через case в каждой итерации могут потреблять больше времени.

3

Если cnt используется только для управления количеством раз doSomething() и т. Д., Вы должны рассмотреть возможность передачи его методу и циклизации внутри метода. Обычно я бы сказал, не беспокойтесь о производительности, но если вы действительно говорите о 10^9 итерациях, вам следует избегать повторения этого переключателя.