論文メモ When and Why Your Code Starts to Smell Bad
August 21, 2020200件のAndroid, Apache, EclipseのOSSプロジェクトのコミット履歴を調査し、不吉な匂いが生じる原因と理由を調査した。 常識では、改修の繰返しによって匂いのない既存のコードに匂いが生じると考えられているが、これに反して、不吉な匂いのするコードのほとんどが作成時点で不吉な匂いを出していたことを明らかにした。
先行研究を実装したツールで半自動的に不吉な匂いを特定した。 次の5つの不吉な匂いが調査対象にされた。 調査したコミット数は50万件であり、そのうちの9164件が不吉な匂いを含むと判定された。
- Blob Class: 複数の責務を抱えた大きすぎるクラス
- Class Data Should be Private: 修飾子による公開範囲が大きい
- Complex Class: 循環的複雑度が大きい
- Functional Decomposition: 継承をうまく使えておらず、フィールドが多くメソッドが少ない
- Spaghetti Code: パラメタのない長いメソッドがある
コミットごとに不吉な匂いに関連する表2のメトリクスを測定し、メトリクスを予測よりも悪化させたコミットを不吉な匂いと判定した。
予測には回帰モデルを使用した。
図1は不吉な匂いを特定する例であり、コミットとLOCの変遷を示す。
黒丸は実際の変化を示し、黒の直線は予測に対応する。
この場合は、予測を越えるC3, C5, C7が不吉な匂いを含むコミットと判定される。
不吉な匂いを生む理由を調べるために、不吉な匂いを含むコミットの目的、プロジェクトと開発者の状況について調査した。
次の表3は、これらの目的と状況の区分を示す。
JIRAやBUGZILLAで管理されているタグやコミットメッセージを解析してコミットの目的を調査した。
開発者の仕事量(workload)は、コミット量で推定された。
以上の調査をもとに分かったことをまとめると次の4つになる。
- ほとんどの不吉な匂いのあるコードは生成時点から問題がある。
- コードの改修で不吉な匂いを生じるようになるコードは、問題のないコードとは異なるメトリクスのトレンドを描く。
- 特定された不吉な匂いの9164件のうちの400件は、リファクタリングによって混入されたものだった。リファクタリングでも不吉な匂いを混ぜることがある。
- 新参の開発者よりも、仕事量が多かったりリリースの直前だったりする開発者のほうが不吉な匂いのあるコードを実装しがちである。
- 論文をこちらからダウンロードできます。