2011-06-28 16 views
1

次のコードははっきりと読みやすいですか?Javaコードスタイルの質問 - forループ

public void createDatabase() throws SQLException, IOException { 
    SQLiteDatabase database = dbStore.getDatabase(); 
    LineNumberReader scriptInputReader = new LineNumberReader(new InputStreamReader(getClass().getResourceAsStream(SCRIPT_CREATE))); 
    for(String line; (line = scriptInputReader.readLine()) != null;) { 
     database.execSQL(line); 
    } 
} 

私は上記のような "for"ループをたくさん書きます。私にとっては、ループ内で使用される一時変数( "行")を示し、ループの終了時( "readLine"が "null"を返す)にスコープを制限します。他のプログラマは、これらの...

またはこのいずれかのために私を嫌いになるのだろうか:

SQLiteDatabase database = dbStore.getDatabase(); 
    Cursor cursor = database.query("PINS", new String [] {"ID", "X", "Y"}, null, null, null, null, "ID"); 
    if(cursor.moveToFirst()) { 
     for(; !cursor.isAfterLast(); cursor.moveToNext()) { 
      (...) 
     } 
    } 
    cursor.close(); 

は、上記だけで「きちんとした」またはすでにJavaにパズルのようなものはありますか?

+0

afを使用していたプログラマを知っていたほとんどの人があなたがそれを手放すことができると思うなら、私が使っているところですが、これらの例は実際にはwhileループを使う何かのように見えます。 – fvu

+0

@fvu:私はJava SDKを使って得点したら、重いコーディングスタイルのために同様のものが使われたいくつかの "公式の"例を見つけることができました。だからそれはかなり主観的だと思います。 – Voo

+0

私はときどき(;;){/*...*/ for(something)break; /*...*/}しかし、明らかに間違っています。プロトタイプ作成中にしか行いません。それは私にとっては習慣のようです;) – Chris

答えて

4

私はあなたがやったように、しかし、私は1つの小さな変更になるだろう:

for(String line = scriptInputReader.readLine(); line != null; line = scriptInputReader.readLine()) { 
    database.execSQL(line); 
} 

これは、ループの終了条件から反復アクションを分離します。また、 "while"バージョンとは異なり、line変数のスコープをループ狭化スコープに制限するのは、できるだけコーディングを適切に行うことです。

また、コードスタイルチェッカーは、通常、テスト内にネストされた割り当てを「不良スタイル」と見なします。明確にするために、コードは次のように少しです:

for (int i = -1; ++i < max;) { // don't do this: increment action inside condition section 
    // some code 
} 
+3

ええ、forループだけを使用することで問題はありませんが、理由のない条件で代入を使用するのは邪悪な邪悪なスタイルです。 – Voo

+0

まあ、条件の割り当てをチェックするルールは、私がcheckstyle/PMDの設定から取り除いた最初のものの1つです - このユースケースのため正確です) –

+1

私は "line!= null"反復アクション "readLine()"をクリアします。私はこれが私の元のループよりも良く見えると思う。 – Chris

1

私は私が選ぶだろうwhileループ

String line = scriptInputReader.readLine(); 
while(line != null){ 
    //do stuff 
    line = scriptInputReader.readLine(); 
} 
7

を使用します。これは、明確かつ簡単です

String line = null; 
while((line = scriptInputReader.readLine()) != null) { 
    ... do stuff with line 
} 

+0

''ヌル 'に設定された 'line'へのイニシャライザは偽です。 –

+0

はい...しかし...これは、ループが終了した後もラインが割り当てられているため、少しのメモリリークがあります。これはループの後にスコープ内の変数名も保持します。同じメソッド内で別の変数型と競合する可能性があります。 そして、すべてのものを追加の括弧で囲むことは極端に思える; – Chris

+0

@Kirk Woll - >真実、私はそれを後で読む人のためのガイドとしてもっと扱います。ここでは初期化されていない値を持っています "。 –

1

私は気楽にもっと気分を味わえます。

ループが何をするのか分かりやすいので最初のものはそれほど悪くはありませんが、ループの途中にロジックを追加して操作が複雑になると、 「ちょっと、ファイルを読んでほしいと思ったら、しばらく使っていたと思うので、ちょっとしたトリックが必要だ」と思うだろう。

2番目のコード(ループ内のコードはありません)は恐ろしいものですが、それほど遠くない将来に誰かが言うでしょう:「ねえ、ここにループがあり、内容が削除されました。彼らはループを削除することを忘れてしまった!私はそれを完全に除去することによってそれを最適化することができます ')。

0

ここには2つの考え方があります。 Jarek Potiukが示すように、/ whileループを異なる目的で使用することを好むもの、つまり、ループの範囲を事前に知っているときはforループを使用しなければなりません(for(; i < arr.length(); i ++))。

しかし、もう1つの種類のループを使用する考え方があります。これは、より汎用性が高いためです。例えば、Java SDKは無制限の状況(例:リンクリスト)でかなり頻繁にforループを使用します。 しかし、あなたは本当にボヘミアンのようにforループを書くべきです - はるかに明確です。

0

ループの終了時期がわからないときは、whileループを使用する方が好きです。例えば、ファイルを読み込む。

Jarek Potiukのソリューションが動作する

は、しかし、私はこのようなものを好む:

String line = scriptInputReader.readLine(); 
while(line != null) 
{ 
    ... do stuff with line 
    line = scriptInputReader.readLine(); 
} 

をそれは少しより多くのコードですが、私はボヘミアンに同意する必要があります:スタイルチェッカーが通常考える

コード テスト内にネストされた割り当てを 「貧弱なスタイル」

+0

私はコードチェッカーの素晴らしいファンです。本当に。 25人以上の人のために私の会社に紹介しました。私は彼らを愛しています。長い間、彼らが宣伝するコードは優れています....最近、チェックスタイル/ PMDのルールを見直し、より良い害をもたらすルールを削除しました。状態の割り当てはそれらの1つでした。 –

+0

@Jarek yeap!すべてのコミットがコードスタイルガイドラインに違反していることを否定するためにsvnフックで実行すると、貧しいプログラマーの人生は悲惨になります;)pozdrawiam :) – Chris