phpmd使ってて警告でてきたら素直に従うのがベターなんですが、いやそこはどうしようもないんだよってときに doc commentで @SuppressWarnings
を記述してやると警告を抑止できます。
で、わりとよく使うヤツを毎回ぐぐって書いてるのでφ(.. )しときます。
Avoid really long methods(メソッド行数ながすぎー)
テストのdataProvidorとか何かの対応表配列とかはどうしても長くなりがちです。
設定ファイルに切り出すとかっていう手もあるけど、それを必用とするところの近くにある方が、あちこち探さなくて済むのでそのまま連想配列を列挙しておきたいことが多いです。
上記のようは対応表の様な配列を返す以外では適切に分割してます。
抑止方法
/**
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
Consider to rebalance this class hierarchy to keep number of children under 15(子だくさんすぎー)
同じ親クラスをもつサブクラスが多すぎってやつですね。
基底クラスに対してタイプ別にサブクラスをつくって…ってやってると割と発生します。
CakePHP2だとテーブル増えてくると同じ AppModel を継承したモデルクラスが各テーブルごとにできるので、気が付いたら突破ってこともあります。
これはどうするのがベターなのかな。継承したサブクラスにしないで共通項を別クラスに抜き出して別クラスに委譲するようにして各クラスは独立させた方がいいってことなのかな?
抑止方法
/**
* @SuppressWarnings(PHPMD.NumberOfChildren)
*/
Avoid unused private method(使ってないプライベートメソッドあるよ)
コールバック等での呼び出されているプライベートメソッドがあると、実際には使われているのにこの警告がでます。
たとえば次のようなコードだと __formatJa()
, __formatEn()
は使われてるのにunusedっていわれちゃいます。
public funtion formatName($familyName, $givenName, $langCode) {
$method = '__format' . ucfirst($langCode);
if (method_exists($this, $method)) {
return call_user_func([$this, $method], $familyName, $givenName);
}
}
private function __formatJa($familyName, $givenName) {
return $familyName . ' ' . $givenName;
}
private function __formatEa($familyName, $givenName) {
return $givenName . ' ' . $familyName;
}
抑止方法
/**
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
*/
呼び出し元で@uses宣言も追加しとくとよいです。下記の様な感じ。
/**
* @uses self::__formatJa, self::__formatEn
*/
public funtion formatName($familyName, $givenName, $langCode) {
$method = '__format' . ucfirst($langCode);
if (method_exists($this, $method)) {
return call_user_func([$this, $method], $familyName, $givenName);
}
}
/**
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
*/
private function __formatJa($familyName, $givenName) {
return $familyName . ' ' . $givenName;
}
/**
* @SuppressWarnings(PHPMD.UnusedPrivateMethod)
*/
private function __formatEa($familyName, $givenName) {
return $givenName . ' ' . $familyName;
}
The method xxx has a boolean flag argument $yyy, which is a certain sing of a Single Responsibility Principle violation.(Booleanフラグのあるメソッドは単一責務になってないよー)
下記の様なコードですね。
public function afterFind($results, $primary = false){
// after find処理
}
ほんとは複数のメソッドに分けるのが正解。
ただCakePHP2のコールバックメソッドじゃそうもいかないんで、そんなときは抑止します。
抑止方法
/**
* @SuppressWarnings(PHPMD.BooleanArgumentFlag)
*/