2012-06-07 199 views
3

我的問題是 -刪除重複的代碼

我有兩個字符串變量site_inclusionsite_exclusion。如果site_inclusion有一個值,那麼我不在乎site_exclusion包含什麼值。也就是說site_inclusion優先於site_exclusion。但是,如果site_inclusionnullsite_exclusion有一個值,那麼我想檢查site_exclusion

爲了更精確:

  1. 如果site_inclusionsite_exclusion均爲null然後設置作爲useTheSynthesizertrue;
  2. 如果site_inclusion不是null並且它與regexPattern匹配,則將useTheSynthesizer設置爲true。我不在乎site_exclusion有什麼價值。
  3. 如果site_inclusionnullsite_exclusionnullsite_exclusion不匹配regexPattern然後設置useTheSynthesizer爲true。

我寫了下面的代碼,但我總覺得,我在的if/else循環重複這裏一些東西。任何代碼改進將不勝感激,滿足我的條件。

String site_inclusion = metadata.getSiteInclusion(); 
String site_exclusion = metadata.getSiteExclusion(); 

// fix for redundant data per site issue 
if(site_inclusion != null && site_inclusion.matches(regexPattern)) { 
    useTheSynthesizer = true; 
} else if(site_exclusion != null && !(site_exclusion.matches(regexPattern))) { 
    useTheSynthesizer = true; 
} else if(site_inclusion == null && site_exclusion == null) { 
    useTheSynthesizer = true; 
} 
+2

可能更適合[codereview.stackexchange.com](http://codereview.stackexchange.com/) – Torious

+0

@Torious:的確如此。我甚至沒有注意到codereview SE。 –

+0

您的示例代碼與您的描述不符。如果'site_inclusion'不爲空,且它與模式不匹配,則示例代碼繼續檢查'site_exclusion'是否匹配。這與第2點相矛盾,如果'site_inclusion'不爲空,那麼你說你不關心'site_exclusion'。 – jahroy

回答

6
  1. 你並不真的需要最後null測試。
  2. 我(親自)發現它做得很差,做一個if(test == true) flag = true聲明。你可以簡單地說flag = test

我的建議是:

if(site_inclusion != null) 
{ 
    useTheSynthesizer = site_inclusion.matches(regexPattern); 
} 
else if(site_exclusion != null) 
{ 
    useTheSynthesizer = ! site_exclusion.matches(regexPattern); 
} 
else 
{ 
    useTheSynthesizer = true; 
} 

你也可以做一個oneliner:

useTheSynthesizer = site_inclusion != null ? site_inclusion.matches(regexPattern) : (site_exclusion != null ? ! site_exclusion.matches(regexPattern) : true); 

但我發現那種厭惡閱讀。

(注意,我所做的假設,即useTheSynthesizer是另有false,這是不是在你的代碼或解釋明確,但我認爲這個假設是安全的。)

+0

謝謝愛德華,今天我學到了更多的東西。謝謝你的評論。 – ferhan

+0

這看起來不對。如果'site_inclusion'不爲空,但與模式不匹配,則應該處理'site_exclusion'。這個答案假定'useTheSynthesizer'應該總是在'site_inclusion'非空並且不匹配時返回false。 – jahroy

+0

如果site_inclusion有一些值,那麼site_inclusion將覆蓋site_exclusion中的任何東西,基本上我不會打擾什麼site_exclusion具有。但是,如果site_inclusion爲null並且site_exclusion具有某些內容,那麼在這種情況下,我將檢查site_exclusion。 – ferhan

0

你可以這樣做。基本上我提取所有的條件作爲小的方法,並作爲OR條件。

String site_inclusion = metadata.getSiteInclusion(); 
    String site_exclusion = metadata.getSiteExclusion(); 
     if(isInclusionAndExclusionNull(site_inclusion, site_exclusion) || isSiteExclusionMatches(site_exclusion, regexPattern) || isSiteInclusionMatches(site_inclusion, regexPattern)) { 
      useTheSynthesizer = true; 
     } 

private static boolean isInclusionAndExclusionNull(String site_inclusion, 
      String site_exclusion) { 
     return site_inclusion == null && site_exclusion == null; 
    }  
    private boolean isSiteExclusionMatches(String site_exclusion, 
       String regexPattern) { 
      return site_exclusion != null && !(site_exclusion.matches(regexPattern)); 
     } 

     private boolean isSiteInclusionMatches(String site_inclusion, 
       String regexPattern) { 
      return site_inclusion != null && site_inclusion.matches(regexPattern); 
     } 
2

我會做這樣的:

boolean useTheSynthesizer; 

    if (siteInclusion == null && siteExclusion == null) { 
     useTheSynthesizer = true; 
    } 
    else if (siteInclusion == null) { 
     useTheSynthesizer = (! siteExclusion.matches(regexPattern)); 
    } 
    else { 
     useTheSynthesizer = siteInclusion.matches(regexPattern); 
    } 

我也去掉了下劃線從你的變量名,因爲它們不符合Java命名約定(和他們醜惡IMO)。

+0

請注意,以上是對OP示例代碼的簡化。但是,它不符合要求的描述(從要點)。示例代碼和問題描述是矛盾的。 – jahroy

0

您可以使用2種方法靈活處理下面的內含物和排除項。

callingMethod() { 
    boolean useTheSynthesizer = processSiteInclusions(site_inclusion, regexPattern); 

    if (useTheSynthesizer == false) { 
    useTheSynthesizer = processSiteExclusions(site_inclusion, regexPattern); 
    } 

    if (useTheSynthesizer == false) { 
    useTheSynthesizer = true; 
    } 
} 

private boolean processSiteInclusions(site_inclusion, regexPattern) { 
    boolean useSynthesizer = false; 

    if (site_inclusion != null && !site_inclusion.matches(regexPattern)) 
     useSynthesizer = true; 

    return useSynthesizer; 
} 

private boolean processSiteExclusions(site_exclusion, regexPattern) { 
    boolean useSynthesizer = false; 

    if (site_exclusion != null && !site_inclusion.matches(regexPattern)) 
     useSynthesizer = true; 

    return useSynthesizer; 
} 
0

你好,我認爲你可以使用一些像OR這樣的改進它,而不僅僅是AND或者嘗試像swicht case這樣的事情。

無論如何,你可以創建一些函數來測試你的變量,你可以從你的主模塊寫出這個混淆的代碼。

例如,你可以這樣寫代碼,在一個名爲boolean TestingVariable (String X, String Y);

例如功能: 布爾TesteingVariable(串x,y字符串){

if(X != null && X.matches(regexPattern)) { 
     return true; 
    } else if(Y != null && !(Y.matches(regexPattern))) { 
     return = true; 
    } else if(X == null && Y == null) { 
     return = true; 
    } 
}; 

在這種方式最終主模塊代碼將是這樣的,你會避免在你的主代碼混淆代碼:

String site_inclusion = metadata.getSiteInclusion(); 
String site_exclusion = metadata.getSiteExclusion(); 

// fix for redundant data per site issue 
useTheSynthesizer = TesteingVariable (site_inclusion ,site_exclusion); 

我想你應該輸入th變量regexPattern中的函數。

對不起,我的英語我希望你可以管理一切,它對你有幫助。