尤達條件式

尤達條件式（，也稱為尤達標記法）是一種計算機編程中的編程風格。此風格寫成的條件句中，條件式兩側的部件互換（如：將常量置於比較運算符左側）。這種風格的名稱來自於星際大戰的絕地大師尤達，他使用不合標準語法的英語。尤達條件式是PHP Symfony編碼標準的一部份。

 範例 
通常計算機編程中的條件語句會寫成：
if ( $value == 42 ) { /* ... */ }
// 「如果 value 等於 42」

在尤達條件式中對於相同的條件語句会反轉过来：
if ( 42 == $value ) { /* ... */ }
// 「如果 42 等於 value」

常數會放在比較運算子的左側，變量則至於運算子右側。這個次序和尤達的非標準口語風格非常相似，类似于賓主動語序（例如「When nine hundred years old you reach, look as good you will not.」「當九百歲你活到，看起來很好你將不」）。

 優點 
多數程式語言使用單個等號（=）表示賦值操作，用雙等號（==）表示相等比較。在打錯字時，會產生語意錯誤：
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 是常量，因此編譯器會捕捉到該錯誤。

以下程式碼中的語法完全正確，但是mystring為空值。試圖在空值上呼叫方法，會產生例外。
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// 在 Java 中，產生 NullPointerException

以尤達條件式可免除此問題（此行為可能是缺點，見下文）：
String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// 求值結果為 false

有些程式語言不支援如a < b < c的連關係表逹式。在轉寫時，用尤達條件式，可提升可讀性：
int i = 1;
int j = 4;
int k = 5;
if (i < j && j < k) {
    // 此為 i < j < k 之轉寫。
}

 評論 
一些編程語言，如Python和Swift，不允許在條件式中進行對變量賦值，或者定義賦值操作沒有回傳值。在這種情況下，不可能錯把比較式誤寫作賦值。

許多編譯器會對如if (myNumber = 42)的源碼發出警示訊息（例如，GCC-Wall選項會警告括號語句中的賦值為真），讓程序員發現可能發生錯誤的地方。在JavaScript中如ESLint之類的語法建議程序，可以警告條件式中出現賦值操作。

尤達條件式寫法能忽略空值，但可能使有問題的資料通過篩檢，使得後面的程序出錯。

當比較非基本類型時，這種寫法在C++中出現了另一個缺點，因為 == 是一個運算子，並可能沒有定義適當的重載運算子函數，例如CComBSTR與字串文本比較，寫成(L"Hello" == cbstrMessage)，不會對應到重載的函數。

 參考 

 外部連結 

 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

Category:编程原则
Category:程序设计语言语法
Category:流行文化中的电影作品