Markoの答えは、この質問でのプログラミングの取り組みにとって明らかに最良のものの1つです。
ただし、これを一般的な例として使用すると、スタイルと実践の問題として、そのようなより良い解決策がないコンテキスト(regexpやCharMatcherなど)に外挿することができます。ローカル変数を使用したメソッド呼び出しの結果。
これにより、ローカル変数に名前を付けることができるため、明確さが向上し、実行に最も論理的な場所に各単純なコードを配置できるようになります(また、JVMが本当に得意なことの1つ、つまりローカル変数を最適化できるようになります)利用方法)。
この変換されたバージョンでは、ループ内で繰り返しテストするのではなく、ループ外でfirstCharをテストしていることに気付くでしょう。.length()と同じです。私は最初に、これは論理的により正しいプログラミングであり(これがループ内で何度も繰り返される理由について他の読者を混乱させる)、次にパフォーマンスが向上することを主張します。
ループのこのようなコードの動きは、この単純な例のパフォーマンスに実質的に影響を与えませんが(5回の反復のカウントだけで、ループするライブラリを使用したより良いソリューションがあります)、一般的に、および他のコンテキストでは、これを次のように推奨しますベストプラクティス、より読みやすく、よりクリーンです(パフォーマンス指向でもあります)。
また、最初に長さをテストするので、.charAt(0)が存在することがわかっています。つまり、長さは> 0です。つまり、.charAt(0)reportError()
をスローする代わりに、長さゼロの文字列を使用しますIndexOutOfBounds
。これは、より単純な式を使用することでプログラミングロジックの優れた順序付けを可能にする方法のもう1つの例です。
このKIS(keep-it-simple)スタイルでは、これらのローカル変数を簡単に監視できるため、デバッグも容易になります。メンテナにとっても読みやすいと思います。
また、定数5を1箇所に限定すると、メンテナンスが容易になります。
public static final int expectedLength = 5;
..。
if ( codeInput.length() != expectedLength )
return reportError ();
char firstChar = codeInput.charAt(0);
if ( firstChar < 'A' || firstChar > 'Z' )
return reportError ();
for (int i = 1; i < expectedLength; i++) {
char nextChar = codeInput.charAt(i);
if ( nextChar < '0' || nextChar > '9' )
return reportError ();
}
..。
private static boolean reportError () {
if (verbose)
System.out.println("Sorry, I don't understand!\nUse product codes only.");
return true;
}