TOP設計・移行・活用> if/whileの条件式で"="は利用しない(C_CTR003)
Javaコーディング規約
Javaコーディング規約

第10回:制御構造に関する規約
著者: 電通国際情報サービス  高安 厚思、東田 健宏
レッドフォックス  石井 宏和
   2005/12/21
前のページ  1  2   3  4  次のページ
if/whileの条件式で"="は利用しない(C_CTR003)

   ifとwhileの条件式の中では"="演算子を利用することができます。ただし基本的にはifあるいはwhileの条件内に"="演算子を使用するケースは、メソッドの返り値を代入するケース除いて、ほとんど考えられません。

   多くの場合は"=="と間違えているか、あるいは条件文の外で行うべき代入を条件文内で行っているかのどちらかです。
"="を使用した良い例
FileInputStream fileInputStrm = new FileInputStream( FILEPATH );
int characterData = 0;
//データ読み込みと判定を行う
while ( ( characterData = fileInputSteam.read() ) != -1 ){
     //処理
}

   上記の例では、ファイルの読み込みと同時にEOF(End of File)の検出を同時に行い(fileInputSteam.read()メソッドはEOFを検出すると"-1"を返します)、Whileのループ処理がEOFに達したらループを抜けるという処理をしています。

   上記の例以外でも同様のことは実装できますが、ファイル読み込みの場合はこの方法がスマートといえるでしょう。

"="が誤って利用されている悪い例
//一見気がつきにくい
if ( isChange = true ) {
     //すべてtrueになってしまう
}

   一方、上記の例ではif文の中で"="を使ってしまい、isChangeにtrueを代入してしまっています。その結果、上記ifの判定は常にtrueとなってしまい、バグの内包につながりかねません。

   またif文での判定では、"if (isChange)"でtrueかfalseの判定が可能ですので、"isChange == true"や"isChange == false"といった書き方はすべきではありません(第5回:フォーマットに関するコーディング規約「boolean変数は既に比較済み(C_FMT014)」参照)。

   なお、この規約はJava特有のものではありません。


for文の使い分け(C_CTR004〜C_CTR006)

   forとwhileは同じことができますが、forとwhileの違いを意識して使うようにしてください。基本的に配列や数列を処理する場合やループ回数が明確なものに関してはfor文を使用してください。

   for文の括弧の中は、カウンタの宣言、ループ条件、次のカウンタを求める式の3つの条件が記述されます。これらの条件が省略できる場合はwhileで書く方がよいでしょう。

   簡単に特性をまとめますと表3のようになります。表3の特性を参考にして、whileとforの使い分けを意識するようにしてください。

  予約語
while for
単純にループさせたい場合 ×
ループ回数を把握する場合 ×
カウンタ変数を計算に利用する場合 ×
カウンタ変数のスコープ 広い 狭い
ブロック内でのカウントアップ 必要 必要なし

表3:whileとforの違い

   なお、この規約はJava特有のものではありません。


breakやcontinueは使わないほうがわかりやすい(C_CTR007)

   ループ内ではbreakやcontinueを利用して、処理を強制終了させたり、スキップさせたりすることが可能です。しかしループ内での処理の制御にbreakやcontinueを使用すると、制御構造が複雑になり可読性が低下してしまいます。

   このようなロジックの大部分は、breakやcontinueを使用せずとも記述できる場合がほとんどです。

   制御構造を単純にして可読性を向上させるために、breakやcontinueはできるだけ使用しないでください。

   なお、この規約はJava特有のものではありません。


配列をコピーするときはSystem.arraycopy()メソッドを利用する(C_CTR008)

   System.arraycopy()は配列をコピーするためのメソッドとして用意されています。配列でコピー処理を自作すると、間違いを含んだり実行速度が低下したりすることがありますので、System.arraycopy()を使うようにしてください。

   System.arraycopy()メソッドはネイティブコードにより実装されており、またコアパッケージで提供されているため、信頼性・パフォーマンスの点でも優れているといえます。

   なお、この規約はJava特有ものになります。

前のページ  1  2   3  4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


レッドフォックス株式会社 石井 宏和
著者プロフィール
レッドフォックス株式会社  石井 宏和
レッドフォックス株式会社 システムインテグレーションサービス1部所属
主に現在までJavaによるスタンドアロンアプリ・WEBアプリケーションの開発および保守に従事。現在は何故かABAPによる保守業務も担当。また日経新聞の記事感想を日課として、1年間社内で書き続けた。「綺麗なコーディングは綺麗な文章から」をモットーに、コーディング・文章センスを共に磨いている。


INDEX
第10回:制御構造に関する規約
  はじめに
if/whileの条件式で"="は利用しない(C_CTR003)
  繰り返し処理中のオブジェクトの生成は最小限にする(C_CTR009)
  if文とelse文の繰り返しやswitch文の利用はなるべく避け、オブジェクト指向の手法を利用する(C_CTR010)