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 boolean isValid(char c) {
    /* CHECKSTYLE:OFF */
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
    /* CHECKSTYLE:ON */
}
于 2009-08-12T16:24:06.837 に答える
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 に答える
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()メソッドは、正規表現で通常意味を持つ文字をエスケープするため、ここで便利です。ドキュメントから: "最小限の文字セット(\、*、+、?、|、{、[、(、)、^、$、。、#、および空白)をエスケープコードに置き換えることでエスケープします。 「」

于 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 に答える