2011-02-08 3 views
0

У меня есть условная логика, которая требует предварительной обработки, которая является общей для каждого из условий (создание экземпляров объектов, поиск баз данных и т. Д.). Я могу думать о 3-х возможных способов сделать это, но каждый из них имеет недостаток:Условия с общей логикой: вопрос о стиле, читаемость, эффективность,

Вариант 1

if A 
    prepare processing 
    do A logic 
else if B 
    prepare processing 
    do B logic 
else if C 
    prepare processing 
    do C logic 
// else do nothing 
end 

Дефект с вариантом 1 является то, что дорогой код избыточен.

Вариант 2

prepare processing // not necessary unless A, B, or C 
if A 
    do A logic 
else if B 
    do B logic 
else if C 
    do C logic 
// else do nothing 
end 

Недостаток варианта 2 является то, что дорого код работает даже тогда, когда ни А, В или С истинно

Вариант 3

if (A, B, or C) 
    prepare processing 
end 

if A 
    do A logic 
else if B 
    do B logic 
else if C 
    do C logic 
end 

Недостаток с опцией 3 заключается в том, что условия для A, B, C оцениваются дважды. Оценка также является дорогостоящей.

Теперь, когда я думаю об этом, есть вариант варианта 3, что я называю вариант 4:

Вариант 4

if (A, B, or C) 
    prepare processing 
    if A 
     set D 
    else if B 
     set E 
    else if C 
     set F 
    end 
end 

if D 
    do A logic 
else if E 
    do B logic 
else if F 
    do C logic 
end 

Хотя это решать дорогостоящие оценки A, B , и C, это делает все более уродливым, и мне это не нравится.

Как бы вы оценили параметры, и есть ли другие, которых я не вижу?

+0

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

+0

Я не понимаю, как вариант 4 избегает дорогостоящих оценок. Вам все еще нужно делать (A, B или C), за которыми следуют A, B или C (т. Е. Две оценки). –

ответ

1

Вы не можете сделать

if (A, B, or C) 
    prepare processing 
    if A 
     do A logic 
    else if B 
     do B logic 
    else if C 
     do C logic 
end 

? Возможно, я неправильно понял.

Редактировать: zzz, ваши правки испортили меня. Если вы не хотите, чтобы оценить A, B, C дважды, то сделать

x = func returnCase() //returns a,b, or c 
if x != None 
    prepare processing 
    do Case 
0

Разве это не решает избыточность:

if A 
    prepareprocessingfunction() 
    do A logic 
else if B 
    prepareprocessingfunction() 
    do B logic 
else if C 
    prepareprocessingfunction() 
    do C logic 
// else do nothing 
end 

prepareprocessingfunction() { 
    prepare processing 
} 
+0

неважно, что по-прежнему оценивает дорогостоящий код 3 раза, конечно –

Смежные вопросы