Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コードの静的解析ツールを使う目的と効用

hihats
August 28, 2017

 コードの静的解析ツールを使う目的と効用

最近の解析ツールはソースコードのスコアリングもしてくれますが、それってどういう基準なの?
というお話をしました。

hihats

August 28, 2017
Tweet

More Decks by hihats

Other Decks in Technology

Transcript

  1. コードの静的解析ツール
    コードメトリクスについて

    View Slide

  2. コードを静的解析してくれるツール
    PHP
    ● phpmd
    ● phpcs
    Ruby
    ● Rubocop
    Javascript
    ● ESLint

    View Slide

  3. ● 一般的な規約に沿っているか
    ● コーディングスタイルの統一
    導入目的

    View Slide

  4. だけではない

    View Slide

  5. コードのスコアリング
    コードの定量評価(いわゆる点数付け)もしてくれる

    View Slide

  6. どういう基準で?

    View Slide

  7. ● Coupling
    ● Cohesion
    ● Size
    ● Complexity

    View Slide

  8. 凝集度と結合度
    構造化設計

    View Slide

  9. 凝集度
    Cohesion
    各モジュール内の関連性を最大に
    すること
    class A
    {
    int width;
    Int height;
    function widen(int add){
    width = width + add;
    }
    function highten(int add){
    height = height + add;
    }
    }
    クラスのメンバ変数
    は2つ
    2つのメソッドで使
    われているメンバ
    変数はそれぞれ
    ひとつずつ

    View Slide

  10. 凝集度
    Cohesion
    各モジュール内の関連性を最大に
    すること
    class A
    {
    int width;
    Int height;
    function widen(int add){
    width = width + add;
    }
    function highten(int add){
    height = height + add;
    }
    }
    クラスのメンバ変数
    は2つ
    2つのメソッドで使
    われているメンバ
    変数はそれぞれ
    ひとつずつ
    凝集度はそれほど
    高くない

    View Slide

  11. 結合度
    Coupling
    モジュール間の関連性を最小にす
    ること
    class Square
    {
    require Rhombus;
    function square(rhombus = new Rhombus){
    return rhombus->width * rhombus->width;
    }
    }
    属性は
    ・width
    ・angle
    があるが、angle
    がSquareの計算
    に必要かというと
    必要ない

    View Slide

  12. 結合度
    Coupling
    モジュール間の関連性を最小にす
    ること
    class Square
    {
    function square(rhombus_width){
    return rhombus_width * rhombus_width;
    }
    }
    属性は
    ・width
    ・angle
    があるが、angle
    がSquareの計算
    に必要かというと
    必要ない
    結合度が下がった!

    View Slide

  13. 循環的複雑度
    簡単に言うとコードの分岐数

    View Slide

  14. 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);
    }

    View Slide

  15. ネストが深くなっている
    = 「責務を負いすぎている」
    という考え方

    View Slide

  16. 詳しくはGoogleのブログ
    https://testing.googleblog.com/2011/02/this-
    code-is-crap.html

    View Slide

  17. まとめ
    コードの静的解析ツールはルールの統一だけでなく、コードのスコアリングも
    してくれる
    基準となるのは
    ・ 凝集度
    ・ 結合度
    ・ 循環的複雑度

    View Slide

  18. 注意点
    あくまでコードを多角的にみるためのもの
    指標に囚われすぎるのはよくない
    運用してみて、しっくりこないのであれば緩くするのもあり

    View Slide