4

在我工作的公司,最近有一项要求,所有“高度可见的”布尔逻辑必须以析取范式表示。

例如(尽管这个概念与语言无关),

#if (defined(A) || defined( B )) || (defined(C) && defined(D))

必须替换为:

#if defined(A) || (defined(C) && defined(D)) || defined(B)

强制要求必须以这种方式表达代码的动机是什么?有什么优势?

4

3 回答 3

4

优点是在代码库中的任何地方都以规范/规范化的形式表达这种逻辑将(理论上)使程序员更容易理解和维护它。

如果没有这样的规则,一些程序员倾向于尝试以这样一种方式“优化”一个表达式,以至于维护者很难解开它。此外,如果有必要,一个通用的形式可以更容易地编写新的表达式。

(这些优势值得商榷。与任何风格准则一样,遵循一致的规则比选择一条规则而不是其他规则更重要。)

于 2011-07-04T18:31:34.960 回答
1

尽管您的示例非常糟糕(两个表达式都在 DNF 中),但我可以理解为什么有人会强制执行此策略。

任何范式的优点是所有表达式现在都具有相同的形式。在 DNF 中,该形式是子句/条件的列表,其中一个必须为真。这些子句又是文字/条件的列表,每个条件都必须为真。

DNF 特别具有在大多数语法中的优势,并且具有比or更高的优先级,并且not具有更高的优先级,因此 DNF 比 CNF 需要更少的括号并且省略括号并不是错误。

于 2011-07-04T18:34:29.923 回答
1

很多时候,您拥有的编码标准并不像始终如一地实施它们那么重要。始终如一地编写代码大大提高了可读性,而且很多时候,决定选择哪些代码的人是在行使个人偏好,而不是编码智慧。

假设您列出的标准确实有帮助。我想说大多数人没有意识到 && 运算符比 || 具有更高的运算符优先级。因此,在 && 运算符和操作数周围使用 () 有助于使事情更加明确。

永远记住,在许多语言中,如果仅在计算其中一个操作数后可以确定表达式的值,则可能不会执行布尔表达式的两个操作数。如:

1:(真方法()||假方法())

2:(假方法()||真方法())

如果只执行一个 trueMethod() 。但在案例 2 中,两种方法都被执行。订单可以产生很大的不同。

于 2011-07-04T18:46:23.667 回答