かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

C#:Visual Studioを使って、コードの複雑度を測定する方法。

Visual Studioを使って、コードの複雑度を測定する方法。
ブラックボックスが多い、未知のプロジェクトに着手する時の指標に。

1.

メニューから[分析]→[コードメトリックスを計算する]を選択する。
(ソリューション単位で計測するか、プロジェクト単位で計測するかはお好みで。) f:id:kakisoft:20180725205149p:plain

2.

こんな感じで計測結果が出てくる。 f:id:kakisoft:20180725205206p:plain

パラメータ解説

保守容易性指数

0 ~ 100 で表現される。値が大きいほど保守容易性が高い。

内容
0 ~ 9 レッドゾーン
10 ~ 19 中程度
20 ~ 100 安全な範囲

※あくまで「計測結果の判定はそうなっている」というだけで、実際に保守性が高いかどうかは、エンジニア自身で確認した方がいいです。  

サイクロマティック複雑度

値が大きいほど複雑度が高い。
目標値 200以下、どれだけ複雑でも 1000以下を目標にするとよいらしい。(知人のフリーランス談)

継承の深さ

そのまんま。
値が低い方が保守性が高い事が多い。

クラス結合度

そのまんま。
値が低い方が保守性が高い事が多い。

コード行

正直、正確な数字ではないため、極端に大きくないかどうかを確認する程度でいいと思う。

また、上記の指標は▽のマークを展開していく事で、メソッド単位でチェックすることも可能です。

チェックするポイント

主観も入っていますので、参考にする場合はご留意を。

ヤバいコードの検出

サイクロマティック複雑度の高い順にソートする。(ヘッダを選択すると、ソートできる)

サイクロマティック複雑度が高くても、保守容易性指数が高かったら、マトモなコードの可能性はある。
サイクロマティック複雑度が高く、保守容易性指数が低い場合、ほぼ確実にヤバいコード。

保守容易性指数は判定が甘い(「?」というようなコードでも、高めの数字は出やすい)ので、 サイクロマティック複雑度が高いソースについては、メソッド単位での確認もしておいた方がいい。

状況によって見るポイントを変えるパラメータ

「クラス結合度」は、画面系の場合は値が大きくなりやすい。
具体的には、テキストボックスやラジオボタンが大量に配置されていると、数字が大きくなりやすい。
なので、数字が大きくても複雑度がそれほど高くない事がある。  
が、それ以外の場合で「クラス結合度」が高い場合は危険率が高め。

参考程度にする情報

継承の深さ

もちろん値が小さい方がいいんだけど、1つのファイルに複数のクラスを記述し、ユーティリティクラスの塊のような書き方をしていると、 1つ1つのクラスの深さは大したことは無くても、数字が大きくなることがある。 (継承の数は、各クラスごとの数が累計された数字となる。)

が、そうでない場合は、複雑度は高い場合が多い。 10以上はデンジャーゾーン。

クラス結合

クラス単位でみると、内包するメソッドの累計が出てくるので、メソッド単位でチェックした方がいいと思う。
20以上からは注意、30以上からは警戒、40以上はレッドゾーン(の可能性が高い)。  
 
 


(公式サイトでの説明はこちら)
https://msdn.microsoft.com/ja-jp/library/bb385914.aspx