JavaRush /Java Blog /Random-TW /尤達條件
MAX
等級 16
Киров

尤達條件

在 Random-TW 群組發布
謹向《星際大戰》和 Java / JavaRush 的所有粉絲致以一篇簡短的文章,以紀念《星際大戰》第五集發布 40 週年! 尤達條件 - 1有時你可以在網路上找到很多有趣的東西,有一天我遇到了一個乍看之下相當有趣的程式設計實踐,稱為尤達條件。簡而言之,尤達條件(也稱為尤達表示法)是一種程式風格,其中條件語句中熟悉的比較表達式的兩個部分顛倒了:
if (5 == a) {
    // do something
}
這種風格可以用在具有類似 C 語法的語言中,最常見的是帶有ifand 的表達式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)尤達條件 - 1

使用尤達條件有利有弊。

光面:

  1. 當我們的目標是比較時,防止分配給變數。

  2. 解決不安全的「空行為」問題 ( NullPointerException) // 來自維基百科的範例

  3. 沒有尤達:

    String myString = null;
    if (myString.equals("foobar")) { /* ... */ }
    // This causes a NullPointerException in Java

    與尤達:

    String myString = null;
    if ( "foobar".equals(myString) ) { // Результат - Ложь
       /* не выполняется */
    }

暗面:

  1. 對於查看程式碼的人來說,程式碼的可讀性變得更加複雜,從而增加了程式碼感知的負擔。
  2. 範圍狹窄,僅使用相等比較或與常數比較,檢查是否為空。
  3. 許多編譯器已經「看到」此類錯誤,並提前警告潛在錯誤的存在。
Yoda 表示法的替代方法是單元測試。在舊共和國時代,據說執行良好的測試將確保程式碼沒有錯誤,並且只執行其編寫的功能。你知道哪些有用的做法?在評論中分享您的知識!並寫下您最喜歡的劇集! 願原力與你同在!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION