Javaにおける可変性がサイクロマティック複雑度に与える影響
2410.10425 The Impact of Mutability on Cyclomatic Complexity in Java の翻訳
この論文は、Javaのオブジェクトにおける「可変性(ミュータビリティ)」と「コードの複雑さ(サイクロマティック複雑度)」の関係を、約86万ファイルの分析を通じて調査した研究です。
/icons/hr.icon
論文タイトル:Javaにおける可変性がサイクロマティック複雑度に与える影響
著者: Marat Bagaev, Georgy Sabaev, Alisa Khabibrakhmanova, Yegor Bugayenko (HSE, Huawei / Moscow, Russia)
日付: 2024年10月14日
アブストラクト
Javaにおいて、オブジェクトは可変(mutable)または不変(immutable/final修飾子付き)の属性を持ちます 。少なくとも1つの可変属性を持つオブジェクトは「可変オブジェクト」と呼ばれます 。著者らは、可変オブジェクトは不変オブジェクトよりも「サイクロマティック複雑度(Cyclomatic Complexity: CC)」が高いのではないかと予測しました 。
1,000のGitHubリポジトリから862,446個のJavaファイルを分析した結果、不変オブジェクトは可変オブジェクトに比べて約3倍複雑度が低いことが示されました 。したがって、不変クラスを多く使用することで、コードベース全体の複雑さを低減し、保守性を向上させられる可能性があります 。
/icons/hr.icon
1. 導入 (Introduction)
ソフトウェア開発において可変データは一般的ですが、並行処理時の競合や不正な状態遷移などの問題を引き起こす可能性があるため、避けるべきとする専門家もいます 。可変性はサニティチェック(健全性確認)の追加を必要とし、コードを複雑にする可能性があります 。
本研究では、以下のリサーチクエスチョン(RQ)に取り組みます :
RQ1: Javaプロジェクトにおける可変オブジェクトと不変オブジェクトの平均的な比率は?
RQ2: Javaクラス内の可変属性の割合と、そのクラスのCCとの間に相関はあるか?
RQ3: 可変オブジェクトは不変オブジェクトよりも高いCCを持つ傾向があるか?
著者らの仮説は「不変性はJavaクラスの単純さに好影響を与える」というものです 。
2. 背景 (Background)
サイクロマティック複雑度 (CC): McCabeによって導入された、プログラムの論理フローの分岐に基づいて複雑さを定量化する指標です 。$C=E-N+2$ の式で計算され、クラス全体のCCは各メソッドのCCの合計として算出されます 。
可変性と不変性: インスタンス化後に変更可能な(非staticな)属性を持つオブジェクトを可変、そうでないものを不変と呼びます 。Javaには厳密な定義はありませんが、「setterを作らない」「フィールドをfinalかつprivateにする」などのガイドラインが存在します 。
3. 関連研究 (Related Work)
Bloch(Javaの生みの親の一人)などは、正当な理由がない限りクラスは不変であるべきと推奨しています 。過去の研究ではCCとコード行数(LOC)の相関などは示されていますが、Javaクラスの「可変性」と「複雑度」の相関を扱った研究はこれまで存在しませんでした 。
4. 手法 (Method)
「CaM dataset (2023-10-22版)」をベースに、1,000個のJavaリポジトリ(1k-10kスター)を分析対象としました 。
既存データには可変属性の数が含まれていなかったため、以下のメトリクスを追加で収集しました :
NOFA: final(不変)属性の数
ATTRS: 非staticな属性の数
FARATIO (Final Attribute Ratio): 全属性に対するfinal属性の割合
FARATIONS: 非static属性に対するfinal属性の割合
5. 結果 (Results)
収集されたデータの統計は以下の通りです :
table:table
項目 値
不変クラス数 493,382
可変クラス数 369,064
不変クラスの平均CC 6.5
可変クラスの平均CC 19.8
不変クラスのCC中央値 2.0
可変クラスのCC中央値 5.0
可変クラスの平均CC(19.8)は、不変クラス(6.5)よりも著しく高い結果となりました 。
一方で、不変性の「度合い」(属性のうちどれだけがfinalかを示すFARATIOなど)とCCとの間には、相関(相関係数 約0.0003)がほとんど見られませんでした 。
6. 考察 (Discussion)
不変性の判定の難しさ: クラスが本当に不変かを自動判定するのは困難です。final宣言されていても、その中身がListなどの可変オブジェクトであれば変更可能ですし、継承やリフレクションによって不変性が破られることもあります(図1~3参照)。
「度合い」よりも「有無」: データによると、完全に不変なクラスはCCが劇的に低い一方で、不変属性の「割合」とは相関がありませんでした 。これは、少しでも可変性(不変性の規約違反)が存在すると複雑度が増大し、その後の違反の多さはあまり影響しないことを示唆しています 。つまり、クラスを複雑にする要因としては「可変であること自体」が重要であると考えられます 。
7. 限界と今後の計画 (Limitations and Future Plans)
CC以外のメトリクス(コード行数、認知複雑度など)を使用していない点 。
オープンソースのみを対象としており、プロプライエタリなコードが含まれていない点 。
不変性の定義が形式的ではなく、独自のものである点 。
8. 結論 (Conclusion)
1,000のリポジトリから約86万クラスを分析した結果、可変属性を持つクラスは一般的にCCが高く(平均19.8)、不変クラス(平均6.5)と比較して保守性やユーザビリティが低い可能性が示されました 。
不変クラスの利用を増やすことは、コードベース全体の複雑さを低減し、保守性の向上に寄与すると推測されます 。