Coding style 具有共同逻辑的条件:风格、可读性、效率问题,
我有一个条件逻辑,它需要每个条件(实例化对象、数据库查找等)所共有的预处理。我可以想出3种可能的方法来实现这一点,但每种方法都有一个缺陷: 选项1Coding 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的缺陷在于昂贵的代码是冗余的 选
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次