關於Java代碼簡化的小技巧


簡化代碼的小技巧

今天重構之前寫的一段對賬代碼,基本邏輯是先校驗,然后更新一下記錄狀態,然后處理對賬主體的數據修改。抽象出來就是要三步,每一步出錯或者校驗不通過,就直接返回錯誤信息。抽象代碼如下

public class Check{
    public boolean first(Map<String,String> message){
        ...
        //出錯或者校驗不通過返回false,同時將錯誤信息保存到message中。
        ...
        return true;
    }

    public boolean second(Map<String,String> message){
        ...
        //出錯或者校驗不通過返回false,同時將錯誤信息保存到message中。
        ...
        return true;
    }

    public boolean last(Map<String,String> message){
        ...
        //出錯或者校驗不通過返回false,同時將錯誤信息保存到message中。
        ...
        return true;
    }
}

最直接寫法

如果不考慮其他,第一反應肯定是這么寫

public class Test{

    public static void main(String[] args){
        Check check = new Check();
        Map<String,String> message = new HashMap<>();
        if(check.first(message)){
            if(check.second(message)){
                if(check.last(message)){
                   //commit;
                }else{
                   //rollback;
                }
            } else{
                //rollback;
            }
        }else{
            //rollback;    
        }
        System.out.println(message.get("msg"));
    }
}

沒錯,項目中的代碼就是這么寫的,多層if嵌套,抽象出來還能看懂,添加上大段的業務邏輯,看起來就費勁了。

第一步優化

先來第一步優化,把多層if判斷去掉。

public class Test{

    public static void main(String[] args){
        Check check = new Check();
        Map<String,String> message = new HashMap<>();
        if(!check.first(message)){
            System.out.println(message.get("msg"));
            //rollback;
            return;
        }
        if(!check.second(message)){
            System.out.println(message.get("msg"));
            //rollback;
            return;
        }
        if(!check.last(message)){
            System.out.println(message.get("msg"));
            //rollback;
            return;
        }
        //commit;    
    }
}

通過return提前返回,避免多層if嵌套。

再次精簡

我覺得寫代碼能有上面的覺悟已經不錯了。不過無意中發現還有更簡單的,但是好像不容易理解。代碼如下:

public class Test{

    public static void main(String[] args){
        Check check = new Check();
        Map<String,String> message = new HashMap<>();
        if(!check.first(message) || !check.second(message) || !check.last(message)){
            System.out.println(message.get("msg"));
            //rollback;
            return;
        }
        //commit;    
    }
}

利用判斷條件的或,合並代碼。原理是或判斷如果前面的條件為真,就不再判斷后面的條件。也就是前面如果報錯,取反為真,則不判斷后面的條件,直接進入if條件里面,也就不執行后面的代碼而直接返回錯誤信息。只有當所有的操作都不報錯,才會到最后的commit操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM