ソフトウェアメトリック

ソフトウェア測定法(ソフトウェアそくていほう)またはソフトウェアメトリック(英: Software metric )とは、ソフトウェアやその仕様の属性の尺度である。
定量的手法の威力は他の分野で証明されていたことから、計算機科学の分野でも同様の手法をソフトウェア開発に持ち込もうとする努力が続けられてきた。Tom DeMarco は「測定できないものは制御できない」と記している。

Wikipedia ソフトウエア測定法

ソフトウェア工学の祖の一人であるトム・デマルコは名著『品質と生産性を重視したソフトウェア開発プロジェクト技法』をこの有名な一文「測定できないものは制御できない」で始めました。1987年のことです。

phpdepend

ソフトウエア品質を客観的・機械的に計ろうとするPHPのメトリクスツールにphpdependがあります。
http://pdepend.org/

本体の紹介の中でこのように述べてます。

PHP_Depend can be used in an automated build environment and the generated reports are always objective, it just measures the quality facts of a given source base.

PHP_Depend scales with growing source bases, where human code reviews will fail at some day.

PHP_Depend allows you to indentify suspect parts in a software system that should be part of a code review, without looking into the source.

PHP_Depend also supports some fancy metrics that will become very useful, when you have reached certain level of metrics knowledge.

このツールを使いソースコードを解析すると2つの画像(svg)ファイルが得られます。Abstraction Instability ChartOverview Pyramidの2つです。

Abstraction Instability Chart

report-a-i-chart Abstraction Instability Chartは横軸にA – abstraction(抽象化)、縦軸に I – Instabilityのグラフです。このAを理解するためにまず二つの数字を理解する必要があります。CaとCeです。

Ca – Afferent Couplings:
このパッケージに依存した他のパッケージがいくつあるかという数字です。高い数値は仕様変更が他に影響を与えるパッケージが多いということを表します。

Ce – Efferent Couplings:
このパッケージが依存するパッケージはいくつあるかという数字です。高い数値は他のパッケージの影響を受けやすいということを表します。

CaCeIllustration この2つの数字を使って次のIが求められます。

**I -Instability ** – パッケージの不安定性を表します。Iは0~1をとり値が大きいほど不安定なパッケージとされ、この数値は(Ce / (Ce + Ca)) として求められます。

横軸のAは抽象度を表します。

A – Abstractness = 抽象象クラス数(AC) / 具象クラス(CC) + 抽象クラス数(AC)

Main Sequence

グラフに(0,1)と(1,0)を結ぶ直線をひきます。これがMain Sequenceと言われるラインでAとIのバランスの理想的な関係を表します。この線からの距離が大きいと「抽象度が高いがあまり利用されていない」「抽象度が低いが他からの依存が強い」など「抽象度と依存度の関係」が不適切という事を表します。

そのパッケージのサイズが丸の大きさで表されるので、重要なパッケージに注目することができます。

各フレームワークのA/Iチャート

実際に取ってみました。ソースはhttps://github.com/koriym/php-framework-metricです。※画像はSVGファイルなので単独で表示させ拡大するとパッケージ名の文字も読めます。

symfony

symfony-jdepend

zf2

zf2-jdepend

cakephp

cakephp-jdepend

CodeIgniter

CodeIgniter-jdepend

fuel

fuel-jdepend

laravel

laravel-jdepend

Slim

Slim-jdepend

yii

yii-jdepend

Silex

Silex-jdepend

BEAR.Sunday

bear-jdepend

Overview Pyramid

bear-pyramid
この”ピラミッッド図”の見方ですが、まず3つの部分に分かれてる事を理解します。

logger.overview-pyramid-0.serendipityThumb 次にNOPやCALLなどまるでアセンブラのニーモニックのような謎の略語を理解します。

Size and Complexity(サイズと複雑度)

NOP パッケージの数
NOC クラスの数
NOM メソッドの数
LOC コードの行数

Coupling(結合度)

CYCLO 循環的複雑度
CALL メソッドあたりの呼び出し数
FOUT ファン・アウト (ある特定のメソッドが呼び出す他のメソッドの数)

Inheritance(継承)

ANDC 直接の子孫の平均数
AHH 継承ツリーの平均の深さ

それらの値がピラミッドの中央に表示され、上段/下段の割合の数字が端に表示されます。

logger.overview-pyramid-3 数字には色が付けられ基準となる値の範囲に入ってない事を知らせてくれます。
これも同様に各フレームワークのチャートを用意しました。

Symfony

symfony-pyramid

zf2

zf2-pyramid

cakephp

cakephp-pyramid

CodeIgniter

CodeIgniter-pyramid

fuel

fuel-pyramid

Silex

Silex-pyramid

laravel

laravel-pyramid

Yii

yii-pyramid

Slim

Slim-pyramid

BEAR.Sunday

bear-pyramid

ソフトウエア品質はツールによって測定できるか

これには様々な議論があることも紹介します。この議論もとても興味深いものです。

今回各フレームワークのチャート図を作ってみました。それぞれのフレームワークの傾向が出て面白いとも思うのですが1、特に自分や自分のチームの開発しているソフトウエアに適用してその傾向や特徴を探る事も大事かと思います。ミニマムブートストラップを探るHelloWorldベンチマークと同様です。

参考URL

  1. 特にsymfony/zf2/cakephpのLOCが圧巻です []