谨向《星球大战》和 Java / JavaRush 的所有粉丝致以一篇简短的文章,以纪念《星球大战》第五集发布 40 周年! 有时你可以在互联网上找到很多有趣的东西,有一天我遇到了一个乍一看相当有趣的编程实践,称为尤达条件。简而言之,尤达条件(也称为尤达表示法)是一种编程风格,其中条件语句中熟悉的比较表达式的两个部分颠倒了:
九个六个部分之后,我们没有睡觉,坐下来为我们的宠物项目编写一些代码,并编写了以下内容:
if (5 == a) {
// do something
}
这种风格可以用在具有类似 C 语法的语言中,最常见的是带有if
and 的表达式while
。
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
为什么将常量表达式移到比较运算符的左侧? 让我们假设一个假设的情况,在马拉松式地看完了传奇的 全部
void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
在这种情况下,每次运行程序时,无论传递给方法的Number is 13"
参数如何, 您都会收到字符串。这不是我们所期望的!逻辑错误在新手程序员中经常发生(相信我,我知道)。但在编译阶段,像 13 = a 这样的代码会产生一个错误,我们当然不会忽视这个错误,因为整数值是一个常量,因此不能改变(变成“a”)。 а
checkNumber(int a)
使用尤达条件有利有弊。
光面:
-
当我们的目标是比较时,防止分配给变量。
-
解决不安全的“空行为”问题 (
NullPointerException
) // 来自维基百科的示例
没有尤达:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
与尤达:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
暗面:
- 对于查看代码的人来说,代码的可读性变得更加复杂,从而增加了代码感知的负担。
- 范围狭窄,仅使用相等比较或与常量比较,检查是否为空。
- 许多编译器已经“看到”此类错误,并提前警告潜在错误的存在。
GO TO FULL VERSION