第7回:変数に関するコーディング規約 (4/4)

Javaコーディング規約
Javaコーディング規約

第7回:変数に関するコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、藤村 浩士   2005/11/4
前のページ  1  2  3  4
クラス変数

   クラス変数の取り扱いにも規約があります。クラス変数を使う場合には以下規約を参考にしてください。
public static final宣言した配列を利用しない(C_CVL001)

   final宣言を行った配列の要素は変更できないと思われがちですが、finalで宣言していても不変なのは配列のインスタンスだけであり、配列の要素は変更できてしまいます。

悪い例
public class BadSample {
     public static final int[] SAMPLE_ARRAY = { 0, 1, 2, 3 };

     public void sample() {
          SAMPLE_ARRAY[0] = 1; //値を変えられる
     }
}
   保持している要素を変えられたくない場合、以下のようにCollectionsクラスのunmodifiableList()メソッドなどを使用して、読み取り専用のコレクションを生成してください。このようにすることで、IMMUTABLE_ARRAYに対してsetメソッドやaddメソッドが呼び出されるとUnsupportedOperationExceptionがスローされ、要素の変更や追加ができなくなります。

良い例
public class FixedSample {
     private static final Integer[] SAMPLE_ARRAY
          = { new Integer(0), new Integer(1), new Integer(2), new Integer(3) };

     public static final List IMMUTABLE_ARRAY
          = Collections.unmodifiableList(Arrays.asList(SAMPLE_ARRAY));
}
クラス変数にはクラス名を使用してアクセス(C_CVL002)

   インスタンス変数はそれぞれのインスタンスごとに1つずつ生成されるのに対して、クラス変数はクラスごとに1つ生成されます。したがって、クラス変数使用の際にはインスタンス変数名を用いるのではなく、クラス名を用いるようにしてください。これにより、変数の意味が明確になり読みやすくなります。


ローカル変数

   ローカル変数を使う場合、どこでその変数を使うのかが一目でわかるような場所で定義してください。無闇に使いまわしたりスコープが大きくなりすぎたりしては、可読性を低下させるだけではなく、変数名が決めづらくなります。


ローカル変数は利用する直前で宣言する(C_LVL001)

   ローカル変数を宣言する場所と使用する場所が離れていると、スコープが必要以上に広くなってしまいます。このため、うっかりして予定外の場所で値を変更してしまったり、どこでも使われない変数が宣言されたまま残ってしまったり、変数の型を確認するためにメソッドの先頭にいちいち戻らなくてはならないなど、保守性と可読性が低下します。

   したがって、ローカル変数はそれを利用する直前で宣言し、変数のスコープ(その変数が有効な範囲)を最小限に留めてください。

悪い例
public class BadSample {
     public void sample() {
          int localValue1 = 10;
          int localValue2 = 20;
          int localValue3 = 30;

          TestClass test = new TestClass();

          test.sampleMethod1(localValue1);

          //...           test.sampleMethod2(localValue2);

          //...           test.sampleMethod3(localValue3);

          //...
     }
}

良い例
public class FixedSample {
     public void sample() {
          TestClass test = new TestClass();

          int localValue1 = 10;
          test.sampleMethod1(localValue1);
          //...
          int localValue2 = 20;
          test.sampleMethod2(localValue2);
          //...
          int localValue3 = 30;
          test.sampleMethod3(localValue3);
          //...
     }
}
ローカル変数は安易に再利用しない(C_LVL002)

   一度宣言したローカル変数を複数の目的で安易に使いまわしてしまうと、何の目的のためにその変数が使われているのかわからなくなるだけではなく、変数の値を変更したことによる影響がいろいろな箇所におよぶため保守性も悪くなります。

   したがって、ローカル変数は役割ごとに役割を反映した名前で宣言して初期化してください。

   なお、以前使った変数を使いまわしたくなってしまう現象は、そのメソッドに記述されたロジックが長いために、途中で適切な変数名を使い切ってしまった時によく起こります。そのようなときは、迷わず論理的なかたまりで別メソッドに抽出するリファクタリングを実行すべきです。別メソッドになることで変数名の衝突が回避され、使いたかった変数名を使えるようになります。


まとめ

   今回は、コーディング規約の変数全般/インスタンス変数/クラス変数/ローカル変数について説明してきました。

   これらの規約の中には、プログラムの意図が明確に伝わるようになって可読性が向上するもの、変数のスコープが最小限になって保守性の向上するもの、カプセル化が徹底されてオブジェクトの堅牢性が向上するものなど、効果が高い規約がたくさんあります。Java初心者の方にとって最初からこれらの規約に準拠したソースコードを書くのは難しいと思いますが、経験を積むにつれて、意識しなくても自然と準拠したソースコードを書けるようになってくるはずです。

   ぜひ、これらの規約を守ることで、可読性、保守性、堅牢性が高いソースコードを書くことを目指してください。

前のページ  1  2  3  4


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


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


株式会社電通国際情報サービス 藤村浩士
著者プロフィール
株式会社電通国際情報サービス  藤村 浩士
株式会社電通国際情報サービス アウトソーシング事業部所属
Java(J2EE)に関わる研究開発やプロジェクト支援の経験を経て、現在は、大手企業の業務会計システムの開発プロジェクトに従事。開発の傍らで、プロジェクトの「見える化」にも関心があり、オープンソースを組み合わせて「見える化」の実現に勤しんでいる。


INDEX
第7回:変数に関するコーディング規約
  はじめに
  リテラルは使用しない(C_VAL002)
  インスタンス変数
クラス変数
Javaコーディング規約
第1回 良いコードとは、心得5ヶ条
第2回 コーディングレベルを上げるためには?
第3回 ネーミング規約(前編)
第4回 ネーミング規約(後編)
第5回 フォーマットに関するコーディング規約
第6回 オブジェクト指向のためのコーディング規約
第7回 変数に関するコーディング規約
第8回 文字操作・数値・日付に関するコーディング規約
第9回 継承とインスタンスに関わるコーディング規約
第10回 制御構造に関する規約
第11回 コレクション・ストリーム・例外に関するコーディング規約
第12回 スレッド・ガベージコレクションに関するコーディング規約

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored