PMD JavaScript Rules (ver 7.0.0-rc4)- Best Practices

PMDバージョン: 7.0.0-rc4

Best Practices

AvoidWithStatement

公式ドキュメント: AvoidWithStatement

Since: PMD 5.0.1

Priority: High (1)

Description:

withの使用を避けるべきである。

Configuration:

<rule ref="category/ecmascript/bestpractices.xml/AvoidWithStatement" />

Example:

with (object) {
  property = 3; // オブジェクトなのかwindowなのか判断つかないのであまり良くない
}

ConsistentReturn

公式ドキュメント: ConsistentReturn

Since: PMD 5.0

Priority: Medium High (2)

Description:

ECMAScript は関数の戻り値の型を提供しており、その使用方法について確固たるルールはない。
しかし、関数がreturnを使用する場合、それらはすべて値を返却するか、または値を返却しないかのどちらかに統一されているのが望ましい。
リターンの使い方がまちまちなのは、おそらくバグか、よく言えばスタイルが悪いと考えられる。

Configuration:

<rule ref="category/ecmascript/bestpractices.xml/ConsistentReturn" />

Example:

// OK
function foo() {
  if (condition1) {
    return true;
  }
  return false;
}

// NG
// 1つの関数内で、値をreturnしている箇所と、そうでない箇所が混在している
function bar() {
  if (condition1) {
    return;
  }
  return false;
}

GlobalVariable

公式ドキュメント: GlobalVariable

Since: PMD 5.0

Priority: High (1)

Description:

このルールは、varの宣言がないために、誤ってグローバル変数を使用してしまうことを防ぐのに役立つ。
グローバル変数は、デバッグが困難な副作用を引き起こす可能性がある。

Configuration:

<rule ref="category/ecmascript/bestpractices.xml/GlobalVariable"/>

Example:

function(arg) {
  // NG
  // グローバル変数なので、このルールで検出される
  notDeclaredVariable = 1;

  // OK ローカル変数
  var someVar = 1;

  // OK
  // これはグローバル変数だが、windowはグローバル変数の利用が想定されているものなので
  // このルールでは検出されない
  window.otherGlobal = 2;
}

ScopeForInVariable

公式ドキュメント: ScopeForInVariable

Since: PMD 5.0

Priority: High (1)

Description:

for-inループのループ変数の変数名が var キーワードで明示的に宣言されていない場合、ループ処理前に宣言されている、関数内の最も近い同名の変数を参照することができます。

この場合、for-inの内部の処理が実行されるときに、変数の値が変更された場合、外側のスコープにある変数の既存の値が上書きされる。
for-inループ処理が終了すると、その変数にはfor-inで最後に使われた値が格納され、for-inループ処理前に代入されていた値は消えてしまう。

for-inのループ変数はループ内のみで使用される一時的なものである可能性が高いので、varで新しく変数定義をするか、関数内で使用している変数名を使用しないようにするのが望ましい。

Configuration:

<rule ref="category/ecmascript/bestpractices.xml/ScopeForInVariable" />

Example:

// OK
function foo() {
  var p = 'clean';
  function() {
    var obj = { dirty: 'dirty' };
    for (var p in obj) { //  'var' を使用して変数宣言する
      obj[p] = obj[p];
    }
    return x;
  }();

  // 'p'の値はまだ'clean'
}

// NG
function bar() {
  var p = 'clean';
  function() {
    var obj = { dirty: 'dirty' };
    for (p in obj) {
      obj[p] = obj[p];
    }
    return x;
  }();

  // p'はゴミとなり、'dirty'の値を持つ
}

UseBaseWithParseInt

公式ドキュメント: UseBaseWithParseInt

Since: PMD 5.0.1

Priority: High (1)

Description:

このルールは、parseInt の使用法をチェックする。
第2パラメータはオプションで基数を指定することができ、10がデフォルトだが、基数の指定を省略した場合、実装によっては異なる挙動を示す可能性がある。
また、基数を指定すると可読性も向上するため、このルールではparseInt 使用箇所で基数が指定されていることを検証している。

Configuration:

<rule ref="category/ecmascript/bestpractices.xml/UseBaseWithParseInt" />

Example:

// NG
// 基数が明示的に指定されていないため、10とも7とも解釈されうる
parseInt("010");    
// OK
parseInt("10", 10); 

PMD 7.0のルールについて、以下の記事も書いています。

HTML Rule:

olafnosuke.hatenablog.com

JavaScript Rule - Code Style:

olafnosuke.hatenablog.com

JavaScript Rule - Error Prone:

olafnosuke.hatenablog.com