2012-06-07 21 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中的函数。

对不起,我的英语我希望你可以管理一切,它对你有帮助。