SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
aomoriringo
   フリーソフトウェア

   コードの静的メトリクス計測ツール

   C, C++, C#, VB.NET, Java, Delphi, VB6,
    HTML
   sourceMonitorはコード解析をして、
    こんなものを表示してくれます

    ◦   コメントの割合
    ◦   ドキュメントの割合
    ◦   メソッド数/1クラス
    ◦   構文数/1メソッド
    ◦   一番複雑なメソッドの名前/行数
    ◦   Avg/Max Complexity
    ◦   Avg/Max Block Depth
   ソースコード内の線形独立な経路の数

   条件複雑度(Conditional Complexity)とも
    呼ばれる

     完全な分岐網羅ができるテストケースの数
    ≦ 循環的複雑度
    ≦ 完全な経路網羅ができるテストケースの数
   Start with 1 for a straight path through the
    routine.
   Add 1 for each of the following keywords or
    their equivalent:
    ◦ if, while, repeat, for, and, or
   Add 1 for each case in a switch statement.
Public void ProcessPages()
{
  while( nextPage != true )
  {
     if(    ( lineCount <= linePerPage )
            && (status != Status.Cancelled)
            && (morePages == true ) )
     {
            //…
     }
  }
}
Public int getValue( int param1 )
{
  int value = 0;
  if ( param1 == 0 )
  {
       value = 4;
  }
  else
  {
       value = 0;
  }
  return value;
}
Complexity   Risk Evaluation
<=10         よい構造。
             ほとんどリスクなし

11 to 20     少し複雑。
             わずかな(moderate)リスク

>30          複雑。
             構造に疑問
>50          テストが不可能
>75          いかなる変更も誤修正を生む原因を
             作る
Complexity   Risk Evaluation
<=10         よい構造。
             ほとんどリスクなし

11 to 20     少し複雑。
             わずかな(moderate)リスク

>30          複雑。
             構造に疑問
>50          テストが不可能
>75          いかなる変更も誤修正を生む原因を
             作る
   経路数が多く、テストケースもたくさん必要

   意味を理解するのに多くの経路を
    追わなければいけない

   凝集度が低い傾向にある
   あるコードがどれだけそのクラスの
    責任分担に集中しているかを示す尺度

   凝集度が高い
    ◦ コードが読みやすい
    ◦ 再利用しやすい

   凝集度が低い
    ◦ クラスのメソッド群に共通性がない
    ◦ 各メソッドが全く関係のないデータを扱う
   sourceMonitorは複雑度を解析してくれる



   複雑度はテストや保守に関わる重要な指標
    (しかも定量的)



   たまには複雑度のこと、思い出してあげてください

Weitere ähnliche Inhalte

Was ist angesagt?

ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方Yoshiki Hayama
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSourcesYuji Hato
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方kwatch
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 

Was ist angesagt? (20)

ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
HashMapとは?
HashMapとは?HashMapとは?
HashMapとは?
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方
「ウチの事業部の商品をWebサイト・アプリで目立たせて!」私だけじゃなかった! 社内政治と落としどころの見つけ方
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources5分で学ぶ差分更新とRxDataSources
5分で学ぶ差分更新とRxDataSources
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 

Mehr von aomori ringo

Distributed Systems 第10章 Distributed Object-Based Systems (後編)
Distributed Systems 第10章 Distributed Object-Based Systems (後編)Distributed Systems 第10章 Distributed Object-Based Systems (後編)
Distributed Systems 第10章 Distributed Object-Based Systems (後編)aomori ringo
 
Mathematicaでgolf
MathematicaでgolfMathematicaでgolf
Mathematicaでgolfaomori ringo
 
Mathematicaをはじめよう
MathematicaをはじめようMathematicaをはじめよう
Mathematicaをはじめようaomori ringo
 
Distributed Systems 第10章 Distributed Object-Based Systems
Distributed Systems 第10章 Distributed Object-Based SystemsDistributed Systems 第10章 Distributed Object-Based Systems
Distributed Systems 第10章 Distributed Object-Based Systemsaomori ringo
 
