であるかどうかの確認します複雑さは大きすぎます(5を3以下にする必要がある場合は5)。私の開発マネージャーは、私が回答として投稿するいくつかの代替実装を立てました。個人的には、自分のコードが十分に読みやすく、このメソッドのチェックスタイルを無効にすることをお勧めします。ベストコーディングスタイルは、文字が、私はこのようになります指定された文字が有効であるかどうかを返すメソッドをコーディングしています有効な文字
あなたはどう思いますか?
であるかどうかの確認します複雑さは大きすぎます(5を3以下にする必要がある場合は5)。私の開発マネージャーは、私が回答として投稿するいくつかの代替実装を立てました。個人的には、自分のコードが十分に読みやすく、このメソッドのチェックスタイルを無効にすることをお勧めします。ベストコーディングスタイルは、文字が、私はこのようになります指定された文字が有効であるかどうかを返すメソッドをコーディングしています有効な文字
あなたはどう思いますか?
private static boolean isValid(char c) {
String validChars =".,+/;:";
return (validChars.indexOf(c) > -1);
}
これは問題ありませんが、拡張性はありません。そのためには、ルックアップテーブルが必要です。 –
有効な文字のリストを変更するコードを再コンパイルする必要がないように、有効な文字をプロパティファイルに抽出します。 –
private static boolean isValid(char c) {
switch (c) {
case '.' : // FALLTHROUGH
case ',' : // FALLTHROUGH
case '+' : // FALLTHROUGH
case '/' : // FALLTHROUGH
case ';' : // FALLTHROUGH
case ':' :
return true;
default : return false;
}
}
private static boolean isValid(char c) {
char[] validChars2 = {'.', ',', '+', '/', ';', ':'};
for (char d : validChars2) {
if (c == d) { return true; }
}
return false;
}
private static boolean isValid(char c) {
/* CHECKSTYLE:OFF */
return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
/* CHECKSTYLE:ON */
}
正規表現はうまく仕事ができます。私は以下の例にそれをハードコードしていますが、設定ファイルから簡単に取り出すこともできます。それは通常、正規表現に意味を持つ文字をエスケープするため
[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()メソッドは、ここに便利です。 "最小の文字セット(\、*、+、?、|、{、[、(、)、^、$、。、#、および空白)をエスケープコードに置き換えてエスケープします。 "
読みやすさが懸念されていない場合、これは私が設定を使用したいchar値
+ 11
, 12
. 14
/15
: 26
; 27
private static boolean isValid(char c)
{
return c > 14 ? c == '/' || c == ';' || c == ':' : c == '.' || c == ',' || c == '+';
}
バイナリ検索は線形よりも速いことがよくありますが、要素がごくわずかなため、より洗練されたアルゴリズムのオーバーヘッドはそれほど価値がないかもしれません。シンプルなルックアップ・テーブルは高速であり、何人のキャラクタがテストされても、高速になります。 –
のための基準として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);
}
これは機能しますが、唯一の欠点は各チェックの自動ボクシングオーバーヘッドでしょうか? – BenM
この方法では、文字を追加したり他の文字と比較して文字を削除したりすることが難しくなり、有効な文字が一目で分かりにくくなります。 –
あなたの投票をc/wにするか、評判農業のように見えます。 –
正規表現を使用してください – Tom