はじめに
いつも弊社Understandブログをご購読いただきありがとうございます。
今回は弊社エンジニアがお客様先や弊社テクニカルサポートにおいて、よくご質問をいただく内容について、その回答を記事にしていきたいと思います。
本ブログ記事はUnderstandをメインに扱っておりますが、今回は姉妹ツールであるアーキテクチャ分析ツール「Lattix」における、アーキテクチャメトリクスの参考値について、解説したいと思います。
今回取り上げるご質問
- 「Lattixのアーキテクチャメトリクスを利用する際に、基準値のようなものはありますか。」
- 「Lattixのアーキテクチャメトリクスを利用する際に、何か参考になるデータはありますか。」
- 「Lattixのアーキテクチャメトリクスの活用の仕方が分かりません。」
アーキテクチャメトリクスとは
アーキテクチャメトリクスとは、ソフトウェアアーキテクチャを特定の側面から定量化した数値です。
以下でも解説しております。
https://www.techmatrix.co.jp/product/lattix/function/metrics.html
ソースコードメトリクスとアーキテクチャメトリクスの違い
ソースコードメトリクスの特徴
ソースコードの品質を定量的に評価する際は、Understandで取得可能な「ソースコードメトリクス」が広く知られ、利用されています。ソースコードメトリクスとしては、関数の規模を示す「ステップ数」や、関数ロジックの複雑さを表す「サイクロマティック複雑度」などが有名です。このソースコードメトリクスは、ソースコードをミクロな視点で評価するものであり、関数単位を計測対象とする点が特徴です。
アーキテクチャメトリクスの特徴
Lattixのアーキテクチャメトリクスは、ソフトウェアアーキテクチャにあらわれる階層構造(ディレクトリ階層、パッケージ階層)や要素間(ファイル間、クラス間)の依存構造に着目したメトリクスです。アーキテクチャ(階層構造や依存構造)に着目しているため、ソースコードメトリクスよりも視座が高く、俯瞰的に構造を捉えることが可能です。
アーキテクチャメトリクスでは、階層構造、依存構造の観点からアーキテクチャを視ることで、以下のような特徴を把握することが可能です。
- システム規模
- 変更に対する感度
- 連結の度合い
- リスクの度合い
- 結合の度合い
- 循環の度合い
利用方法の違い
ソースコードメトリクスと関数の場合
ソフトウェアの部品である関数は、どのような種類のソフトウェアであっても、人間が管理する限りは、可読性や再利用性からの要請により、基本的には単一責務とすることが求められます。このため、規模、入出力の数、ロジック構造の深さや複雑さなどに着目をし、ある程度同じ基準値による絶対評価で判断することが可能です。
アーキテクチャメトリクスと構造の場合
一方、ソフトウェアにおける骨組み構造では、残念ながらこの方法は向いていません。これは、そのソフトウェアの機能や仕組みによって、構造が変わるためです。
(健康診断の測定値に基準値を設けることができるのは、人間の体の構造が皆だいたい同じだからであり、インド象とオウムでは比べることは難しいでしょう。)
アーキテクチャメトリクスの活用方法
ではどのようにしてソフトウェアアーキテクチャを評価するのかと言えば、相対評価(比較評価)です。
相対評価の例)
- 非常に近い種類のソフトウェア(プロダクトライン開発の別機種)と比較する(例:アジア象とインド象では、アジア象全体では○○だが、インド象に限って言うと△△な傾向がある)
- 当該ソフトウェアの過去バージョンと比較(トレンド分析)する。
また、継続的に監視をおこない問題を発見するトリガーとして利用する。- 例:v1.0~v1.5では要素数の増減はほとんどなく、各メトリクスも大きく変わらない。
→バグフィックスが中心であったが、その間の変更ではレイヤーやモジュール構造に影響するような依存関係は発生していないと考えられる。(バグフィックスなのに構造が変わるのはまずいので、これが普通。アーキテクチャは一度崩れるとすぐに手当てしない限り「動いてるものを触るな」文化のために直せなくなることが多いため、構造劣化監視(モニタリング)・検知が大切。) - 例:v2.1で要素数が非常に増えているが循環度は1~2%程度下がっている。
→v2.1では循環依存を発生または拡張することなく、機能追加ができている。(値が下がった理由は要素数が増えたことによる値の希釈と説明できる) - 例:v2.3で要素数はほとんど変わっていないが、循環度が10%も上がった。影響度平均もかなり上がっており、アーキテクチャルール違反も増えている。
→レイヤー間の逆依存が発生したことで、多くの要素で構成された循環依存が発生し、各ファイルを変更した際の影響要素数が増えたことで、影響度平均も上がったのでは?
※こうなった場合、変更した箇所を確認して即座に直さければ、後にテスト後は直せなくなるため、密結合構造がデグレードを誘引し、テストで見つけづらいバグが頻発するソフトウェアになってしまう。
- 例:v1.0~v1.5では要素数の増減はほとんどなく、各メトリクスも大きく変わらない。
トレンド分析を開発チームの週次でおこなうことで、チームで設計構造について考える場を作ることができ、「逆依存を作らない」、「グローバル変数を多用しない」、「疎結合にして変更容易性を高める」など、基本的な設計知識を養ったり、安全設計の意識を高めるなど、設計・実装力を底上げする場を作ることができます。
(長く続くソフトウェア開発では「高度な設計・開発ができること」と同じかそれ以上に「まずい構造を作らないこと」が大切です。)
それでも参考値を知りたい!
「アーキテクチャメトリクスは相対評価で使う」とは言いつつも、そのメトリクス値がどれくらいの範囲を取るのか、どれくらいばらつきが出るのかを知りたい」というように、参考値を一回見てみたいという方は多く、弊社でも頻繁にご質問をいただいてきました。
Metrics for Certain Well-known Systems
開発元が公開しているWebドキュメントによく知られたシステムのメトリクス値が参考値として掲載されておりましたため、ご案内いたします。
※本参考値は、一部のメトリクスのみであり、Lattixで計測可能なメトリクスは他にも存在します。
CodeClinic, “Metrics for Certain Well-known Systems”, Lattix User Guide,
https://docs.lattix.com/lattix/userGuide/Metrics.html#metrics-for-certain-well-known-systems , (閲覧日: 2026-01-26)
各メトリクスの説明
なお、上記参考値の各メトリクスの説明は以下の通りです。(弊社ユーザーズガイドより抜粋)
| グループ | 英語 | 日本語 | 説明 | 備考 |
|---|---|---|---|---|
| システム規模 | Atom Count | 要素数 | 該当システムに含まれる要素の数です。 対象となる要素の種類は、分析対象により異なります。 | メンバー展開時の変数・関数などの要素は含みません。C/C++の場合にはソース/ヘッダーファイルの数、Java, .NETの場合には、クラス/インターフェイスの数です。 |
| システム規模 | Complexity | システム複雑度 | 該当サブシステムの複雑度です。要素数と依存関係数を乗じたものを、10,000,000でノーマライズした値です。 | アーキテクチャメトリクスの複雑度であり、サイクロマティック複雑度とは別物です。 |
| 変更に対する感度 | System Stability | システム安定性 | システムが変更に対してどれくらい敏感であるかの指標です。 100% – (影響度平均 / 要素数 * 100) で計算されます。 ある要素を変更したときに影響を受けない要素はシステム内の全要素のうちどの程度かを測ることができます。 | システム安定性は、該当要素や該当サブシステムが全要素に対して与える影響を測る指標です。計算式の要素数も該当要素や該当サブシステムではなく、全要素を使用して計算されます。 |
| 変更に対する感度 | Average Impact | 影響度平均 | 該当システムにおける各要素の影響度の平均値です。ある任意の1要素に対して変更を加える場合に、影響を受ける要素の数の平均とも言えます。 | 任意の要素aの影響度は、aに対して直接および間接的に依存している要素の合計数として計算されます。 |
| システム規模 | Internal Dependencies | 依存関係数 | 該当システムに含まれる依存関係の数です。 | ここでの依存関係は、ファイル・クラス粒度の依存強度で測定される依存関係です。 |
| Clustering | – | – | ※以前のバージョンで提供されていましたが廃止されました。 | |
| システム規模 | Average Dependency | 依存度平均 | 該当システム内の依存度の総和を該当サブシステム内の要素数で割ったものです。 | 各要素の依存度は、要素が直接依存している要素の数で表されます。 |
| 連結の度合い | Normalized Cumulative Dependency | 正規化累積依存度 | システムの累積依存度を、対象のシステムと要素数および依存関係の数が同じである完全な2分木を形成するサブシステムの累積依存度で割り、正規化したものです。各要素の累積依存度は、要素が直接および間接的に依存している要素の数で表されます。影響度平均とは異なり、各要素が自身に依存するとし、依存関係に加えます。 | 正規化累積依存度が1.0未満の場合、システムはより「水平」な構造または緩やかに結合していると考えられ、1.0以上の場合には、より「垂直」な構造で密に結合していると考えられます。1.0よりもはるかに大きな値の場合、システムは循環構造である可能性を示します。 |
| 連結の度合い | Connectedness | 連結度 | 要素ペアに対する連結要素ペアの割合です。要素ペアは、要素の順列(permutation)であり、nP2(n=要素数)で計算されます。連結要素ペアとは、各要素から直接的および間接的に到達可能な要素のペアです。 | 例えば、要素aは要素cには直接依存していないが、要素aが要素bへ、要素bが要素cへ依存している場合、連結要素ペアは、(a,b), (b,c), (a,c) の3ペアとなります。 連結度は、100*N/(V*(V-1)) で計算されます。(N=連結要素ペア数、V=要素数(Atom Count)) |
| 連結の度合い | Connectedness Enrichment | 連結濃度 | 連結度と、予測構造の連結度を比較した指標です。予測構造とは、同数の要素数および同数の各要素の入出力依存関係数で構成される、ランダムに決定された仮想的な構造です。 | 連結濃度が1より大きな値の場合、より連結の度合いが強い(つまり間接的な依存がより多い)ことを示し、1より小さい場合、より連結の度合いが弱い(つまり間接的な依存がより少ない)ことを示します。 非常に小規模なシステムの場合、現構造と予測構造がほぼ等しくなる傾向が強いため、このメトリクスは効果的ではないケースがあります。 |
| 連結の度合い | Connectedness Strength | 連結強度 | 連結度を拡張したメトリクスです。連結強度では、連結のカウントに重み付けをおこないます。直接的な依存で連結しているペアは1とし、間接的な依存で連結しているペアは、1/距離として重み付けます。複数の経路が存在する場合には、短い経路の距離で計算します。 | 例えば、要素aが要素bへ、要素bが要素cへ依存していますが、要素aは要素cと直接依存していない場合、ペア(a,c)の値は、1/2=0.5 (a->b->cで距離が2) となり、要素a,b,c全体での値は、ペア(a,b)+ペア(b,c)+ペア(a,c)=1+1+0.5=2.5 となります。 |
| 結合の度合い | Coupling | 結合度 | 要素ペアに対する結合要素ペアの割合です。要素ペアは、要素の組合せ(combination)であり、nC2(n=要素数)で計算されます。 | 結合要素ペアとは、要素同士が直接的および間接的に到達可能な要素のペアです。例えば、要素aが要素bに直接または間接的に依存しており、要素bが要素aに直接または間接的に依存している場合、ペア(a,b)は結合要素ペアです。 |
| 結合の度合い | Coupling Enrichment | 結合濃度 | 結合度と、予測構造の結合度を比較した指標です。予測構造とは、同数の要素数および同数の各要素の入出力依存関係数で構成される、ランダムに決定された仮想的な構造です。 | 結合濃度が1より大きな値の場合、より結合の度合いが強いことを示し、1より小さい場合、より結合の度合いが弱いことを示します。非常に小規模なシステムの場合、現構造と予測構造がほぼ等しくなる傾向が強いため、このメトリクスは効果的ではないケースがあります。 |
| 結合の度合い | Coupling Strength | 結合強度 | 連結度を拡張したメトリクスです。連結強度では、連結のカウントに重み付けをおこないます。直接的な依存で連結しているペアは1とし、間接的な依存で連結しているペアは、1/距離として重み付けます。複数の経路が存在する場合には、短い経路の距離で計算します。 | 例えば、要素aが要素bへ、要素bが要素cへ依存していますが、要素aは要素cと直接依存していない場合、ペア(a,c)の値は、1/2=0.5 (a->b->cで距離が2) となり、要素a,b,c全体での値は、ペア(a,b)+ペア(b,c)+ペア(a,c)=1+1+0.5=2.5 となります。 |
| 循環の度合い | System Cyclicality | 循環度 | サイクル(循環依存)に関与している要素の割合です。 | 要素間のサイクルのみを考慮します。 100*サイクル(循環依存)に関与している要素の数/要素数 で計算されます。 |
| 循環の度合い | Intercomponent Cyclicality | システム間循環度 | サブシステム間のサイクルに関与している要素の割合です。サブシステム内部で閉じているサイクルは除外します。 | この指標により、サブシステムが適切に階層化されているかを評価することができます。 |
※連結度と結合度の違いは、どちらも依存要素ペアを数えますが、連結度は一方向の依存要素ペアも含めてカウントします。一方、結合度は循環依存のみを対象にカウントします。
※循環度と結合度の違いは、循環度が要素数に着目しているのに対し、結合度は結合ペアの数に着目している点です。この違いにより、結合度はルート($root)要素に対してのみ計測可能ですが、循環度は各サブシステムに対しても有効です。
終わりに
今回はアーキテクチャメトリクスの活用方法と参考値について解説いたしました。
その他、ご不明な点やご質問などありましたら、Lattix 製品カスタマーセンターまでお気軽にお問合せください。
