尤达条件式
此条目需要补充更多来源。 (2019年5月27日) |
尤达条件式(也称为尤达标记法)是一种计算机编程中的编程风格,在此风格中表达式的两个部份与条件语句中的顺序将会对调, 并且表达式的常量部份将会放在条件语句的左侧。这种风格的名称来自于星际大战的绝地大师尤达,他使用着缺乏标准语法的英语。
范例
[编辑]通常计算机编程中的条件语句会写成:
if ( $value == 42 ) { /* ... */ }
// Reads like: "If the value is equal to 42..."
在尤达条件式中对于相同的条件语句会反转过来:
if ( 42 == $value ) { /* ... */ }
// Reads like: "If 42 equals the value..."
常数会放在比较运算子的左侧,而右侧会写入测试常数的变量。这个次序和尤达的非标准口语风格非常相似,类似于宾主动语序[2](例如"When nine hundred years old you reach, look as good you will not.",“当九百岁你活到,看起来很好你将不”[3][4])。
优点
[编辑]将常量放在表达式中不会改变程序的行为(除非此值被评估为false,请参见下文)。在使用单个等号(=)执行赋值操作 而非条件关系比较的编程语法中,可能会发生错误使程序产生意料之外的赋值操作,而并非如程序员原意要编写关系判断的条件语句。
if (myNumber = 42) { /* ... */ }
// This assigns 42 to myNumber instead of evaluating the desired condition
使用尤达条件式的优点:
if (42 = myNumber) { /* ... */ }
// This is a syntax error and will not compile
由于 42 是一个无法变动的固定常量,因此编译器会捕捉到该错误。
Boolean myBoolean = true;
if (myBoolean = null) { /* ... */ }
// This causes a NullPointerException in Java Runtime, but legal in compilation.
它也可以解决一些不安全的null型别行为。
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
以尤达条件式:
String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// This is false, as expected
评论
[编辑]有评论认为尤达条件式一个缺点是缺乏可读性,其负面效果超过了上述优点。
一些编程语言如Python和Swift之中是不允许在条件式中进行对变量赋值操作的,借由定义赋值表达式不会被评估就没有任何值,在这种情况下是不可能发生这类错误的。[5]
许多编译器会对如if (myNumber = 42)
的源码发出警示讯息(例如,GCC-Wall
选项会警告括号语句中的赋值为真),让程序员发现可能发生错误的地方。在JavaScript中如ESLint之类的语法建议程序,可以警告条件式中出现赋值操作。[6]
尤达条件式写法避免null行为的优点也可被认为是一个缺点,因为空指针错误或被隐藏,并只出现在程序后期中。
当比较非基本类型时,这种写法在C++中出现了另一个缺点,因为 == 是一个运算子,并可能没有定义适当的重载运算子函数,例如CComBSTR
与字串文本比较,写成(L"Hello" == cbstrMessage)
,不会对应到重载的函数。[7]
参考
[编辑]
- ^ Coding Standards (Contributing to Symfony). Symfony.com. [2016-11-12]. (原始内容存档于2016-11-08).
- ^ Pullum, Geoffrey K. Yoda's Syntax the Tribune Analyzes; Supply More Details I Will!. Itre.cis.upenn.edu. Language Log. 2005-05-18 [2014-12-22]. (原始内容存档于2013-03-09).
One way to look at Yoda's syntax is that it shows signs of favoring OSV syntax (Object-Subject-Verb) as the basic order in the simple clause.
- ^ The StarWars.com 10: Best Yoda Quotes. starwars.com. Lucasfilm, Ltd. 2013-11-26 [2014-12-22]. (原始内容存档于2014-12-22).
When nine hundred years old you reach, look as good you will not.
- ^ Quotes for Yoda (Character). imdb.com. Amazon. [2014-12-22]. (原始内容存档于2015-02-12).
When nine hundred years old *you* reach, look as good *you* will not, hmm?
- ^ The Swift Programming Language (Swift 3.0.1): Basic Operators. Developer.apple.com. 2016-10-27 [2016-11-12]. (原始内容存档于2016-04-23).
- ^ disallow assignment operators in conditional statements. eslint.org. [2017-02-17]. (原始内容存档于2017-02-18).
- ^ CComBSTR::operator. Msdn.microsoft.com. [2016-11-12]. (原始内容存档于2016-09-10).
外部链接
[编辑]- united-coders.com: What are Yoda Conditions? (页面存档备份,存于互联网档案馆) Examples in Java
- New programming jargon (页面存档备份,存于互联网档案馆) Mentions Yoda Conditions in a list of new programming jargon
- Coding in Style (页面存档备份,存于互联网档案馆) Probable origin of the term
- Yoda Conditions in Java Potential pitfalls of the technique