java如何消除繁琐的if else 语句?
PHPz
PHPz 2017-04-17 11:29:22
0
9
796

求助:一堆的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;
}
PHPz
PHPz

学习是最好的投资!

全部回覆(9)
左手右手慢动作

樓主就不要用你那山寨的 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();
    }
Ty80

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) {
  ...
}
左手右手慢动作

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

個人觀點,噴子無視

PHPzhong

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

大家讲道理

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

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

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

迷茫

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

左手右手慢动作

樓主可以查表驅動法

黄舟

有幾個建議
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));
//...
}


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

小葫芦

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板