1. 程式人生 > >陳舊語法密度之三——用直接刪除else的方法消除if-else if-else

陳舊語法密度之三——用直接刪除else的方法消除if-else if-else

用直接刪除else法消除if-else if-else

這幾節先說一些簡單的情況,在基本語法的層面,即使是仍然保持面向過程的編碼,也能消除。

請看下面的程式碼:

public String getReversedOperator3() {

    if (operator.equals("=")) {
        return "!=";
    } else if (operator.equals("==")) {
        return "!=";
    } else if (operator.equals("!=")) {
        return "=";
    } else if 
(operator.equals("<")) { return "!<"; } else if (operator.equals(">")) { return "!>"; } else if (operator.equals("<=")) { return "!<="; } else if (operator.equals(">=")) { return "!>="; } return "?"; }

實際上,居然可以直接刪除所有else,變成:

public 
String getReversedOperator4() { if (operator.equals("=")) { return "!="; } if (operator.equals("==")) { return "!="; } if (operator.equals("!=")) { return "="; } if (operator.equals("<")) { return "!<"; } if (operator.equals(">"
)) { return "!>"; } if (operator.equals("<=")) { return "!<="; } if (operator.equals(">=")) { return "!>="; } return "?"; }

有人可能會說:“我怎麼可能犯這種低階錯誤!”且慢,請先在自己專案的程式碼中搜索一下else if再說吧。這種情況在我所看的程式碼中數量龐大,大約10%~20%的else(包括下面的變形)都可以如此兵不血刃地刪除掉。

下面則是一種類似的變形:

public String getReversedOperator1() {
    String reversedOperator = null;
    if (operator.equals("=")) {
        reversedOperator = "!=";
    } else if (operator.equals("==")) {
        reversedOperator = "!=";
    } else if (operator.equals("!=")) {
        reversedOperator = "=";
    } else if (operator.equals("<")) {
        reversedOperator = "!<";
    } else if (operator.equals(">")) {
        reversedOperator = "!>";
    } else if (operator.equals("<=")) {
        reversedOperator = "!<=";
    } else if (operator.equals(">=")) {
        reversedOperator = "!>=";
    } else {
        reversedOperator = "?";
    };
    return reversedOperator;
}

又有人會說:“這個else沒什麼大問題,刪不刪都可以。”這時候我們要回到程式碼剛開始寫的那一天:如果有人實際上寫了第二種沒有else的程式碼,我們是否會執意在上面加上個else變成第一種呢?當然不會。

彎路走多了,有時候連直路都不認識了,這才是問題的關鍵。

所以這本來是一篇如何不寫else的文章,因為世間else寫的太多了,才變成了刪else的文章。

可以因為舊程式碼沒有修改的價值了因此而不修改,但千萬不要認為舊程式碼是好的。否則未來還會繼續照樣寫。

當然在實際的環境中,我們會把他們都刪光,否則很難識別未來是否又多了任何else程式碼。這種態度很像人類對待老鼠、蒼蠅、蟑螂的態度:99.999%的上述所謂害蟲實際上都不帶有致命的病菌,但沒有人真的去識別哪隻害蟲身上可能有病。

一種特殊情況

“如果前面的例子不直接return怎麼辦?”

這個時候最好封裝一個方法,直接給return掉;然後在任何需要這個分支的地方呼叫這個方法而非拷貝這段if-else if-else程式碼。否則很快就會遇到最早我們提到的那個問題了:(當我們維護的時候)居然沒有一種簡單方法確定性地找到所有用過某個分支的地方。

“我拷貝的程式碼,當然一模一樣!怎麼會找不到……咦,誰手這麼賤,在else  if 中間放了兩個空格!”