Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
依赖Java';s短路评估(编码样式)_Java_Coding Style - Fatal编程技术网

依赖Java';s短路评估(编码样式)

依赖Java';s短路评估(编码样式),java,coding-style,Java,Coding Style,在布尔运算中严重依赖短路是一种好的编码方式吗 我认识一个喜欢这样做的人。 例如,如果业务逻辑是“如果Alice不饿,或者如果Alice和Bob都饿”,而不是写 // if Alice is not hungry or both alice and bob are hungry if (!A || A && B)` 他会写信 // if Alice is not hungry OR both alice and bob are hungry if (!A || B) 认为|短

在布尔运算中严重依赖短路是一种好的编码方式吗

我认识一个喜欢这样做的人。 例如,如果业务逻辑是“如果Alice不饿,或者如果Alice和Bob都饿”,而不是写

// if Alice is not hungry or both alice and bob are hungry
if (!A || A && B)` 
他会写信

// if Alice is not hungry OR both alice and bob are hungry
if (!A || B)
认为
|
短路,因此当且仅当第一个操作数为
false
(即
A=true
)时才计算右操作数


(令人恼火的是,乍一看,你会认为这是一个bug,但如果你把它改成更明显的东西,你会觉得自己看起来很愚蠢!)

我认为在这种情况下,无论它是否短路,结果都是一样的。他不依赖于这里的短路,而是简化所需的逻辑


在我看来,没有一个非常明确的答案。我个人不会像这样简化逻辑语句,因为对我来说,当我稍后再讨论它时,它很难阅读。添加额外的逻辑来明确解释我的检查不会

这实际上与短路无关;即使没有短路,这两个表达式也是等效的:

A B !A | A & B !A | B ----------------------------------- 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 1 A B!A | A&B!A | B ----------------------------------- 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 1 选择你认为将来更容易理解和管理的;无论哪个更明确地表达了你的目的。这方面的明显赢家似乎是你的第一个片段。

在这种情况下,你实际上并不“依赖”短路评估。您只是在简化布尔表达式。该逻辑与
&
&
的工作原理相同

短路的影响包括:

  • 避免执行短路代码(这可能会产生副作用、引发异常或无法终止)
  • 可能会节省一些多余的计算

因此,短路不会以任何方式改变布尔结果。

您当然可以而且应该依赖表达式中的短路,但您给出的示例只是糟糕的编程。表达式的逻辑应该与注释和测试的人类可读逻辑相匹配。优化器完全理解布尔逻辑,并将优化消除您的队友可能抱怨的任何明显的低效


最重要的是使代码对开发人员来说清晰易懂。编写聪明的代码来证明自己有多聪明从来都不是一种好的做法。

这是一种好的风格吗?是的,我想大多数人都能欣赏这种风格:

myFoo != null && myFoo.myMethod();

在布尔逻辑中,这可能是正确的。大多数程序员通常都能理解。这可能值得一提。这是一个意见问题,但根据我的经验,我看到Java短路在简化布尔表达式方面使用了很多。一旦你习惯了它,阅读起来就不难了。@AnubianNoob没错,问题是开发人员会留下注释,使谓词看起来更像一个bug!(即,ocmment将声明业务逻辑,而谓词似乎在做其他事情!)编译器(或者,在Java的情况下,热点)非常擅长删除公共子表达式。代码应该是程序员可读的,并且应该明显地符合要求!A | | | A&&B。我会这样写:(!A)| | |(A&&B)使它更容易让人阅读。+1表示真值表。