簡體   English   中英

哪個更好:多個“if”語句或一個帶有多個條件的“if”?

[英]What is better: multiple "if" statements or one "if" with multiple conditions?

對於我的工作,我必須開發一個小型 Java 應用程序來解析非常大的 XML 文件(~300k 行)以選擇非常具體的數據(使用Pattern ),所以我正在嘗試對其進行一些優化。 我想知道這兩個片段之間哪個更好:

if (boolean_condition && matcher.find(string)) {
    ...
}

或者

if (boolean_condition) {
    if (matcher.find(string)) {
        ...
    }
}

其他詳情:

  • 這些 if 語句在循環內的每次迭代中執行(約 20k 次迭代)
  • boolean_condition是使用外部函數在每次迭代中計算的boolean
  • 如果boolean設置為false ,我不需要測試匹配的正則表達式

謝謝你的幫助。

我遵循的一個黃金法則是盡可能多地“避免嵌套”。 但是,如果以讓我的單身條件過於復雜為代價,我不介意將其嵌套。

此外,您正在使用短路&&運算符。 所以如果布爾值是假的,它甚至不會嘗試匹配!

所以,

if (boolean_condition && matcher.find(string)) {
    ...
}

是要走的路!

以下兩種方法:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}

為方法體生成完全相同的字節碼,因此不會有任何性能差異,這意味着它純粹是您使用的風格問題(我個人更喜歡第一種風格)。

兩種方式都可以,如果第一個條件為假,則不會測試第二個條件。

使用使代碼更具可讀性和可理解性的方法。 對於僅兩種情況,第一種方式更具邏輯性和可讀性。 &&||鏈接的 5 或 6 個條件可能不再是這種情況! .

我傾向於看到太多 && 和 || 串在一起形成邏輯湯,通常是微妙錯誤的來源。

添加另一個 && 或 || 太容易了到您認為正確的位置並打破現有邏輯。

因此,作為一般規則,我盡量不使用它們中的任何一個,以避免隨着需求變化而添加更多內容。

如果您想遵守Sonar 規則 squid:S1066您應該折疊 if 語句以避免警告,因為它指出:

應合並可折疊的“if”語句

第一個。 如果這樣嵌套,我會盡量避免,我認為這是糟糕的樣式/丑陋的代碼,並且 && 會短路,如果布爾值為真,則僅使用 matcher.find() 進行測試。

Java 對這些布爾運算符使用短路,因此這兩種變體在功能上是相同的。 因此,如果boolean_condition為 false,則不會繼續匹配

最終,它歸結為您發現更易於閱讀和調試,但如果最后使用大量大括號,深嵌套可能會變得笨拙

如果條件變長,您可以提高可讀性的一種方法是簡單地將其拆分為多行:

if(boolean_condition &&
   matcher.find(string))
{
    ...
}

此時唯一的選擇是是否放置 && 和 || 在上一行的末尾,或當前行的開頭。

在性能方面,它們是相同的。

  • 但即使他們不是

在這段代碼中幾乎可以肯定的是matcher.find(string)因為它是一個函數調用。

我建議將您的表達式提取到一個語義上有意義的變量,然后將其傳遞給您的評估。 代替:

if (boolean_condition && matcher.find(string)) { ... }

將表達式賦給一個變量,然后對變量求值:

const hasItem = boolean_condition && matcher.find(string)

if (hasItem) { ... }

使用這種方法,您甚至可以保持最復雜的評估可讀:

const hasItem = boolean_condition && matcher.find(string)

const hasOtherThing = boolean_condition || boolean_condition

const isBeforeToday = new Date(string) < new Date()

if (hasItem && hasOtherThing && isBeforeToday) { ... }

由於“&&”,大多數人更願意使用下面的一個。

if (boolean_condition && matcher.find(string)) {
...
}

我們通常將這些稱為“短路(或最小評估)”。 這意味着僅當第一個參數沒有足夠的信息來確定表達式的值時才計算第二個參數(這里是“matcher.find(string)”)。 例如,如果 "boolean_condition" 為false ,則整體條件必須為false (因為這里是邏輯 AND 運算符)。 然后編譯器不會檢查第二個參數,這會導致減少代碼的運行時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM