2015-12-24 64 views
0

我是一個新手,剛開始工作的代碼,我有個任務在手,做了一些研究之後,我仍然沒能找到答案。如何優化java中有很多if語句的java函數?

我有一個使用了大量的if else語句,我的任務是優化代碼,因爲如果窩別的不是很好的編程,所以我一直在說的Java函數。

開始我還以爲switch語句是要走的路,但後來我看到了人告訴使用的地圖,我不知道是什麼地圖和網上的例子是很難甚至理解。

下面是代碼我必須優化

public static Boolean SurveyValidObject(JSONObject jSONObject) { 

    Boolean message = false; 

    if (jSONObject != null) { 

     Iterator it = jSONObject.keys(); 
     ArrayList<String> keysList = new ArrayList<String>(); 
     while (it.hasNext()) { 
      String key = (String) it.next(); 
      if (key.contains("field_")) { 
       int i = key.indexOf("_"); 
       String _fieldValue = key.substring(0, i + 1); 
       keysList.add(_fieldValue); 
      } else { 
       keysList.add(key); 
      } 
     } 
     ArrayList<String> userDatalist = new ArrayList<String>(); 
     userDatalist.add("survey_id"); 
     userDatalist.add("source_id"); 
     userDatalist.add("sso_id"); 
     userDatalist.add("email_id"); 
     userDatalist.add("field_"); 

     Boolean returnValue = keysList.containsAll(userDatalist); 

     Iterator iterator = jSONObject.keys(); 
     if (returnValue) { 
      while (iterator.hasNext()) { 
       try { 

        String key = (String) iterator.next(); // get key 
        String value = jSONObject.getString(key); // get value 

        if (key.equals("survey_id")) { 

         if (value == null) { 
          message = false; 
          break; 
         } else { 
          Boolean checkInteger = value.matches("\\d+"); 
          if (!checkInteger) { 
           message = false; 
           break; 
          } 
         } 

        } 
        if (key.equals("crm_id")) { 

         if (value == null) { 
          message = false; 
          break; 
         } else { 
          Boolean checkInteger = value.matches("\\d+"); 
          if (!checkInteger) { 
           message = false; 
           break; 
          } 
         } 

        } 
        if (key.equals("source_id")) { 
         if (value == null) { 
          message = false; 
          break; 

         } else { 
          Boolean checkInteger = value.matches("\\d+"); 
          if (!checkInteger) { 
           message = false; 
           break; 
          } 
         } 
        } 
        if (key.equals("sso_id")) { 
         if (value == null) { 
          message = false; 
          break; 

         } else { 

          Boolean checkId = value.matches("^[ A-Za-z0-9\\\"\\$%^&()!*:;<>?{}[email protected]\\/#+-/'']*$"); 
          String compareSSOValue = "/"; 
          if (!checkId || compareSSOValue.equals(value)) { 
           message = false; 
           break; 
          } 
         } 
        } 

        if (key.equals("email_id")) { 
         if (value == null) { 
          message = false; 
          break; 

         } else { 

          message = value.matches("\\b[\\w.%-'-][email protected][-.\\w]+\\.[A-Za-z]{2,4}\\b"); 
          if (!message) { 
           break; 
          } 

         } 
        } 

        if (key.contains("field_")) { 
         int i = key.indexOf("_"); 
         String _fieldValue = key.substring(i + 1); 
         Boolean checkInteger = _fieldValue.matches("\\d+"); 
         if (checkInteger) { 
          message = true; 
         } else { 
          message = false; 
          break; 
         } 
        } 

       } catch (org.json.JSONException e) { 

       } 
      } 
     } 
    } 
    return message; 
} 
+0

嘗試使用開關盒 – Abdelhak

+0

那麼,你是否試圖優化性能(我會詢問你是否知道你有性能問題)?還是你想讓代碼更具可讀性(漂亮,優雅,簡潔等)?這是兩個完全不同的目標。 – sstan

+3

* * *優化*,你的意思是讓它更快或更可讀? – Manu

回答

0

有大量的代碼重複。如果您重構它們,您可以刪除大量的if語句。

E.G null檢查value在每個if聲明重複。

    if (value == null) { 
         message = false; 
         break; 
        } 

而且下面的if聲明也重複了。

    Boolean checkInteger = value.matches("\\d+"); 
        if (!checkInteger) { 
         message = false; 
         break; 
        } 

而不是上述重複的代碼,你可以做到以下幾點。

   String key = (String) iterator.next(); // get key 
       String value = jSONObject.getString(key); // get value 

       if (value == null) { 
        return false; // return false and exit the method 
       } 

       Boolean checkInteger = value.matches("\\d+"); 

       if(key.equals("survey_id") || key.equals("crm_id")){ 
        if (!checkInteger) { 
         return false; 
        } 
       } 

同樣,嘗試重構代碼隔離重複項。

下面是我可以通過刪除重複的代碼實現。

