第 4 章 ソフトウェア評価技法とメトリックス
I ソ フ ト ウ ェ ア ・ メ ト リ ッ ク ス
ソフトウェア・メトリックスは、ソフトウェアの品質管理、品質評価の手法 の指標である。開発現場でも導入され、
ISO
やJIS
によって標準化が行なわれ ている。しかし、ソフトウェア評価プログラムの作成には構文解析、字句解析 といった高度なプログラミング手法が必要であり、構文解析系からプログラム を作成するには多くの時間と労力が必要である。S a p i d
は、そのようなプログ ラムを容易に実現する環境を提供する。本章では、各種のメトリックスを求める
S a p i d
プログラムを作成し.ソフト ウェア評価を行うための技術を例示する。メトリックス計測値のXML
データ による表現、ブラウザによる表示とハイパードキュメントの実現、メトリック ス 計 測 値 の 統 計 解 析 、 他 の ソ フ ト ウ ェ ア の 計 測 値 と の 比 較 分 析 な ど で あ る 。S a p i d
プロジェクトでは、オープンソース・ソフトウェアのリポジトリ・データベース
SDB
を解析し、公開している。1.1 代表的なソフトウェア・メトリックス
ソースコードのメトリックスは、フログラム・メトリックス、ファイルメト リックス、関数メトリックスなどに分けられる。関数メトリックスのデータを 集計して、他のメトリックスを求めることができる。関数メトリックスは、関 数の引数の数、行数、コメント行数、制御構造の複雑さ、関数呼び出し情報と いった項目からなる。内部変数と変数の総数の比、制御構造や関数呼び出しの 複雑さ
( C y c l o m a t i c
数)といったメトリックスを求める。56
S a p i d
によるソフトウェア解析技法 1.2
メトリックスの利用法と有効性実際にメトリックスを計測し、ソフトウェアの品質評価を行う場合の問題点 を分析し、メトリックスによるソフトウェア品質評価の実効性、メトリックス を有効に利用するための条件を考察する。また、既存のメトリックス開発方法 を分析し、
S a p i d
を用いた場合の優位性を明らかにする。S a p i d
プロジェクトでは、S a p i d
やXML
といった技術を用いて、標準メトリ ックスについては自動的に計測値を取得し、評価、比較を実現し、特別なメト リックスについてはプログラム開発環境の提供を行っている。A. メトリックス計測ソフトウェアの作成、利用上の問題点
多くのメトリックスは、プログラムの構造を参照し、それに基づいてデータ を解析する必要があり、構文解析や統計解析といった難解で手数の要求される テクニックが必要となる。
実際の開発現場では、ソフトウェア開発は大規模なプロジェクトとなり、パ ージョンごと、モジュールごとにメトリックスを求めて相互に比較する必要が ある。そのため
c v s
のようなパージョン管理ソフトとの連携が求められる。い っ た ん 作 成 し た メ ト リ ッ ク ス 計 測 フ ロ グ ラ ム を 再 利 用 す る 環 境 も 必 要 で あ る。
メトリックス計測データの評価を行うためには、明確な規準や、標準的で比 較可能な指標データが必要である。標準的なメトリックスについては、ある程 度の指標が提供されているが、独自に定義・計測したメトリックスについては、
明確な基準比較データはない。
1.解析ソフトウェアの作成が困難である
2 .
パージョンごとの計測など、さまざまな点からの分析が必要である3 .
比較対象データが必要である4 .
計測プログラムを作成しでも再利用が難しい [メトリックス利用の問題点]第4章 ソフトウェア評価技法とメトリックス 57
B .
メトリックスの計測・評価方法メトリックスを計測する初歩的な方法は手作業によるレビューである。コー ディング・ルールのチェックや、プログラミングが難しいメトリックスを求め るときに利用できる。変数や関数呼び出しの出現数を求めるといったパターン マ ッ チ ン グ の メ ト リ ッ ク ス は 、
perl
やgrep
と い っ た 簡 易 言 語 を 利 用 す る。インターネットで公開されているオープンソース等のメトリックス計測・評 価 ア プ リ ケ ー シ ョ ン を 利 用 す る 方 法 も あ る 。 オ ー プ ン ソ ー ス で は
Cowan U n i v e r s i t y
のCCCC
、CodeCenter
、商用ではSquaredTechnologies.com
社のResource Standard M e t r i c s
などがあり、プログラムのサイズや制御の複雑さといったソースコードに基づくメトリックスを計測できる。
標準的なメトリックスについては、プログラムを作成する必要はないが、独 自にメトリックスを開発することはできない。
CodeCenter
を配布するQAC
(東陽テクニカ)のみが比較データを提供するが、個別のソフトウェアについ ての計測値は公開されていない。1.手作業によるレビュー 利用:限定
2 . p e r l
やg r e p
などの簡易言語による分析 利用:限定3 .
専用アプリケーション 利用:標準的なもの4 .
独自に開発 利 用 範 囲 : 大 作 成 : 灘5 .
独自に開発S
印刷の利用 利 用 範 囲 : 大 作 成 : 易[メトリックス計測の利用方法]
C.
Sapid
開発環境を用いたメトリックス利用との開発のメリットSapid
プロジェクトの一環として、Sapid
を用いてメトリックスを効率的に 計測し、信頼性の高い品質評価を実現する技法と、関連ソフトウェアを開発し ている。既存のソフトウェア工学的手法を基礎として、効率性、拡張性といっ た点から開発を行なっている。S a p i d
を用いる第1
のメリットは、簡便性である。容易にメトリックス計測58
S a p i d
によるソフトウエア解析技法プログラムを作成・利用することができる。第
2
は再利用可能性である。既存 の計測プログラムのコードを利用して、類似のメトリックスを容易に作成でき る (II、 E のサンプルプログラム参照)。また、オープンソースを計測・解析 したデータを規準データとして提供すること、CVS
(パージョン管理システム) との連携、XML
、H τ
・ML
、SVG
等によるデータの表現・表示といった特徴を 持つ。例えばSapid
アプリケーションであるSPIE
は、ハイパードキュメント を簡単に実現する。1 .
ソフトウェア開発が容易である2 .
再利用可能性3 .
評価の基準値、比較対象データの提供4 .
パージョン管理システムとの連携5 .
表示の柔軟性(ハイパードキュメントなど) [我々の手法のメリット]E 集 計 に よ る メ ト リ ッ ク ス
関数の呼び出し数、内部変数の総数といったメトリックスを求める。これら のデータを統計的に解析することで、多くの有用な情報を得ることができる。
関 数 や 変 数 に 関 す る 情 報 は 、 ク ラ ス
i d e n t i f i e r
を基点として取得する。2 . 1
内部変数に関する集計メトリックス変数に関連する情報は変数名、型、有効範囲、出現位置、含まれる式などか らなる。変数名や型の取得は
2
章を参照のこと。内部、外部、静的といった変 数宣言の範囲の種類はi d e n t i f i e r
の基本情報ではなく、d e c l a r a t i o n
に含まれる。変数宣言オブジェクトの属性
s t o r a g e
を参照して求める。変数の有効範囲や変 数を含む式を取得するためにはオブジェクトe x p r e s s i o n
、b l o c k
をといったクラスのオブジェクトを利用する。
第4章 ソフトウェア評価技法とメトリックス 59
STORAGE AUTO auto
STORAGE EXTERN extern STORAGE STATIC static STORAGE REGISTER reglster STORAGE
1YP
EDEF typedef[クラスdeclarationの属性storageJ
関数getVarNum ーあるオブジェクト内のローカル変数の個数
int getVarNum(SpdObjld 0同id){ SpdCursor吋dent̲白r' int count= 0; SpdO凹 ident̲occ;
idenC田r= spdGetInc¥udedOcclnit(obLid, "ident泊er",obLid);
whiIe ((idencocc = spdGetInc¥udedOcc(idenCcsr)).relationld !=SAPID̲NON̲ID) if (spdGetAttrValIrit(ident̲o田objectId,"sort") == ID̲VARlABLE)
if(varSort(ident̲occ.objectId) == LOCAL) count++;
return count
関数VarSort 変数の種類を求める
#define LOCAL 0
#defineGLOVAL 1
#define STATIC 2 int varSort(SpdObjld v町'̲id){
SpdObjld decUd, decr̲id;
decr̲id = spdGetARelObj(var̲id
,
"decUden!"、 ,
ny");decCid = sI>dGetARelObI(decr̲id, "decLdec
l " ;
"c‑id"); if(spdGetAttrValInt(decUd, "storage") == STORAGE̲EXTERN)return EXTERN;
else if (spdGetAttrValInt(decUd, "storage") == STORAGE̲STATIC) return STATIC;
else
return LOCAL;
サンプルプログラム
4‑1
オブジェクト内のローカル変数の総数#inc¥ude <stdぬh>
#inc¥ude <S凶pid/S也pid.h>
void getProgldO;
void getFuncName(SpdObjld); / / 1章を参照 int getVarNum(SpdObjld);
int varSort(SpdObjld); )前可制 抑
ac
‑‑
︐ 剥nd町
h J d w M
可
c n p
obトも
町 地
M
M M
吋N d
︒ ︒ ︒ ;
町 山凶凶川
s s h
nu e4
弘
proιid= getProgldO;
func̲array=spdGetO同ldArray("optionaldecl",NULL, NULL);
for
l i
= 0; i: <
funcarray.size; i++)60
S a p i d
によるソフトウェア解析技法if(s中dGetAttrValInt(func̲array.id[i),"sort") == DECL̲FUNCDEF) { getFuncName(func̲array.id[i]);
printf("Local Variable = %d¥n",getVarNum(func̲array.id[i)),LOCAL);
spdFreeObjldArray(func̲array); return (EXIT̲SUCCESS);
実行結果
FUNC NAME= add FUNC NAME= dec FUNC NAME= main
Local Variable = 4 Local Variable = 2 Local Variable = 16
2.
2 関数の集計メトリックス
関数の呼び出し数などを関数宣言ごとに求める。関数宣言オブジェクトのー 覧を、オブジェクト配列(クラス名
: d e c l a r a t i o n
、SORT:DECL̲FUNCDEF) を
用いて取得し、 それを基点として情報を取得する。第2
章のサンプルプログラ ムの関数g e t F u n c C a l l
などを改良して関数呼び出しに関するメトリックスを求 める。関数
g e t F u n c C a l l ( m e t r i c s 版)
#de自neMAJCFUNC̲SIZE 100 void getFuncCall(SpdO同IdfuncDe氾Ud) {
SpdOcc func二occ; SpdCu問 。r*func田r' int i=Q,count=寸E
関数呼び出しの数を求める
funほ 四r= spdGetIncludedOccInit(funcDecUd, "identifier,'・funcD田Ud);
w
・
i(f((fspduncGー 舵etAc=tstrp<V鉛alIent(funcotIncludedO凹(funccsr)).relationId!=SAPID̲NON̲ID)目。切目白d,"sort") == ID̲FUNCTION) count++
}
実行結果
FUNC NAME= main Calling Function: 3 FUNC̲NAME= dec Calling Function: 0 FUNC‑NAME= add Calling Function: 1
E 複 雑 さ を 表 現 す る メ ト リ ッ ク ス
プログラムの複雑さを計測する手段として、 制御構造のネスト数、 ブロック
第4章