尤達條件式

尤達條件式(也稱為尤達標記法)在計算機編程的術語中,是一種編程風格,其中表達式的兩個部分與條件語句中的典型順序相反。 尤達條件式將表達式的常量部分放在條件語句的左側。這個風格的名稱源於星際大戰絕地大師尤達的角色,他以非標準語法講英語。

尤達條件式是WordPress和Symfony編碼標準的一部分。

基本介紹

  • 中文名:尤達條件式
  • 性質:編程風格
  • 領域:計算機
  • 也稱:尤達標記法
示例,優點,評論,

示例

通常計算機編程中的條件語句會寫成:
if ( $value == 42 ) { /* ... */ }// Reads like: "If the value is equal to 42..."
尤達條件式描述相同的表達方式,但反轉:
if ( 42 == $value ) { /* ... */ }// Reads like: "If 42 equals the value..."
常量寫在比較運算符的左側,要測試其值的變數寫入右側。這個次序相媲美於尤達的非標準口語風格, 大約是賓主動語序(例如,“當九百歲你活到,看起來很好你將不”)。

優點

在表達式中放置常量值不會改變程式的行為(除非此值被評估為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之中是不允許在條件式中進行對變數賦值操作的, 藉由定義賦值表達式不會被評估就沒有任何值,在這種情況是不可能發生這類錯誤的。許多編譯器會對如if (myNumber = 42)的源碼發出警示訊息(例如,GCC-Wall選項會警告括弧語句中的賦值為真),讓程式設計師發現可能的錯誤點。 在JavaScript中如ESLint之類的語法建議程式,可以警告條件式中出現賦值操作。尤達條件式寫法避免null行為的優點也可被認為是一個缺點,因為空指針錯誤或被隱藏,並只出現在程式後期中。 當比較非基本類型時,這種寫法在C++中出現了另一個缺點,因為 == 是一個運算符,並可能沒有定義適當的重載運算符函式。例如:CComBSTR與字元串文本比較,寫成(L"Hello" == cbstrMessage),不會對應到重載的函式。

相關詞條

熱門詞條

聯絡我們