3.3 コードの重複(Code Duplication, Clone Code)
概要
ソフトウェアの品質を測定する指標の中で、特に開発の効率やメンテナンスの容易さに影響を及ぼすのが「重複コード」の数です。重複コードは、クローンコードとも呼ばれ、主にコピペの結果発生した、同じまたは類似のコードの断片のことです。ロバート C. マーティンが、著書『Clean Code』で 「重複は、あらゆるソフトウェアの諸悪の根源」と述べているように、重複コードは以下のような問題の原因となります。
- 保守性の低下:似たようなコードが複数の場所に存在する場合、1つのバグや変更要求が生じたとき、すべての重複部分を探して修正する必要があります。これはエラーの原因となる可能性が高く、時間もかかります。
- 理解の困難:新しい開発者がチームに参加したとき、重複したコードを見つけると、どの部分が正しいのか、どれを参考にすればよいのか混乱する可能性があります。
- テストの困難:重複コードの存在は、テストの範囲や複雑性を増加させる可能性があります。あるロジックにバグがないかテストする場合、そのロジックが存在するすべての場所をテストしなければなりません。テスト作業が煩雑になり、テスト漏れも発生しがちです。
最終的には、納期遅延、開発コストの増加など、ビジネス上の問題として顕在化します。
指標の使い方
重複コードを検出するためのツールは、Clone Detective、Simian、PMD、SonarQubeなどいくつかあります。これらのツールは、ソースコード中の類似のパターンを検出し、その位置や範囲を報告します。これらのツールを用いて重複コードが見つかったら、次にそれに対処するか否か決断する必要があります。対処方法としては、具体的にはまとめて共通関数化したり、不必要であれば削除したりするなどです。
重複コードはなるべく減らした方が良いことは間違いないのですが、「異なるビジネス要件に対して、チームが一貫したアプローチをとったためにたまたまコードが似てしまった」ということもありえます。採用しているフレームワークや言語仕様上、どうしてもコードが似てしまうこともあるでしょう。対処するか否かの判断は単純ではなく、重複コード毎に変わるものなので、容易ではありません。そのため筆者らは、既存のツールより一歩進んで、重複コードを検出するだけでなく、重要度を測定してどう対処すべきかを管理するツールClone Trackerを開発しています。
検出した重複コードを使ってコード品質を測定するなら、例えば、プロジェクトのコード行数に対する重複コード行数の割合、つまり「重複率」を測定することができます。この「重複率」をKPIとして利用しているチームも多いでしょう。では、重複率がどのぐらいまでであれば、コード品質が健全と言えるでしょうか?
低い方がより良いだろう、ということは自明だと思いますが、先に紹介した循環的複雑度とは異なり、実は重複度に関しては明確な基準値はありません。重複度は、使用している言語や技術、開発対象によってもかなり変動します。また、先に紹介した各種重複コードの検知ツールのアルゴリズムはそれぞれ独自のものが多く、出力される重複コードの検出数は相互に比較できません。以上の理由から、重複度に関しては、その絶対値よりも値の時系列変化に着目した方が良いでしょう。ある程度の期間の中で何か著しい増加が観測されたら、チームを集めてその原因や対処方法について検討してみて下さい。