首頁  >  問答  >  主體

java如何消除繁琐的if else 语句?

求助:一堆的if else 嵌套

private Map versionCheck(Map mapParam) {
    Map msg = new HashMap();
    if(!"".equals(PMSUtil.isNull(mapParam.get("IS_INTERNET")))){
      String checkVersion =SystemGlobals.getProperty("IS_CHECK");
      if("1".equals(checkVersion)){
          String versions =SystemGlobals.getProperty("VERSION");
          String version =PMSUtil.isNull(mapParam.get("VERSION"));
          String taxRegisterNo=PMSUtil.isNull(mapParam.get(""));
          String whiteList =SystemGlobals.getProperty("NO_CHECK_TAX_REGISTER_NO");
          if((","+whiteList+",").indexOf((","+taxRegisterNo+","))==-1){
              if((","+versions+",").indexOf(","+version+",")==-1){//找不到
                  msg.put("RESULT", "0001");
                  msg.put("MSG", "FAILD");
              }else{
                 msg.put("RESULT", ""0000"");
              }
          }else{
            msg.put("RESULT", ""0000"");
          }
      }else{
          msg.put("RESULT", ""0000"");
      }
    }else{
        msg.put("RESULT", ""0000"");
    }
    return msg;
}
PHPzPHPz2764 天前783

全部回覆(9)我來回復

  • ringa_lee

    ringa_lee2017-04-17 11:31:22

    樓主就不要用你那山寨的 PMSUtil 了吧,直接上 org.apache.commons.lang.StringUtils

     private Map versionCheck(Map mapParam) {
            Map msg = new HashMap();
            msg.put("RESULT", "0000");
    
            String isInternet = (String) mapParam.get("IS_INTERNET");
            if (StringUtils.isBlank(isInternet)) {
                return msg;
            }
    
            String isCheck = SystemGlobals.getProperty("IS_CHECK");
            if (!StringUtils.equals(isCheck, "1")) {
                return msg;
            }
    
            String globalVersions = SystemGlobals.getProperty("VERSION");
            String currentVersion = (String) mapParam.get("VERSION");
            if (!StringUtils.contains("," + globalVersions + ",", "," + currentVersion + ",")) {
                return msg;
            }
    
            String whiteList = SystemGlobals.getProperty("NO_CHECK_TAX_REGISTER_NO");
            String taxRegisterNo = (String) mapParam.get("");
            if (!StringUtils.contains("," + whiteList + ",", "," + taxRegisterNo + ",")) {
                msg.put("RESULT", "0001");
                msg.put("MSG", "FAILD");
                return msg;
            }
    
            return Collections.emptyMap();
        }
    

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 11:31:22

    1. 整體可簡化為:

    if () {
        if () {
            if () {
                if () {
                    msg.put("RESULT", "0001");
                    msg.put("MSG", "FAILD");
                    return msg;
                }
            }
        }
    }
    
    msg.put("RESULT", "0000");
    return msg;
    

    2. str.indexOf(s) == -1 可簡化為 !str.contains(s)
    3. 使用 2 之後,最裡層的兩個 if 語句:

    if (c1) {
      if (c2) {
        ...
      }
    }
    

    可以寫成:

    if (c1 && c2) {
      ...
    }
    

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 11:31:22

    if簡化其實還是對事實邏輯上的分拆整合,語言上目前發揮餘地不大。 。 。

    個人觀點,噴子無視

    回覆
    0
  • PHPz

    PHPz2017-04-17 11:31:22

    不知道你的程式的具體邏輯,設計模式 也許能幫到你

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:31:22

    依照邏輯整合,具體到這個範例中,可以先設定預設值:

    msg.put("RESULT", ""0000"");
    

    然後再加上if語句,這樣的話剩餘後面一大堆的else語句就可以省略掉了。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 11:31:22

    分析變化的部分和穩定的部分程式碼,採用策略模式分離變化部分的程式碼

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 11:31:22

    樓主可以查表驅動法

    回覆
    0
  • 黄舟

    黄舟2017-04-17 11:31:22

    有幾個建議
    1. 盡量不要使用 else 而是儘早 retrun

    void foo(){
        if(bad){
            //doSomthing
            return ;
        }
        //else <- 这个就可以不写了
        //real good logic;
    }
    
    1. 使用短路邏輯
    if(s!= null && s.isValid() && s.then(doSomthing))
    
    1. 使用函數方式表示
    String result(String a){
        return (checkVersion(a) || isInternet(a)) ? "OK" :"000-default";
    }
    boolean checkVersion(String ver){
        return StringUtils.notBlank(ver) && ver.equals("...");
    }
    boolean isInternet(String ver){
        return StringUtils.notBlank(ver) && ver.equals("internet");
    }
    
    void main(){
    //...
        someMap.put(result(String a));
    //...
    }
    
    
    

    所有的邏輯應該盡量分拆成多而小的函數,這些沒有副作用的函數可以被組裝成複雜的邏輯而且不失可讀性。但這需要一定的經驗。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 11:31:22

    具體到樓主這個例子,我覺得你應該儘早return,而不是用else

    回覆
    0
  • 取消回覆