コンピュータプログラミングにおいて、重複コードとは、プログラム内または同じエンティティが所有または保守する異なるプログラム間で複数回出現するソースコードのシーケンスです。重複コードは一般に、いくつかの理由から望ましくないと考えられています。 [1]偶然の類似ではなく重複と見なされるためには、シーケンス内に出現する必要があるコードの量に通常最小要件が適用されます。重複コードのシーケンスはコードクローンまたは単にクローンと呼ばれることもあり、ソースコード内の重複を自動的に検出するプロセスはクローン検出と呼ばれます。
2 つのコード シーケンスは、文字単位で同一でなくても互いに重複している場合があります。たとえば、空白文字とコメントが無視される場合にのみ文字単位で同一である場合や、トークン単位で同一である場合、またはトークン単位で同一であるが時々変化する場合があります。機能的にのみ同一のコード シーケンスであっても、重複コードと見なされる場合があります。
出現
重複コードが作成される原因としては、次のようなものがあります。
- コピー&ペーストプログラミング。学術的な環境では盗作の一部として行われる可能性がある。
- スクラッジングとは、コードの一部を「動作するから」コピーする行為である。ほとんどの場合、この操作では、変数名の変更やコードの挿入/削除など、クローンされたコードにわずかな変更を加える。言語では、ほとんどの場合、コードのコピーをさまざまな場所から呼び出すことができるため、複数の目的に使用できるが、プログラマーは、おそらく、動作しないという理由で、別のコピーを作成する。
- 言語を正しく理解していない
- きちんと行う時間がない、または
- 活発なソフトウェア腐敗の増加を気にしないでください。
また、プログラムの別の部分と非常によく似た機能が必要になり、開発者が独自に、他の場所に存在するものと非常によく似たコードを書くこともあります。研究によると、このように独自に書き直されたコードは、通常、構文的に類似していないことが示されています。[2]
開発のスピードや容易さを向上させるために重複コードが望まれる場合、自動的に生成されるコードも重複の理由の 1 つです。実際のジェネレーターのソース コードには重複が含まれず、生成される出力にのみ重複が含まれることに注意してください。
修正
重複コードは、コードを独自のユニット (関数またはモジュール) に移動し、そのユニットを元々使用されていたすべての場所から呼び出すことで修正されるのが最も一般的です。コンポーネントが集中管理されている、よりオープン ソースな開発スタイルを使用すると、重複の解決にも役立ちます。
コストとメリット
重複した機能を含むコードはサポートがより困難です。
- それは単に長いだけであり、
- 更新が必要な場合、同じコードの他のインスタンスの存在をさらに確認せずに、コードの 1 つのコピーが更新される危険性があります。
一方、コードの 1 つのコピーがさまざまな目的で使用されており、適切に文書化されていない場合、1 つの目的のために更新されても、この更新が他の目的には必要でなかったり、適切でなかったりする危険性があります。
ソース コード内に機能のコピーが 1 つだけある場合、これらの考慮事項は自動生成されたコードには関係ありません。
過去には、メモリ空間が限られていたため、重複したコードによってさらに多くの空間が占有されるというデメリットもありましたが、現在ではこれが問題になることはほとんどありません。
ソフトウェアの脆弱性のあるコードがコピーされた場合、開発者がそのようなコピーに気付いていなければ、コピーされたコードにも脆弱性が存在し続ける可能性があります。[3]重複コード をリファクタリングすると、コード行数、循環的複雑度、結合など、多くのソフトウェア指標を改善できます。これにより、コンパイル時間が短縮され、認知負荷が軽減され、人的エラーが減り、忘れられたり見落とされたりしたコードが減ります。ただし、重複したコードをすべてリファクタリングできるわけではありません。[4]プログラミング言語が不十分または過度に複雑な抽象化を提供している場合、特に同時編集 などのユーザーインターフェイス技術でサポートされている場合は、クローンが一番効果的なソリューションになることがあります。さらに、リファクタリング時にコードが壊れるリスクが、メンテナンスの利点を上回る可能性があります。 [5] Wagner、Abdulkhaleq、Kayaによる研究では、重複コードを同期させるために追加の作業を行う必要があるものの、関係するプログラマーが重複コードを認識していれば、重複していないコードと比べて大幅に多くの障害が発生することはないという結論が出ています。 [6] [異論あり–議論]
重複コードの検出
重複コードを検出するために、さまざまなアルゴリズムが提案されています。例:
- ベイカーのアルゴリズム。[7]
- Rabin-Karp 文字列検索アルゴリズム。
- 抽象構文木の使用。[8]
- 視覚的なクローン検出。[9]
- カウントマトリックスクローン検出。[10] [11]
- 局所性を考慮したハッシュ
- 反統一[12]
機能的に重複したコードの例
整数の配列の平均を計算する次のコードスニペットを検討してください。
外部int array_a [];外部int array_b []; int sum_a = 0 ;
( int i = 0 ; i < 4 ; i ++ )の場合、sum_a += array_a [ i ] ;
int average_a = sum_a / 4 ; int sum_b = 0 ;
( int i = 0 ; i < 4 ; i ++ )の場合、sum_b += array_b [ i ] ;
整数average_b = sum_b / 4 ;
2 つのループは、単一の関数として書き直すことができます。
int calc_average_of_four ( int * array ) { int sum = 0 ; for ( int i = 0 ; i < 4 ; i ++ ) sum += array [ i ];
合計を4で返します。
または、通常は配列内の要素の数をパラメータ化することによって行われます。
上記の関数を使用すると、ループの重複がないソース コードが生成されます。
外部int配列1 [];外部int配列2 [];
int平均1 = calc_average_of_four (配列1 ); int平均2 = calc_average_of_four (配列2 );
この些細なケースでは、コンパイラは関数の両方の呼び出しをインライン化することを選択する可能性があり、その結果、上記の重複した例と重複していない例の両方でマシン コードが同一になります。関数がインライン化されていない場合、関数呼び出しの追加オーバーヘッドにより、実行に時間がかかる可能性があります (ほとんどの高性能言語では、10 プロセッサ命令程度)。理論的には、この実行時間の増加が問題になる可能性があります。

参照
参考文献
- ^ Spinellis, Diomidis. 「The Bad Code Spotter's Guide」. InformIT.com . 2008-06-06閲覧。
- ^ コピー&ペーストを超えたコードの類似性、Elmar Juergens、Florian Deissenboeck、Benjamin Hummel 著。
- ^ Li, Hongzhe; Kwon, Hyuckmin ; Kwon, Jonghoon ; Lee, Heejo (2016 年 4 月 25 日)。「CLORIFI: コードクローン検証を使用したソフトウェア脆弱性検出」。並行性と計算: 実践と経験。28 (6): 1900–1917。doi :10.1002/cpe.3532。S2CID 17363758 。
- ^ アルチェリ・フォンタナ、フランチェスカ;ザノーニ、マルコ。ランケッティ、アンドレア。ダヴィデ・ランケッティ (2013)。 「ソフトウェア クローンの検出とリファクタリング」(PDF)。ISRN ソフトウェア エンジニアリング。2013 : 1 ~ 8。土井:10.1155/2013/129437。
- ^ Kapser, C.; Godfrey, MW、「"クローニングは有害であると考えられる" は有害であると考えられる」、第 13 回リバース エンジニアリングに関するワーキング カンファレンス (WCRE)、pp. 19-28、2006 年 10 月
- ^ Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). 「一貫性のないソフトウェアクローンと障害の関係について: 実証的研究」2016 IEEE 23rd International Conference on Software Analysis, Evolution, and Reengineering (SANER) . pp. 79–89. arXiv : 1611.08005 . doi :10.1109/SANER.2016.94. ISBN 978-1-5090-1855-0. S2CID 3154845。
- ^ Brenda S. Baker .重複コードを識別するプログラム。コンピューティングサイエンスと統計、24:49–57、1992年。
- ^ Ira D. Baxter 他「抽象構文木を用いたクローン検出」
- ^ 重複コードの視覚的検出は、Wayback Machineで 2006 年 6 月 29 日にMatthias Rieger、Stephane Ducasse によってアーカイブされました。
- ^ Yuan, Y. および Guo, Y. CMCD: カウントマトリックスベースのコードクローン検出、 2011 年 18 回アジア太平洋ソフトウェアエンジニアリング会議。IEEE、2011 年 12 月、pp. 250–257。
- ^ Chen, X., Wang, AY, & Tempero, ED (2014). コードクローン検出研究の複製と再現。ACSC (pp. 105-114)。
- ^ ブリチョフ、ピーター、マリウス・ミネア。 「アンチユニフィケーションを使用した重複コードの検出」ソフトウェアエンジニアリングに関する春/夏の若手研究者コロキウムの議事録。 No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской 2008 年。
外部リンク
- アラバマ大学バーミンガム校: コードクローン文学
- C#、VB.Net、ASPX、Ruby、Python、Java、C、C++、ActionScript、XAML で重複コードを見つける
