0

我正在编写一个返回给定字符是否有效的方法,如下所示: -

private static boolean isValid(char c) {
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
}

检查样式将其标记为布尔复杂度太大(当它不应该超过 3 时为 5)。我的开发经理已经标记了一些替代实现,我将作为答案发布。就个人而言,我认为我的代码具有足够的可读性,并且更愿意关闭此方法的检查样式。

你怎么看?

4

7 回答 7

12
private static boolean isValid(char c) {
    String validChars =".,+/;:";
    return (validChars.indexOf(c) > -1);
}
于 2009-08-12T16:20:02.350 回答
5
private static boolean isValid(char c) {
    switch (c) {
    case '.' : // FALLTHROUGH
    case ',' : // FALLTHROUGH
    case '+' : // FALLTHROUGH
    case '/' : // FALLTHROUGH
    case ';' : // FALLTHROUGH
    case ':' :
      return true;
    default : return false;
    }
}
于 2009-08-12T16:21:26.497 回答
2

我会用一套。它具有具有描述性名称的好处,并且可以很好地扩展。

private static Set<Character> validCharacters = new HashSet<Character>();

public static void initValidCharacters() {
    validCharacters.add('.');
    validCharacters.add(',');
    validCharacters.add('+');
    validCharacters.add('/');
    validCharacters.add(';');
    validCharacters.add(':');
}

private static boolean isValid(char c) {
    return validCharacters.contains(c);
}
于 2009-08-12T19:22:41.607 回答
2
private static boolean isValid(char c) {
    /* CHECKSTYLE:OFF */
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
    /* CHECKSTYLE:ON */
}
于 2009-08-12T16:24:06.837 回答
1
private static boolean isValid(char c) {
    char[] validChars2 = {'.', ',', '+', '/', ';', ':'};
    for (char d : validChars2) {
      if (c == d) { return true; }
    }
    return false;
}
于 2009-08-12T16:23:02.923 回答
0

正则表达式可以很好地工作。我已将其硬编码到下面的示例中,但您也可以轻松地将其从配置文件中提取出来。

    [Test]
    public void AisNotValid ()
    {
        Assert.IsFalse(IsValid('a'));
    }

    [Test]
    public void SemiColonIsValid ()
    {
        Assert.IsTrue(IsValid(';'));
    }

    public bool IsValid(Char c)
    {
        return Regex.IsMatch(Regex.Escape(".,+/;:"), c.ToString());
    }

Regex.Escape() 方法在这里派上用场,因为它转义了通常在 Regex 中有意义的字符。来自文档:“通过用转义码替换它们来转义一组最小字符(\、*、+、?、|、{、[、(,)、^、$、.、# 和空格)。 "

于 2009-08-12T18:30:13.197 回答
0

如果可读性不是问题,这可以通过半二分搜索来处理,布尔复杂度为 3

作为 char 值的参考

+ 11
, 12
. 14
/ 15
: 26
; 27

private static boolean isValid(char c)
{
    return c > 14 ? c == '/' || c == ';' || c == ':' : c == '.' || c == ',' || c == '+';
}
于 2009-08-12T18:40:54.313 回答