Distributed Systems 第1章 Introduction
Distributed Systems 第1章 IntroductionDistributed Systems 第1章 Introduction
Distributed Systems 第1章 Introductionaomori ringo
 
md5のアルゴリズム
md5のアルゴリズムmd5のアルゴリズム
md5のアルゴリズムaomori ringo
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章aomori ringo
 

Mehr von aomori ringo (7)

Distributed Systems 第10章 Distributed Object-Based Systems (後編)
Distributed Systems 第10章 Distributed Object-Based Systems (後編)Distributed Systems 第10章 Distributed Object-Based Systems (後編)
Distributed Systems 第10章 Distributed Object-Based Systems (後編)
 
Mathematicaでgolf
MathematicaでgolfMathematicaでgolf
Mathematicaでgolf
 
Mathematicaをはじめよう
MathematicaをはじめようMathematicaをはじめよう
Mathematicaをはじめよう
 
Distributed Systems 第10章 Distributed Object-Based Systems
Distributed Systems 第10章 Distributed Object-Based SystemsDistributed Systems 第10章 Distributed Object-Based Systems
Distributed Systems 第10章 Distributed Object-Based Systems
 
Distributed Systems 第1章 Introduction
Distributed Systems 第1章 IntroductionDistributed Systems 第1章 Introduction
Distributed Systems 第1章 Introduction
 
md5のアルゴリズム
md5のアルゴリズムmd5のアルゴリズム
md5のアルゴリズム
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
 

Source monitorと複雑度のはなし

  • 2. フリーソフトウェア  コードの静的メトリクス計測ツール  C, C++, C#, VB.NET, Java, Delphi, VB6, HTML
  • 3. sourceMonitorはコード解析をして、 こんなものを表示してくれます ◦ コメントの割合 ◦ ドキュメントの割合 ◦ メソッド数/1クラス ◦ 構文数/1メソッド ◦ 一番複雑なメソッドの名前/行数 ◦ Avg/Max Complexity ◦ Avg/Max Block Depth
  • 4. ソースコード内の線形独立な経路の数  条件複雑度(Conditional Complexity)とも 呼ばれる  完全な分岐網羅ができるテストケースの数 ≦ 循環的複雑度 ≦ 完全な経路網羅ができるテストケースの数
  • 5. Start with 1 for a straight path through the routine.  Add 1 for each of the following keywords or their equivalent: ◦ if, while, repeat, for, and, or  Add 1 for each case in a switch statement.
  • 6. Public void ProcessPages() { while( nextPage != true ) { if( ( lineCount <= linePerPage ) && (status != Status.Cancelled) && (morePages == true ) ) { //… } } }
  • 7. Public int getValue( int param1 ) { int value = 0; if ( param1 == 0 ) { value = 4; } else { value = 0; } return value; }
  • 8. Complexity Risk Evaluation <=10 よい構造。 ほとんどリスクなし 11 to 20 少し複雑。 わずかな(moderate)リスク >30 複雑。 構造に疑問 >50 テストが不可能 >75 いかなる変更も誤修正を生む原因を 作る
  • 9. Complexity Risk Evaluation <=10 よい構造。 ほとんどリスクなし 11 to 20 少し複雑。 わずかな(moderate)リスク >30 複雑。 構造に疑問 >50 テストが不可能 >75 いかなる変更も誤修正を生む原因を 作る
  • 10. 経路数が多く、テストケースもたくさん必要  意味を理解するのに多くの経路を 追わなければいけない  凝集度が低い傾向にある
  • 11. あるコードがどれだけそのクラスの 責任分担に集中しているかを示す尺度  凝集度が高い ◦ コードが読みやすい ◦ 再利用しやすい  凝集度が低い ◦ クラスのメソッド群に共通性がない ◦ 各メソッドが全く関係のないデータを扱う
  • 12. sourceMonitorは複雑度を解析してくれる  複雑度はテストや保守に関わる重要な指標 (しかも定量的)  たまには複雑度のこと、思い出してあげてください