最近の解析ツールはソースコードのスコアリングもしてくれますが、それってどういう基準なの? というお話をしました。
コードの静的解析ツールコードメトリクスについて
View Slide
コードを静的解析してくれるツールPHP● phpmd● phpcsRuby● RubocopJavascript● ESLint
● 一般的な規約に沿っているか● コーディングスタイルの統一導入目的
だけではない
コードのスコアリングコードの定量評価(いわゆる点数付け)もしてくれる
どういう基準で?
● Coupling● Cohesion● Size● Complexity
凝集度と結合度構造化設計
凝集度Cohesion各モジュール内の関連性を最大にすることclass A{int width;Int height;function widen(int add){width = width + add;}function highten(int add){height = height + add;}}クラスのメンバ変数は2つ2つのメソッドで使われているメンバ変数はそれぞれひとつずつ
凝集度Cohesion各モジュール内の関連性を最大にすることclass A{int width;Int height;function widen(int add){width = width + add;}function highten(int add){height = height + add;}}クラスのメンバ変数は2つ2つのメソッドで使われているメンバ変数はそれぞれひとつずつ凝集度はそれほど高くない
結合度Couplingモジュール間の関連性を最小にすることclass Square{require Rhombus;function square(rhombus = new Rhombus){return rhombus->width * rhombus->width;}}属性は・width・angleがあるが、angleがSquareの計算に必要かというと必要ない
結合度Couplingモジュール間の関連性を最小にすることclass Square{function square(rhombus_width){return rhombus_width * rhombus_width;}}属性は・width・angleがあるが、angleがSquareの計算に必要かというと必要ない結合度が下がった!
循環的複雑度簡単に言うとコードの分岐数
ifやforを使うと1ずつ増えていくforeach ($array as $key => $value ){for ($i+0; $i< $max; $++){switch($value[$i]){case 1:If ($value…)……分岐がなければ1(Best値)function good_method($array){return array_map(function($n) {return $n * $n;}, $array);}
ネストが深くなっている= 「責務を負いすぎている」という考え方
詳しくはGoogleのブログhttps://testing.googleblog.com/2011/02/this-code-is-crap.html
まとめコードの静的解析ツールはルールの統一だけでなく、コードのスコアリングもしてくれる基準となるのは・ 凝集度・ 結合度・ 循環的複雑度
注意点あくまでコードを多角的にみるためのもの指標に囚われすぎるのはよくない運用してみて、しっくりこないのであれば緩くするのもあり