Declaration

概要

変数,メソッド,クラス等の適切な宣言を行っている際に獲得できる実績です. 一貫性を持った宣言や処理を行うことによって,わかりやすく変更しやすいコードとなります.

タイトル
Talk the talk

この実績には,以下の7つのルールが含まれます:

  • FieldDeclarationShouldBeAtStartOfClass
  • MissingOverride
  • ModifiedContriolVariable
  • OneStatementPerLine
  • OuterTypeFilename
  • SingularField
  • StringInstantiation

FieldDeclarationShouldBeAtStartOfClass

フィールドはクラスの一番最初で宣言することが好ましいです. 一番最初とは,メソッド宣言,コンストラクタ,初期化子,内部クラスの前に宣言することを意味します.

コード例

public class Foo {

  // メソッド宣言の前にフィールド宣言がなされています
  // 適切な記述です
  private String _thing;

  public String getMessage() {
    return "Hello World!";
  }

  // !!! メソッド宣言の後にフィールド宣言がなされています
  private String _fieldInWrongLocation;
}

このルールのチェックには,PMDの FieldDeclarationShouldBeAtStartOfClass を用いています.

MissingOverride

オーバーライドされたメソッドに @override アノテーションをつけることで,コンパイル時に本当にオーバーライドされたメソッドなのか確認され, 意図が明確になり,リファクタリングを行うのに役立ちます.

コード例

public class Foo implements Runnable {
  // !!! このメソッドはオーバーライドされています
  // `@Override` アノテーションをつけるべきです
  public void run() {
    doSomething();
  }
}

このルールのチェックには,PMDの MissingOverride を用いています.

注釈

Javaには, アノテーション ( Annotation )という機能があります.アノテーションとは注釈という意味で,単なるコメントではなく, 決まった形式のアノテーションを記述することでプログラムの警告を抑制したり,メッセージを表示したりすることができます.また,自作のアノテーションを用いることもできます.

主なアノテーションとして,以下のようなものがあります:

  • @Override
    そのメソッドがスーパークラスのメソッドをオーバーライドしていることを示す
  • @Deprecated
    対象となるクラスやメソッドが非推奨であることを情報として付加する
  • @SuppressWarnings
    引数で指定した特定の警告メッセージをJavaコンパイラに与えず無視する

参考文献: アノテーション - Wikipedia

ModifiedContriolVariable

ループ内でカウンタ変数が変更されていないかをチェックします. カウンタ変数がループ内で変更された場合,プログラムの流れを追いにくくなります.

コード例

for (int i = 0; i < 10; i++) {
  i++; // !!! カウンタ変数 i が変更されています
}

このルールのチェックには,Checkstyleの ModifiedContriolVariable を用いています.

OneStatementPerLine

Javaでは同一の行にいくつかの変数を宣言したり文を記述したりすることが許されていますが, 複数の文を記述するとコードが読みにくく複雑になります. 一つの行で一つの文が記述されているかをチェックします.

コード例

String name;            // 一つの行で一つの変数が宣言されています
String lastname;        // 適切な記述です

String name, lastname;  // !!! 同一の行で2つの変数が宣言されています

String name,            // 一つの行で一つの変数が宣言されています
       lastname;        // 適切な記述です

// !!! 同一の行で2つの import 文が宣言されています
import java.io.EOFException; import java.io.BufferedReader;

var1++; var2++;         // !!! 同一の行で2つの文が記述されています

このルールのチェックには,Checkstyleの OneStatementPerLine を用いています.

OuterTypeFilename

Javaでは,慣習的にクラス名とファイル名を一致させます.このルールでは,クラス名とファイル名が一致しているかチェックします. 例えば, Foo クラスは Foo.java というファイルに位置している必要があります.

このルールのチェックには,Checkstyleの OuterTypeFilename を用いています.

SingularField

一つのメソッドだけにスコープが限られているフィールドは,そのメソッド内のローカル変数として宣言するのが好ましいです.

コード例

public class Foo {
  private int x; // !!! メソッド bar 内で宣言する方が好ましい
  public void bar(int y) {
    // int x;
    x = y + 5;
    return x;
  }
}

このルールのチェックには,PMDの SingularField を用いています.

StringInstantiation

String オブジェクトをインスタンス化する必要はありません.

コード例

// !!! `String bar = "bar";`で十分です
String bar = new String("bar");

このルールのチェックには,PMDの StringInstantiation を用いています.