リファクタリングがコードスメルにどのように影響を及ぼすかを調査した論文.
通常,リファクタリングはソースコード中のコードスメル(不吉な匂いがする箇所)を除去,改善するために行われる. 一方,実際の開発現場では,コードスメルのためではなく,バグの修正や機能追加のためにも行われる. そのため,リファクタリングがスメルには影響しないどころか,スメル的にはかえって改悪となる可能性もある. そこでこの研究では,リファクタリングとスメルについて23のプロジェクトに対して調査した. リファクタリングの検出にはRMinerを,スメルの検出にはルールベースな手法を用いた.
結果として,半分以上のリファクタリングはスメルに影響を与えず,1/3のリファクタリングはむしろ悪化させるという結果だった. 悪化の例としては,例えば親クラスの抽出リファクタリングは"疑わしき一般化"を引き起こし,メソッドの引き上げやメソッド抽出リファクタリングは"神クラス"を引き起こすことが多かった. また,リファクタリングには「リファクタリングにだけ専念して行われる」"root-canal refactoring" と「機能追加はバグ修正と一緒に行われる」"floss refactoring"の2種類があるが,root-canal refactoring でもこのような例は見つかった.
結果から,新たにスメルを生み出すリファクタリングには以下のようながグループ分けがなされた.
※ 変更の発散: 複数の変更要求が一つのクラスの変更に集中する. 似たようなスメルに"変更の分散"がある(一つの変更要求が複数のクラスの変更に繋がる)