C++プログラムを対象とした 複雑度メトリクス計測ツールと その評価

Download Report

Transcript C++プログラムを対象とした 複雑度メトリクス計測ツールと その評価

C++プログラムを対象とした
複雑度メトリクス計測ツールと
その評価
神谷年洋 高林修司 楠本真二 井上克郎
大阪大学 大学院基礎工学研究科
背景
ソフトウェアの大規模化・複雑化
生産性と品質の向上
↓
オブジェクト指向分析設計の適用
開発ツールの投入
page 1
品質評価によるプロセス改善
• ISO9000シリーズ・SPICE・CMMなど
– プロセスやプロダクトを計測する
– 分析によって問題点を見つけだし、改善策を立てる
– 改善策を実行する
• 計測にはさまざまなメトリクスを用いる
page 2
メトリクス
• メトリクスとは、ソフトウェアのさまざまな特性を
判別する客観的な数学的尺度である
– プロセスメトリクス・プロダクトメトリクス
• 複雑度メトリクスはエラーの発生を予測するた
めのメトリクスである
– MaCabeのサイクロマチック数・Halsteadのソフト
ウェアサイエンス
• オブジェクト指向設計を計測対象とする
Chidamberらの複雑度メトリクス
page 3
複雑度メトリクスによるエラー予測
メトリクスを用いて複雑である(エラーを含みやす
い、保守しにくい)モジュールを予測する
↓
複雑であると判断されたモジュールの再設計をす
る
レビューやテストを重点的に行う
page 4
目的
• オブジェクト指向開発を対象としてプロダクト品
質評価のためのツールを作成する
• ツールの有効性を実験的に評価する
page 5
Chidamberらの複雑度メトリクス
• オブジェクト指向設計を対象とする
– クラス間の参照関係(CBO,RFC)
– 派生関係(DIT,NOC)
– クラス内部の複雑度(WMC,LCOM)
• S. R. Chidamber and C. F. Kemerer: “A metrics suite for objectoriented design”, IEEE Trans. on Software Eng., Vol.20, No.6,
pp.476-493(1994).
• V. R. Basili, L. C. Briand, and W. L. Melo: “A validation of
object-oriented design metrics as quality indicators”, IEEE
Trans. on Software Eng., Vol. 20, No. 22, pp. 751-761 (1996).
page 6
ツールが計測するメトリクス
RFC
使用するメソッドの数
CBO
結合するクラスの数
DIT
継承木内での深さ
NOC
子クラスの数
WMC
メソッドの数
LCOM
メソッドの凝集度の欠如
NIV
SLOC
インスタンス変数の数
結合
継承
クラス内の
複雑さ
ソースコードの行数
page 7
ツール概要
• Chidamberらの複雑度メトリクスを用いたクラ
スの複雑度
– メトリクス計測機能
– メトリクスによる複雑度評価機能
• GUIによる操作
• Windows 95上で動作
page 8
ツールの入出力
• 入力:
– C++ソースコード
• 出力:
– クラス階層図
– ソースコードのブラウズ
– メトリクスによる複雑度判定
page 9
対象とするC++サブセット
• C構文
• C++構文
– 例外処理構文
– クラス/メソッド構文
– テンプレート
• 関数テンプレート(部分的に受理する)
• クラステンプレート(部分的に受理する)
page 10
ツールの画面 (クラス階層の表示)
page 11
ツールの画面(ソースコードのブラウズ)
page 12
ツールの画面 (メトリクスによる判定)
page 13
ツールの構成
ライブラリのソースコード
新規開発のソースコード
Smart
C++プログラム構造抽出部
構造データ
メトリクス分析部
ソースコード位置
データ
メトリクスデータ,
統計分析データ
グラフィックユーザーインターフェイス部
メトリクス値,統
計分析
クラス階層
ソースコード
page 14
メトリクスによる複雑度判定
(1)クラスの分類
6種類:ドキュメント、ビュー、ダイアログ、フレーム、ア
プリケーション、その他
(2)基準値の設定
分類/メトリクスごとに基準値(a, σ)を用意する
(今回は実験で収集したデータを用いた)
(3)異常値の算定
メトリクス値
0 ≦ m < a +σ
a +σ ≦ m < a + 2σ
a + 2σ ≦ m < a + 3σ
a + 3σ ≦ m
異常値
0
1
2
3
page 15
クラス分類
• ドキュメント
– アプリケーションのデータを保持する
• ビュー
– データを表示する・(メニュー等)操作を受け付ける
• ダイアログ
– 定型入力を行う・警告を出す
• フレーム
– ウィンドウの状態を管理する
• アプリケーション
– アプリケーションに関する情報(レジストリ情報等)を
管理する
• その他
page 16
実験概要
• ある企業の新人研修
• 開発するプログラムは電子メールの配送システ
ム(3000行程度)
– 5つのサブシステムからなる:SMTPサーバー、POP
サーバー、DELIVERサーバー、SMTPクライアント、
POPクライアント
• 4~5名の開発者がチームで開発を行う(一人あ
たり600行程度)
• Visual C++、MFC(Microsoft Foundation
Class)を用いる
page 17
データの収集方法
• プログラムのソースコード
– サーバーによって1時間毎に自動収集
• フォールトデータ
– フォールト報告用ツール(Efer)によって収集
• 開発作業の開始・終了時刻
– コーディング・レビュー・テスト・フォールト修正など
• 開発作業の結果
– 欠陥・フォールト
page 18
メトリクスデータ
• 被験者17人、クラス124個、フォールト84個
メトリクス
NIV
CBO
NIM
DIT
NOC
RFC
LCOM
SLOC
Ec
Et(分)
最小 最大
0
14
0
5
0
22
0
6
0
0
0
27
0 190
5 420
0
17
0 599
平均 標準偏差
4
2.67
1.39
1.59
5.73
4.86
3.44
1.41
0
0
8.23
6.81
22.42
36.84
96.43
81.01
0.57
1.93
12.68
58.94
page 19
分析:クラス分類とメトリクス
CDocument派生クラス
(サンプル数19)
CView派生クラス
(サンプル数17)
CFrameWnd派生クラス
(サンプル数17)
cbo
cbo
3
3
cbo
sloc
2
rfc
sloc
2
3
rfc
sloc
1
1
1
0
0
0
niv
wmc
dit
niv
wmc
lcom
dit
rfc
2
niv
lcom
wmc
dit
lcom
CDialog派生クラス
(サンプル数15)
CWinApp派生クラス
(サンプル数17)
その他のクラス
(サンプル数39)
cbo
cbo
cbo
3
3
3
sloc
2
rfc
2
rfc
sloc
2
1
1
1
0
0
0
niv
wmc
dit
sloc
lcom
niv
wmc
dit
lcom
rfc
niv
wmc
dit
lcom
page 20
分類CDocumentの特徴
CDocument派生クラス
(サンプル数19)
cbo
3
sloc
2
rfc
1
0
niv
wmc
dit
lcom
ドキュメントクラスは「データの
保持する」役目を持つ
• NIVが大きい。インスタンス
変数が多い
• CBOが小さい。あまり他のク
ラスの変数を参照していない
• WMCが大きい。他のクラス
にデータを操作するためのメ
ソッドを提供している
page 21
分類CViewの特徴
CViewはデータを表示し、UIを
受け持つ
CView派生クラス
(サンプル数17)
cbo
3
sloc
2
rfc
1
0
niv
wmc
dit
lcom
• CBOが大きい。他のクラスの
変数を参照している
• WMCが大きい。他のクラス
にメソッドを提供している
• LCOMが大きい。互いに関
連のない雑多な機能を凝集
している
page 22
分析:異常値とエラー
CMsgSock
CPopsDoc
CSetDlg
CPopsView
CRegistDlg
CPopsApp
CMainFrame
CMsg
CListenSock
CCCRRRWWWLLLNiNiNiSSS
CRRWLLLNiS
RWNiS
CRRL
W
CSmtpSDoc
CSmtpSView
CSmtpSApp
CMainFrame
CMsg
CMailRound
MessageSock
CMailListDlg
RWLLNiNiS
RWLLNiS
CCRRS
R
CSmtpCView
CSmtpCDoc
CSmtpCApp
CMainFrame
CMailProvDlg
MessageSock
CMsg
RWLLS
RLNiNiS
CPopCView
CPopCDoc
CLogDlg
CMainFrame
CMsg
CPopCApp
MessageSock
CRWLS
CRLNiS
CRWL
RL
Ni
1
1.25
6 168.03
R
3 135.35
1
7.72
R
CUserCtl
CCCRRRWWLLLSSS
CSMTPclientViewCRWLLNiSS
CAdressDlg
CCRRRWSS
CSMTPclientDoc CRLNiSS
CSMTPclientApp
CMAILENV
L
CUserDlg
Ni
CMainFrame
R
CSMTPSocket
CMsg
1
9.27
2
82.55
1
0.1
CMailFile
CCCRRWWLS
CIndex
CRRWNiS
CPopServerDoc CCRRS
CPopServerApp
CPassword
R
CConfig
R
CAboutDlg
CPopServerView
CMessageSock
CMainFrame
CSmtpCApp
S
CSmtpCDoc
CRL
CMainFrame
R
CMsg
CSMTPSocket
CSmtpCView
CPopCView
CCRRRWLLLSSS
CPopCDoc
CRNiS
CMainFrame
RL
CPopCApp
CMySock
Ni
CLogonDlg
CKankyouDlg
1
77.9
1
0.1
1
1
41.4
8.3
1
0.3
2
38.55
CPopSDoc
MessageSock
CPopSApp
ListenSock
CPopSView
CMainFrame
CMsg
CCCRRRWLLNiSSS
CRWS
2 255.43
CMainFrame
CDeliverApp
Mail
User
CDeliverView
CDeliverDoc
CSS
7
43.27
3 599.73
Ni
CMsg
CRWSSS
CMsgSocket
Ni
CPOPServerApp
CListenSocket
CPOPServerDoc
CMainFrame
CPOPServerView
3
1
0.62
0.68
CPopCDoc
CPopCApp
CMsg
CDialogbox
CPopCView
MessageSock
CMainFrame
RLS
CMainFrame
CCRRRWWLLLNiNiNiSSS
CMsg
WNi
CDeliverApp
CDeliverSocket
Mail
Ni
CDeliverDoc
User
CDeliverView
CMilDlg
CRWLS
CMsg
WNi
CSmtpCView
LNi
CSmtpCDoc
RL
CSmtpCApp
CSmtpSocket
CMainFrame
CAddressbookDlg
1
0.27
17
58.25
7
40.63
1
1
86.12
20.43
1
0.43
5
68.63
CSplashWnd
CSmtpCApp
CSmtpCView
CKankyo
CMainFrame
CSmtpCDoc
CSmtpCSock
CMsg
CCRRRWWLLNiS
CCRRLLSSS
CRNiS
L
CR
L
CMainFrame
CEntry
CDeliverApp
CDeliverView
CDeliverDoc
CRRWLS
RRWS
1
8
0.23
42.53
CPopCView
CPopCApp
CLogonDlg
CEnvDlg
CMainFrame
CMsg
CPopCDoc
CMySocket
CRRWLLNiNiSS
RLLSS
L
L
R
3
1.1
page 23
1
0.38
まとめ
• Chidamberらのメトリクス
• プロダクト評価ツール
– ソースコードからメトリクスを計算する
• ツールの評価実験
– クラス分類によってメトリクスの分布に差がある
– メトリクスによる複雑度判定
page 24
課題
• 多くのプロジェクトに対して、ツールの有効性を
評価する
• Chidamberらのメトリクス以外のメトリクスを計
測できるようにする
• 上流工程のCASEツールのデータを扱えるよう
にする
– Rational Rose
– Visual Modeler
page 25
C++ソース分析ツールの比較
• ツールの出力からChidamberらのメトリクスを
算出可能か
解析器
DIT
C++ 仕 様 書 ○
工 房 V1.0
L10
C++ doctor ○
ver. 2.0
Hotdoc for ○
VC++ 5.0 β
Rational
Rose
NOC WMC LCOM RFC
○
○
○
○
○
○
×
×
○
○
×
×
CBO 備考
○ テンプレートクラスに関して
は参照関係の解析は行わ
れない。
×
× 関数とメソッドを異なった方
法で分析する。ただし、評価
したのはβ版なので、製品
版では異なるかもしれない。
Rational Roseで設計し、生
成したC++ソースのみ解析
する。
page 26