删除重复代码

时间:2012-06-07 21:48:49

标签: java

我的问题是 -

我有两个字符串变量site_inclusionsite_exclusion。如果site_inclusion有值,那么我不关心site_exclusion包含的值。也就是说site_inclusion会覆盖site_exclusion。但是,如果site_inclusionnullsite_exclusion有值,则我想检查site_exclusion

更确切地说:

  1. 如果site_inclusionsite_exclusion都是null,请将useTheSynthesizer设为true;
  2. 如果site_inclusion不是null且与regexPattern匹配,则将useTheSynthesizer设置为true。我并不关心site_exclusion中的价值观。
  3. 如果site_inclusionnullsite_exclusion不是nullsite_exclusionregexPattern不匹配,则设置为useTheSynthesizer真实。
  4. 我写了下面的代码,但不知怎的,我想,我在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;
    }
    

5 个答案:

答案 0 :(得分:6)

  1. 您真的不需要最后一次null测试。
  2. 我(个人)发现做if(test == true) flag = true陈述的风格很差。您可以简单地说flag = test
  3. 我的建议是:

    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。这在您的代码或解释中并不明确,但我认为这个假设是安全的。)

答案 1 :(得分: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)。

答案 2 :(得分: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);
        }

答案 3 :(得分: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;
}

答案 4 :(得分:0)

您好我认为您可以使用OR之类的东西进行改进,不仅可以使用AND或尝试像swicht这样的东西。

无论如何,您可以创建一些测试变量的函数,并且可以从主模块中编写这个令人困惑的代码。

例如,您可以在名为boolean TestingVariable ( String X, String Y);

的函数中编写此代码

例如:     boolean TesteingVariable(String X,String 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);

我认为你应该在函数中输入变量regexPattern

对不起我的英语我希望你能为所有人提供帮助,并为你提供帮助。