5.1.4 「情報フロー複雑度メトリク
ス」 ~
5.4 「まとめ」
担当:なの
情報フロー複雑度 ( IFC : Information Flow
Complexity )
モジュールに入力/出力する「制御」や「データ」の量が多いと 設計における凝集度が減る
複雑度が増す
モジュール
データ
データ
ファンイン ファンアウト
長さ: LOC
制御の流れ(ローカルフロー)
データ 複数機能? 情報転送量
多い?が 機能が複雑?
情報フロー複雑度 ( IFC : Information Flow
Complexity )
IFC = (ファンイン × ファンアウト)2 重み付きIFC = IFC × 長さ
ファンイン = 入力ローカルフロー数+読み出すデータ数 ファンアウト = 出力ローカルフロー数+書き出すデータ数
IFC = {(2+1) × (1+ 2)}2 = 81
重み付きIFC = 81 × 100
= 8100
長さ=100LO C
情報フロー複雑度 ( IFC : Information Flow
Complexity )
読み出すデータ
(3コ)
書き出すデータ(1
出力ローカルフロー(0 コ)
入力ローカルフロー(?
?コ)
これってカウントする 意味あるの?
システムの保守性指標 ( MI : Maintainability
Index )
保守性を向上/低下させているかどうか決定できる 複合メトリクス
コード行数 LOC
ハルステッドのメトリ V(大きさ)クス
サイクロマティック複 V (g)雑度
コメント行の割合
システムの保守性指標 ( MI : Maintainability
Index )
MI = 171
ー 5.2ln(aV) ー 0.23aV(g’)
ー 16.2ln(aLOC)
+ 50sin[(2.4 × perCM)1/2]
aV モジュール毎のハルステッドメトリクスの大きさVの平均 aV(g‘) モジュール毎の拡張サイクロマティック複雑度の平均
aLOC モジュール毎のコード行数の平均
perCM モジュール毎のコメント行の割合の平均 85
65 0
MI 高い保守性
適度の保守性 保守が困難
システムの保守性指標 ( MI : Maintainability
Index )
MI = 171
- 5.2ln( 147 ) - 0.23 × 4
- 16.2ln( 17 )
+ 50sin[(2.4 × 0.2 4 )1/2] = 133
ハルステッドメトリクスの 大きさ
サイクロマティッ拡張 複雑度ク
コード行数
コメント率
アグレスティ - カード - グラスのシステム複雑度
システム複雑度の総計:Ct = St + Dt
モジュール間複雑度 の総計
モジュール内複雑度 の総計
アグレスティ - カード - グラスのシステム複雑度
モジュール間複雑度の総計:St = Σ (f(i))2
モジュール内複雑度の総計:Dt = Σ
f(i):モジュールiのファンアウト(ローカルフロー数のみ) V(i):モジュールiの内部変数の数
情報フロー複雑度
V(i) f(i)+1
V(i) f(i)+1
ファンアウ ト
内部変数が増える
→ 内部的に複雑になる
下位モジュールに機能をまかせ
→ 内部的に単純になるる
アグレスティ - カード - グラスのシステム複雑度
相対的システム複雑度
(RSC:Relative System Complexity) RSC = St / n + Dt / n’
n :システム内のモジュール数
n’:システム内の新しいモジュール数
新しいモジュールが多い と、モジュール内複雑度
の影響が小さくなる
システム全体の規模にかかわらず システムの複雑度を比較できる
モジュール毎の複雑度の平均
設計の良さの指標とすることで
データが少ない&古いので 独自の標準値を確立する
必要がある
オブジェクト指向設計メトリクス
~ Chaidamber と Kemerer のメトリクス( CK メトリクス)~
データ駆動設計機能設計 オブジェクト指向設計
クラスA
クラスB
クラスC
クラスD
クラスE
オブジェク により構造ト
化
オブジェクト のカプセル化 手続き、モジュー
により構造化ル
オブジェクト指向設計と実装の 複雑性を示すメトリクスが必要
異なる
+ メソッド3() + メソッド2() + メソッド1() - プロパティ2 - プロパティ1 クラスB
オブジェクト指向設計メトリクス
~ Chaidamber と Kemerer のメトリクス( CK メトリクス)~
WMC : Weighted Methods per Class
6つのメトリクス
クラス毎の重みづけされたメソッ ド数
重み1 重み2 重み1
WMC =
4 クラスA
クラスB
クラスC
クラスD
クラスE
DIT : Depth of Inheritance Tree
継承ツリーの深さ
DIT = 1
スーパークラス
サブクラス
クラスが大きすぎないか
? 設計が複雑?
再利用性が高い?
オブジェクト指向設計メトリクス
~ Chaidamber と Kemerer のメトリクス( CK メトリクス)~ 6つのメトリクス
NOC : Number of Children
クラスA
クラスB
クラスC
クラスD
クラスE
継承上の子の数
NOC = 2
親クラスの抽象化が弱い 再利用性が高い??
CBO : Coupling Between Object Classes
オブジェクトクラス間の結 合度
クラスA
クラスB
クラスC
クラスD
クラスE
CBO = 2
他のクラスに依存している 複雑??
保守性/再利用性が低い?
【インスタンスA1】変数1 を取得
【インスタンスA1】 メソッド8
【インスタンスD1】変数3 を取得
【インスタンスD1】 メソッド4
【インスタンスD1】 メソッド5
+ メソッド3() + メソッド2() + メソッド1() - プロパティ2 - プロパティ1 クラスB
オブジェクト指向設計メトリクス
~ Chaidamber と Kemerer のメトリクス( CK メトリクス)~ 6つのメトリクス
RFC : Response for Class LCOM : Lack of Cohesion of Methods
クラスの応答 メソッドの凝集性欠如
: クラスD : クラスB
: クラスA
メソッド1()
メソッド8()
メソッド5() メソッド4()
メソッド 1 の PFC = 3
テストが必要複雑?
メソッド 1 の
LCOM = 2
複雑? メソッ
設計が困難?
オブジェクト指向設計メトリクス
~ Chaidamber と Kemerer のメトリクス( CK メトリクス)~
オブジェクト指向設計メトリクスは発展途上
利用の方法について組織内で十分に定義されている必要がある
(一例)NASAのローゼンバーグのガイドライン
以下基準の「少なくとも2つ」を満たしているクラスは注意!! ・RFC > 100
・CBO > 5
・RFC > クラス内のメソッド数の5倍 ・WMC > 100
・メソッド数 > 40
RFC
CBO
WMC
概念的複雑性
理解する上での難しさ
どっちが難しい
?
微分積分学 代数学
割り込み処理 給与計算
階乗ルーチン 1 階乗ルーチン 2
より心理的なも の
特定のメトリ がないクス
設計や実装の比較検討
計算複雑性
実行中の計算の複雑性 計算時間
(命令数) 計算に使用する空
(ディスクやメモ間 リ)
どっちが計算として複雑
階乗ルーチン 1 ? 階乗ルーチン 2
スタックメ
モリ 再帰的に実行する度に 使用
“ n”によって サイズが変化
スタックメ
モリ 固定サイズ を使用
効率性について設計、実装を評価
本文中のコトバ
~106ページ~
「誰かが書いたコードを保守することは、新しいコードを書くこと よりも難しい。では、私たちがコードを書くのがとても得意なら、 誰が私たちのコードを保守してくれるのか?」
Bell Labs
~107ページ~
「設計の複雑性は、頭の中で同時に保たなければいけないアイデアの 数、それぞれのアイデアの持続時間、そしてそれらの2つの事柄の外 積に相互作用の重要度をかけあわせたものを変数とする関数である」 B.Colwell