我最近在最近的answer中收到了关于使用以下内容的声明:
String word = ...;
if ("s".equals(word) || "y".equals(word)
由于使用了“yoda条件”而给出了downvote。我要求进一步解释,但没有提供。我更喜欢这种风格,以避免可能的NullPointerException
。
这是一种糟糕的编码风格吗?如果是这样,为什么?
答案 0 :(得分:34)
比尔·普格在Devoxx 2011上提出这个问题。绝大多数人选择"xyz".equals(str)
这个形式。我和比尔在一起,现在更喜欢str.equals("xyz")
。
Java传统的基础是我们尽可能早地发现错误。 NPE非常普遍。我们希望尽快将这些空值排除在外。
如果您期望引用null
,那么我并不特别反对向后注释。很明白,更容易理解,null
可能有一个单独的null
检查,但应该很好地理解相反的顺序,并将代码与{{1}的正常情况充分区分开来。被禁止。
在安全性方面工作,一些容忍零容忍的漏洞就是漏洞。
答案 1 :(得分:10)
Yoda条件(即在比较中将变量置于常量之前)可以被认为是不好的做法,因为它使得代码行不易理解。但是在这种特殊情况下,我会说使用Yoda条件会使代码更容易理解,因为您不必在它前面添加额外的空值检查。
答案 2 :(得分:8)
访问以下链接,了解Yoda Conditions|Notation
的含义它不是一种“不良编码风格”的不同编码方式。
Yoda可以用来跟踪某些语言的拼写错误,我相信-1不应该是诚实的,但这是我个人的看法。
但Yoda can be bad正如这篇冗长但非常有趣的文章所解释的那样。
当天结束时,有支持者支持并反对这种表示法。
答案 3 :(得分:3)
嗯,这取决于。如果你的程序中“word”永远不应为null,则word.equals(“s”)可能实际上更好。如果由于某些晦涩的原因,“word”将变为null,您将获得NullPointerException。 想一想。如果你遇到异常,你就会知道出了什么问题,你可以更快找到错误并修复它。如果程序将继续以静默方式工作,并产生错误的结果,则检测问题将更加困难。实际上,你可能根本没有注意到这个问题。
一切都取决于。
答案 4 :(得分:1)
有几个理由不这样做,但是如果你认为这是糟糕的编码风格,最终它取决于你(或者你的产品团队)。反对它的论点是:
如上所述,我不认为这些论点非常强烈,也不是像你这样做的理由。所以最重要的是只要在一种方式上同意你的编码风格并坚持下去。
答案 5 :(得分:1)
TL; DR;这绝对是不好的编码风格NOT:D
好吧,yoda条件在非布尔值可以计算为布尔值的语言中很有用,例如,
int test = 0;
if ( test ){ /* do something */
但是在Java中不允许这样做,所以你不会遇到忘记'='等问题,例如
if ( test = 2 ){ /* do something */
而不是test == 2
这绝对不是糟糕的编码风格,看到使用它的Java代码并不常见
答案 6 :(得分:1)
yoda条件是将文字放在变量前面的地方。
word.equals(“s”)读作“word equals s”
“s”.equals(word)人类读作“s等于单词”
我们的大脑更好地阅读了第一个例子,代码更清晰。
imho使用yoda条件的唯一原因是为了防止分配 如“if(42 = i)”而不是“if(42 == i)”
答案 7 :(得分:1)
你可以写
if (word != null && (word.equals("s") || word.equals("y")))
而不是
if ("s".equals(word) || "y".equals(word))
在这种情况下,第一个将永远不会导致任何 NullpointerException ,但在我看来,在这种情况下,第二个更好,但它在 Yoda条件
答案 8 :(得分:1)
有一个特殊情况,如果Yoda有条件我在任何答案中都没有看到辩护或攻击,所以我会添加它作为参考。这是以下的风格:
if(0 < x && x <= max) {
Yoda是条件因为常量(0
)在变量(x
)之前。反对Yoda条件的论点是阻碍了可读性。将该示例与功能等效的
if(x <= max && x > 0) {
你真的认为,非尤达变种,更具可读性吗?我没有。
为了在使用有序关系运算符(&lt;,&lt; =,&gt;,&gt; =)时的可读性,我更喜欢这些启发式的风格:
这通常会产生一个Yoda条件下限。
答案 9 :(得分:0)
有人可能会争辩说,你应该(单元)测试你的代码,以确保空值不会超出他们不应该去的地方。这应该可以避免对yoda条件的需求。