phpmd controversial警告の解説

controversial

This ruleset contains a collection of controversial rules.

意見の別れるルール集。

キャメルケース警告は、クラス名、メンバー変数名、メソッド名、引数名、ローカル変数名の第5弾まであります。

議論に巻き込まれないようにしましょう。

キャメルケースって単語が4つも並ぶと単語の区切りがわかりにくいよね

そう思わない人もいるから、意見が別れるのよ。

Superglobals

メッセージ例

xx accesses the super-global variable yy.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.Superglobals)
 */Code language: PHP (php)

説明

Accessing a super-global variable directly is considered a bad practice.
These variables should be encapsulated in objects that are provided by a framework, for instance.


スーパーグローバル変数($_GET、$_POSTなど)に直接アクセスすることは、バッドプロクティス。
(フレームワークがスーパーグローバル変数をカプセル化しているように)スーパーグローバル変数はカプセル化したほうがいいよ。

コード例

class Foo
{
    public function bar()
    {
        $name = $_POST['foo'];
    }
}Code language: PHP (php)

解説

PHPが用意してくれるスーパーグローバル変数も「グローバル変数」。グローバル変数に依存しないように、ということでしょうか。

$_POSTなどに直接アクセスしていると、テストケースを作るとき、少しだけ面倒です。

テストケースでは、$_POST['foo']に値を設定して、bar()メソッドを呼び出します。他のテストケースに影響がないように、$_POST['foo']を元の状態に戻さなければなりません。

class FooTest extends TestCase
{
    private postvarsBackup();

    /**
     * @before
     */
    public function setUp()
    {
        $this>postvarsBackup = $_POST;
    }

    /**
     * @after
     */
    public function tearDown()
    {
        $_POST = $this>postvarsBackup
    }

    /**
     * @test
     */
    public function bar() {
        $_POST['foo'] = 'test value';
        $this->bar();
    }
}Code language: PHP (php)

そこで、メソッドの引数(またはコンスタクタで)で$_POSTを渡すようにします。テストケースでは$_POSTではなく、ローカル変数$varsに必要なデータを設定することで、barメソッドを呼び出せるようになりました。

class Foo
{
    public function bar($postVars)
    {
        $name = $postVars['foo'];
    }
}

class FooTest  extends TestCase
{
    /**
     * @test
     */
    public function bar()
    {
        $vars = [
            'foo' => 'test value';
        ];
        $this->bar($vars);
    }
}Code language: PHP (php)

PHPのキーバリュー型配列は、キーがないとUndefined Index Noticeが発生します。そのため、isset()やarray_key_exists()でキーの存在確認が必要で、コードが煩雑になりがちです。

1行だけなら気になりませんが、このような行が10行も20行も並んでいるのを見たことがありますよね。

class Foo
{
    public function bar()
    {
        $name = isset($_POST['foo']) ? $_POST['foo'] : '';
    }
}Code language: PHP (php)

そこで、$_POSTをくるむMyMapクラスを用意して、MyMapを介してアクセスするようにします。

class MyMap
{
    public function get($key, $defaultValue = '')
    {
    }
    public function exists($key)
    {
    }
    public function set($key, $value)
    {
    }
}

class Foo {
    public function bar($myMapPost)
    {
        $name = $this->myMapPost->get('foo');
    }
}

$foo->bar(new MyMap($_POST));Code language: PHP (php)

しかし、このMyMapクラス、undefined index防止しか付加価値を追加していません。それだけのために、existsメソッドやsetメソッドを用意したり、MyMapクラスに依存関係ができてしまうのは、ちょっとムダな感じがします。

$_POSTをくるむクラスを作るなら、汎用的なクラスではなく、そのページごとに固有の入力パラメータを集約した、例えばMyFormInputParamsクラスを作っておき、その後のissetチェックを不要にしたほうがいいかもしれません。

また、undefined index防止だけなら、ヘルパー関数を用意するだけでもいいでしょう。

class ArrayHelper
{
    public static function get($vars, $key, $defaultValue = '')
    {
        return isset($vars[$key]) ? $vars[$key] : $defaultValue;
    }
}

class Foo
{
    public function bar($postVars)
    {
        $name = ArrayHelper::get($postVars, 'foo');
    }
}

$foo->bar(new MyMap($_POST));Code language: PHP (php)

面倒だから、直接$_POSTアクセスしちゃおうっと😜

リファクタ例

CamelCaseClassName

メッセージ例

The class xx is not named in CamelCase.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.CamelCaseClassName)
 */Code language: PHP (php)

説明

It is considered best practice to use the CamelCase notation to name classes.

クラス名がパスカルケースになっていないよ(1文字目が大文字のキャメルケース)

解説

キャメルケース警告の第1弾。

CamelCasePropertyName

メッセージ例

The property xx is not named in camelCase.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.CamelCasePropertyName)
 */Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name attributes.

メンバー変数がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第2弾

CamelCaseMethodName

メッセージ例

The method xx is not named in camelCase.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.CamelCaseMethodName)
 */Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name methods.

メソッド名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第3弾

CamelCaseParameterName

メッセージ例

The parameter xx is not named in camelCase.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.CamelCaseParameterName)
 */Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name parameters.

引数名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第4弾

CamelCaseVariableName

メッセージ例

The variable xx is not named in camelCase.Code language: plaintext (plaintext)

抑止方法

/**
 *
 * @SuppressWarnings(PHPMD.CamelCaseVariableName)
 */Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name variables.

ローカル変数名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第5弾

タイトルとURLをコピーしました