Условия с общей логикой: вопрос стиля, удобочитаемости, эффективности, - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть условная логика, которая требует предварительной обработки, которая является общей для каждого из условий (создание объектов, поиск в базе данных и т. Д.).Я могу придумать 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 состоит в том, что дорогой код выполняется даже тогда, когда ни A, B или C не являются истинными

Опция 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, это делает все это более уродливым, и мне это не нравится.

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

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Разве вы не можете сделать

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 голосов
/ 09 февраля 2011

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

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
}
...