2015-12-02 28 views
0

我已经写了一些代码,它使用条件表达式的结果分配变量而不显式使用IF-ELSE语句。混合布尔代数和数值代数来分配变量

在最简单的形式,问题是这样的:

1版

if (x < K) 
    y = A; 
else 
    y = B; 

我已经看到在过去的一个“绝招”,使人们完成相同的任务在一个线而不条件是这样的:

2版

y = (x < K) * A + !(x < K) * B; 

此方法相对容易地扩展以处理IF-ELSE IF-ELSE分配。诀窍是确保条件都是互斥的。

从单元测试的角度来看,我需要达到100%的代码路径覆盖率。

我的同事同意第2版更优雅,但他们认为它的可读性较差。此外,他们认为我“侧面推进”了路径覆盖要求,并且通过在单行代码中“隐藏”条件逻辑而不实际执行两个条件((x < K)!(x < K)),我将能够实现100%的路径覆盖)。

我认为我可以混合布尔代数和数字代数来执行变量赋值,因为计算机将布尔值'true'和'false'视为可以乘以'float'的'1'和'0'并且'int'变量。对我来说,它变成了一个简单的算术表达式,它用零和变量乘以变量。

我为什么要这样做?

我正在做这种布尔和数字代数的混合,以最大限度地减少IF语句的数量,最小化代码行和一般代码清理。通过将条件的结果保存到变量并引用,显然可以提高性能。

问题

,这种做法(和三元运营商)从单元测试的角度来看令人难以接受的?

如果这个问题太主观,请提出修改建议。

+0

1。它不是将“布尔”“真”和“假”视为“1”和“0”的计算机,它是特定的语言。其他语言不。 2.为什么不使用条件运算符?这大概应该避免“侧步路径覆盖”,同时满足你的其他目标。 –

+0

感谢您的信息。我不明白这是如何依赖语言。不幸的是,条件运算符在我使用的语言中不可用。 – zigzag

回答

1

我建议避免它(这个技巧实际上是有用的,当意图是为了避免分支,这可能是你已经看到它的上下文)。鉴于语言没有条件经营者,你应该能够自己定义的

cond(bool, x, y) { if (bool) return x; else return y; } 

相当于写y = cond(x < K, A, B)。它的可读性更强,写入时出错更容易,可用于非数字类型,并在路径覆盖范围内被认为是正确的。它与实际的条件运算符(除非语言具有宏或惰性评估)不同,它评估双方,但所描述的技巧也如此。

+0

这是我使用的方法。 – zigzag