混合布尔代数和数值代数来分配变量

Blending Boolean Algebra and Numeric Algebra to assign variables

我已经编写了一些代码,这些代码使用条件表达式的结果来分配变量,而没有显式使用 IF-ELSE 语句。

在最简单的形式中,问题如下所示:

版本 1

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

我在过去看到 "trick" 人们在一行中完成相同的任务而没有这样的条件:

版本 2

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

这种方法相对容易扩展以处理 IF-ELSE IF-ELSE 分配。诀窍是确保条件相互排斥。

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

我的同事同意版本 2 更优雅,但他们认为它的可读性较差。此外,他们争辩说我是 "side-stepping" 路径覆盖要求,并且我可以通过 "hiding" 单行代码中的条件逻辑实现 100% 路径覆盖,而无需实际执行这两个条件((x < K)!(x < K)).

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

我为什么要这样做?

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

问题

从单元测试的角度来看,这种做法(和三元运算符)是不受欢迎的吗?

如果此问题过于主观,请提出修改建议。

我建议避免使用它(当意图是避免分支时,这个技巧实际上很有用,这可能是您在其中看到的上下文)。鉴于该语言没有条件运算符,您应该能够定义

的等价物
cond(bool, x, y) { if (bool) return x; else return y; }

自己写y = cond(x < K, A, B)。它更具可读性,在编写时更难出错,可用于非数字类型,并且在路径覆盖中被认为是正确的。它评估双方,不像实际的条件运算符(除非语言有宏或惰性评估),但所描述的技巧也是如此。