【问题标题】:Blending Boolean Algebra and Numeric Algebra to assign variables混合布尔代数和数值代数来分配变量
【发布时间】:2015-12-02 23:29:48
【问题描述】:

我编写了一些代码,它使用条件表达式的结果来分配变量,而没有显式使用 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 版更优雅,但他们认为它的可读性较差。此外,他们认为我“回避”了路径覆盖率要求,并且我可以通过在单行代码中“隐藏”条件逻辑来实现 100% 的路径覆盖率,而无需实际执行这两个条件((x &lt; K)!(x &lt; K))。

我认为我能够混合布尔代数和数值代数来执行变量赋值,因为计算机将布尔“真”和“假”视为“1”和“0”,它们可以乘以“浮点”和“ int'变量。对我来说,它只是一个零和一乘以变量的算术表达式。

我为什么要这样做?

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

问题

从单元测试的角度来看,这种做法(和三元运算符)是否令人不快?

如果这个问题过于主观,请提出修改意见。

【问题讨论】:

  • 1.不是计算机“将布尔值'true'和'false'视为'1'和'0'”,而是特定的语言。其他语言没有。 2. 为什么不直接使用条件运算符?这大概应该避免“绕过路径覆盖”,同时满足您的其他目标。
  • 感谢您的信息。我不明白这是多么依赖于语言。不幸的是,条件运算符在我使用的语言中不可用。

标签: logic variable-assignment logical-operators


【解决方案1】:

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

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

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

【讨论】:

  • 这是我使用的方法。
猜你喜欢
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多