try { 

    String key = (String) iterator.next(); // get key 
    String value = jSONObject.getString(key); // get value 

    if (value == null) { 
     return false; 
    } 

    if (key.equals("survey_id") || key.equals("crm_id") || key.equals("source_id")) { 

     Boolean checkInteger = value.matches("\\d+"); 
     if (!checkInteger) { 
      return false; 
     } 
    } 

    if (key.equals("sso_id")) { 

     Boolean checkId = value.matches("^[ A-Za-z0-9\\\"\\$%^&()!*:;<>?{}[email protected]\\/#+-/'']*$"); 
     String compareSSOValue = "/"; 
     if (!checkId || compareSSOValue.equals(value)) { 
      message = false; 
      break; 
     } 

    } 

    if (key.equals("email_id")) { 

     message = value.matches("\\b[\\w.%-'-][email protected][-.\\w]+\\.[A-Za-z]{2,4}\\b"); 
     if (!message) { 
      break; 
     } 
    } 

    if (key.contains("field_")) { 
     int i = key.indexOf("_"); 
     String _fieldValue = key.substring(i + 1); 
     Boolean checkInteger = _fieldValue.matches("\\d+"); 
     if (checkInteger) { 
      message = true; 
     } else { 
      message = false; 
      break; 
     } 
    } 

} catch (org.json.JSONException e) { 

} 

希望這會有所幫助。

0

在上面的代碼地方,你可以賺更多的可讀性,可以跳過許多if-else條款:

  1. 在這個地方if (jSONObject != null)你可以改變它爲
if (jSONObject == null) { 
    return false; 
} 

// the rest of the code will goes here 

而且相同if (returnValue)

  • 在第二while循環,我看到很多次if (value == null),你需要檢查一次,那麼你可以如下更改:
  • while (iterator.hasNext()) { 
        try { 
         String key = (String) iterator.next(); // get key 
         String value = jSONObject.getString(key); // get value 
    
         if (value == null) { 
          // if the value was null, then directly break; 
          message = false; 
          break; 
         } 
          // then many if else clauses you can skip like: 
          if (key.equals("survey_id")) { 
           Boolean checkInteger = value.matches("\\d+"); 
           if (!checkInteger) { 
            message = false; 
            break; 
           } 
           // no need for ths 
           /*if (value == null) { 
             message = false; 
             break; 
            } else { 
             Boolean checkInteger = value.matches("\\d+"); 
             if (!checkInteger) { 
              message = false; 
              break; 
             } 
            } 
    
       }*/ 
    
      // the rest of the code goes here. 
         //... 
        } 
    } 
    

    這2點,我建議。希望這可以幫助你!

    3

    最簡單的(也是最有前途的)選項是將所有這些檢查都放到自己的位置 - 我通常使用enum

    由於您想使用String來確定要進行哪項檢查,我們可以使enum生成Map

    static final Map<String, KeyCheck> lookup = new HashMap<>(); 
    
    enum KeyCheck { 
    
        SurveyId("survey_id"), 
        CRMId("crm_id"), 
        SourceID("source_id"), 
        SSOId("sso_id") { 
           @Override 
           boolean check(String value) { 
            return value != null 
            && value.matches("^[ A-Za-z0-9\\\"\\$%^&()!*:;<>?{}[email protected]\\/#+-/'']*$") 
            && !value.equals("/"); 
           } 
          }, 
        EMailId("email_id"){ 
           @Override 
           boolean check(String value) { 
            return value != null 
            && value.matches("\\b[\\w.%-'-][email protected][-.\\w]+\\.[A-Za-z]{2,4}\\b"); 
           } 
          }; 
    
        KeyCheck(String key) { 
         // All checks install in a Map. 
         lookup.put(key, this); 
        } 
    
        // Default to just check not null & integer. 
        boolean check(String value) { 
         return value != null && value.matches("\\d+"); 
        } 
    } 
    

    你的循環再簡化大大:

      while (iterator.hasNext()) { 
           try { 
    
            String key = (String) iterator.next(); // get key 
            String value = jSONObject.getString(key); // get value 
    
            KeyCheck check = lookup.get(key); 
            if (check != null) { 
             message = check.check(value); 
            } 
            // Do something else with this. 
            if (key.contains("field_")) { 
             int i = key.indexOf("_"); 
             String _fieldValue = key.substring(i + 1); 
             Boolean checkInteger = _fieldValue.matches("\\d+"); 
             if (checkInteger) { 
              message = true; 
             } else { 
              message = false; 
              break; 
             } 
            } 
    
           } catch (org.json.JSONException e) { 
    
           } 
          } 
    

    BTW:請注意,您將在序列中改變message的貨值均鍵,以便你只實際檢查最後關鍵,不他們全部。這可能是一個錯誤。

    +0

    這是對編譯時已知的一組值進行一系列比較的最佳解決方案(+1)。 – scottb