Unused / Useless / Unnecessary

概要

コード中に使用していない要素や不必要な要素が存在しない際に獲得できる実績です. プログラムの流れに影響しないこれらの要素を削除することによって,コード行数が削減でき,可読性が上がるほか,バグの温床となることを防ぎます.

タイトル
Beating the air

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

  • UnnecessaryLocalBeforeReturn
  • UnnecessaryReturn
  • UnusedFormalParameter
  • UnusedImports
  • UnusedLocalVariable
  • UnusedPrivateField
  • UnusedPrivateMethod
  • UselessParentheses

UnnecessaryLocalBeforeReturn

return 文の直前で不必要なローカル変数を宣言することは避けましょう.

コード例

public class Foo {
  public int foo() {
    int x = doSomething();
    return x;  // !!! 'return doSomething();' で十分です.
  }
}

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

UnnecessaryReturn

不必要な return 文を記述することは避けましょう.

コード例

public class Foo {
  public void bar() {
      int x = 42;
      return; // !!! この 'return;' は必要ありません.
  }
}

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

UnusedFormalParameter

メソッドやコンストラクタに不必要なパラメータを渡すことは避けましょう.

コード例

public class Foo {
  private void bar(String hoge) {
    doSomething();
    return;
    // !!! hoge は使われていません
  }
}

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

UnusedImports

不必要なインポート文を記述することは避けましょう.

コード例

import java.io.File;  // !!! File クラスが必要ない場合は削除しましょう

public class Foo {
  private void bar() {
    doSomething();
    return;
  }
}

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

UnusedLocalVariable

不必要なローカル変数を宣言したり,代入したりすることは避けましょう.

コード例

public class Foo {
  public void bar() {
    int i = 5; // !!! i は使用されていません.削除しましょう.
    doSomething();
    return
  }
}

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

UnusedPrivateField

不必要なプライベート変数(メンバ変数)を宣言したり,代入したりすることは避けましょう.

コード例

public class Something {
  private static int FOO = 2; // !!! FOO は使用されていません.削除しましょう.
  private int i = 5;          // !!! i は使用されていません.削除しましょう.
  private int j = 6;
  public int addOne() {
      return j++;
  }
}

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

UnusedPrivateMethod

不必要なプライベートメソッドを宣言することは避けましょう.

コード例

public class Something {
  private void foo() {} // !!! foo は使用されていません.削除しましょう.
}

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

ちなみに

この実績では プライベート変数プライベートメソッドローカル変数メンバ変数 など,様々な種類の変数やメソッドについて触れられています.整理してみましょう.

プライベート{変数, メソッド}:
private 宣言されている変数やメソッドのこと.これらの変数やメソッドは同一クラス内からしか参照できない.
ローカル変数:
メソッド内で宣言され,そのメソッドに属する変数のこと.そのメソッド内だけで使用することができ,別のメソッドに属するローカル変数とは同名であっても別のものになる.
メンバ変数:
クラス内で宣言され,そのクラスに属する変数のこと.そのオブジェクトの属性を定義したものとも言える. クラスに属するため, private 宣言するのが一般的. なお,同じようにクラス内で宣言され,そのクラスに属するメソッドのことを メンバメソッド という.

UselessParentheses

不必要な括弧を使用することは避けましょう.

コード例

public class Foo {

  private int _bar1;
  private Integer _bar2;

  public void setBar(int n) {
      // !!! _bar1 = Integer.valueOf(n) で十分です.
      _bar1 = Integer.valueOf((n));

      // !!! _bar2 = n で十分です.
      _bar2 = (n);
  }
}

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

ちなみに

クラスのメンバ変数を宣言する際には,通常のローカル変数とは異なることを示すために,変数の接頭に m_ あるいは _ をつけることがあります. 上記の例では, _bar1_bar2 がそれに該当し,メンバ変数であることがわかりやすくなっています.

この記法は ハンガリアン記法 と呼ばれ,変数名やクラス名などに特別な接頭文字ないし接尾文字をつけることで,他の人がそれを見たときにスコープなどが分かるようになります.

一例:

文字 意味 使用例
b または f 論理型 bDirtyFlag
ch 文字型 chSeparator
n または i 整数型 nPower
fp または f 単精度浮動小数点型 fpPrice
db または d 倍精度浮動小数点型 dPi
p または lp ポインタ型 lpDirectSound
s 文字列型 sPlayerName
g_ グローバル変数 g_iErrorCode
c_ 定数 c_nBufferSize
s_ 静的変数 s_pLookupTable
m_ メンバ変数 m_nLength
C クラス CHoge

参考文献: ハンガリアン記法 - Wikipedia