簡體   English   中英

太多if-else語句,任何重構方法

[英]Too many if-else statement, any way to refactor it

這可以重構嗎? 或者看起來很好。 (變量名稱已更改)

if (cmpScope.equals(GLOBAL)) {
            return true;
        } else if ((cmpScope.equals(X) || cmpScope.equals(Y))
                && cid == pid) {
            return true;
        } else if (cmpScope.equals(Z) && cid != pId) {
            return true;
        } else if (cmpScope.equals(V) && cid == pid) {
            return true;
        } else if (cmpScope.equals(Z) && cid == pid && cSubId != pSubId) {
            return true;
        }
        return false;

只需將所有表達式與or-operators組合在一起,因為它們都返回true。

return  ((cmpScope.equals(GLOBAL) ||
         ((cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid) ||
         (cmpScope.equals(Z) && cid != pId) ||
         (cmpScope.equals(V) && cid == pid) ||
         (cmpScope.equals(Z) && cid == pid && cSubId != pSubId));

您可以將條件的結果存儲在變量中,並在一個語句中處理所有條件。 (雖然我認為在所有情況下都不是更好的解決方案)

boolean trueCond1 = cmpScope.equals(GLOBAL);
boolean trueCond2 = (cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid;
boolean trueCond3 = cmpScope.equals(Z) && cid != pId;
boolean trueCond4 = cmpScope.equals(V) && cid == pid;
boolean trueCond5 = cmpScope.equals(Z) && cid == pid && cSubId != pSubId;

return (trueCond1 || trueCond2 || trueCond3 || trueCond4 || trueCond5);

你可以擺脫所有else的因為每個if子句返回一個值。

if (cmpScope.equals(GLOBAL)) {
    return true;
}
if ((cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid) {
    return true;
}
if (cmpScope.equals(Z) && cid != pId) {
    return true;
}
if (cmpScope.equals(V) && cid == pid) {
    return true;
}
if (cmpScope.equals(Z) && cid == pid && cSubId != pSubId) {
    return true;
}
return false;

這是降低代碼明顯復雜性的最佳技術之一。 根據您的特定需求,使用或運算符分組到單個表達式可能是更好的解決方案。 cid / pid比較也是最后四次測試的共同點,所以這樣的事情可能會更好:

if (cmpScope.equals(GLOBAL)) {
    return true;
}
if (cid == pid) {
    if (cmpScope.equals(X) || cmpScope.equals(Y)) {
        return true;
    }
    if (cmpScope.equals(V)) {
        return true;
    }
    if (cmpScope.equals(Z) && cSubId != pSubId) {
        return true;
    }
} else {
    if (cmpScope.equals(Z)) {
        return true;
    }
}
return false;

我完全支持@ carl-manaster的回應,但我認為我們可以走得更遠。

我的方法基於以下原則:

  • 應該沒有別的陳述。
  • 應將復雜的邏輯表達式提取到私有方法中以提高可讀性。
  • 有一個涵蓋所有可能分支的測試套件。 這就是人們擔心圈復雜性的原因。 這就是為什么提取到方法有幫助。

從示例代碼中,不清楚這個方法究竟是什么,所以我選擇了一些隨機名稱,作者應該將其更改為更有效的名稱。

我沒有測試也沒有時間,所以我不是百分百肯定它會起作用,但經過一系列的改變我最終得到了以下代碼:

function(cid, pid, cSubId, pSubId) {
    return cmpScope.equals(GLOBAL) && isValidSomething() && isValidSomethingElse();
}

提取的方法是:

function isValidSomething() {
    if(cid != pid) {
        return false;
    }
    if (cmpScope.equals(V) || cmpScope.equals(X) || cmpScope.equals(Y)) {
        return true;
    }
    return cmpScope.equals(Z) && cSubId != pSubId;
}

function isValidSomethingElse() {
    return cmpScope.equals(Z) && cid != pId;
}

這只是一個例子,您可以進一步改進它。

同樣,這一點的主要觀點是讓私人方法具有良好的名稱,以便您可以“像一個寫得很好的散文”來閱讀它。 想象一下:

function isMyCarValid() {
    return isHaveWheels() && isHaveFuel() && isHaveDriver();
}

我假設'return true'只是一個例子? 否則,您可以將在一個表達式中返回true的所有語句分組。 如果它們實際上是要做不同的事情,那對我來說就好了。 (在某些情況下,可以使用switch語句,而不是在這種情況下,但通常可以很好地知道您可以使用此https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch。 HTML

暫無
暫無

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

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