Coding style 具有共同逻辑的条件:风格、可读性、效率问题,

Coding style 具有共同逻辑的条件:风格、可读性、效率问题,,coding-style,conditional,code-coverage,pseudocode,Coding Style,Conditional,Code Coverage,Pseudocode,我有一个条件逻辑,它需要每个条件(实例化对象、数据库查找等)所共有的预处理。我可以想出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的缺陷在于昂贵的代码是冗余的 选

我有一个条件逻辑,它需要每个条件(实例化对象、数据库查找等)所共有的预处理。我可以想出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的昂贵评估问题,但它让整个事情变得更加丑陋,我不喜欢它

你会如何排列这些选项,还有其他我没有看到的吗?

你不能这样做吗

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

这难道不能解决冗余问题吗:

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
}

总的来说,编译器应该将这些替代方案中的任何一个简化为相当有效的方法。所以我不担心,我不知道选项4如何避免昂贵的评估。您仍然需要执行(A、B或C),然后执行A、B或C(即两次求值)。当然,这仍然会对昂贵的代码求值3次