2009-08-12 1 views
0

であるかどうかの確認します複雑さは大きすぎます(5を3以下にする必要がある場合は5)。私の開発マネージャーは、私が回答として投稿するいくつかの代替実装を立てました。個人的には、自分のコードが十分に読みやすく、このメソッドのチェックスタイルを無効にすることをお勧めします。ベストコーディングスタイルは、文字が、私はこのようになります指定された文字が有効であるかどうかを返すメソッドをコーディングしています有効な文字

あなたはどう思いますか?

+0

この方法では、文字を追加したり他の文字と比較して文字を削除したりすることが難しくなり、有効な文字が一目で分かりにくくなります。 –

+7

あなたの投票をc/wにするか、評判農業のように見えます。 –

+2

正規表現を使用してください – Tom

答えて

11
private static boolean isValid(char c) { 
    String validChars =".,+/;:"; 
    return (validChars.indexOf(c) > -1); 
} 
+0

これは問題ありませんが、拡張性はありません。そのためには、ルックアップテーブルが必要です。 –

+0

有効な文字のリストを変更するコードを再コンパイルする必要がないように、有効な文字をプロパティファイルに抽出します。 –

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; 
    } 
} 
+0

別のケースのステートメントの場合は、// FALLTHROUGHのコメントは気にしません。 – Avi

+0

私はこれが一番好きです。なぜなら、それは最も簡単だからです。スピードが問題ではない場合、私はいつもあなたの周りにいないときに誰があなたのコードを維持しなければならないか分からないので、読書のために行きます。 – Ben

+0

私はそれが嵩張り、柔軟性がないので、これは非常に嫌いです。 –

1
private static boolean isValid(char c) { 
    char[] validChars2 = {'.', ',', '+', '/', ';', ':'}; 
    for (char d : validChars2) { 
     if (c == d) { return true; } 
    } 
    return false; 
} 
2
private static boolean isValid(char c) { 
    /* CHECKSTYLE:OFF */ 
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':'; 
    /* CHECKSTYLE:ON */ 
} 
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()メソッドは、ここに便利です。 "最小の文字セット(\、*、+、?、|、{、[、(、)、^、$、。、#、および空白)をエスケープコードに置き換えてエスケープします。 "

+0

私はJavaでコーディングしていますが、C#ではありません。 – Tarski

+0

いいですが、別の(ただし非常に似ている)言語を使ってみましたか?弱い。 – RKitson

+0

正規表現が過度に使用されていることを前提にして、私はdownvoteかもしれませんが、C#はJavaに似ていて、気付かなかったことがあります。 –

0

読みやすさが懸念されていない場合、これは私が設定を使用したいchar値

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

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

バイナリ検索は線形よりも速いことがよくありますが、要素がごくわずかなため、より洗練されたアルゴリズムのオーバーヘッドはそれほど価値がないかもしれません。シンプルなルックアップ・テーブルは高速であり、何人のキャラクタがテストされても、高速になります。 –

2

のための基準として3

のブール複雑で、半バイナリ検索に対処することができます。わかりやすい名前を付けることの利点があり、うまく拡張できます。

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); 
} 
+0

これは機能しますが、唯一の欠点は各チェックの自動ボクシングオーバーヘッドでしょうか? – BenM

関連する問題