3

我的问题是-

我有两个字符串变量site_inclusionsite_exclusion. 如果site_inclusion有一个值,那么我不在乎值site_exclusion包含什么。也就是说,site_inclusion覆盖site_exclusion. 但是,如果 site_inclusionisnull并且site_exclusion具有值,那么我想检查site_exclusion.

更准确地说:

  1. 如果site_inclusionsite_exclusionnull设置useTheSynthesizertrue;
  2. 如果site_inclusion不是null,它与设置为的regexPatternthen匹配。而且我不在乎.useTheSynthesizertruesite_exclusion
  3. if site_inclusionis nulland site_exclusionis notnullsite_exclusion不匹配regexPatternthen 设置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;
}
4

5 回答 5

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

于 2012-06-07T21:57:22.610 回答
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)。

于 2012-06-07T22:08:15.353 回答
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);
        }
于 2012-06-07T22:05:33.153 回答
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;
}
于 2012-06-07T22:09:42.013 回答
0

您好,我认为您可以使用类似 OR 的方法来改进它,而不仅仅是 AND 或尝试类似 swicht case 的方法。

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

例如,您可以在一个名为的函数中编写此代码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在函数中输入变量。

对不起我的英语,我希望你能理解所有,它对你有帮助。

于 2012-06-07T22:23:55.000 回答