Quelltextklon

Bei den Quelltextklonen (auch Codeduplikate , Softwareklonen oder einfach nur Klonen ) handelt es sich insgesamt um die Abschnitte im Quelltext eines Programms. Klonen sind eine Form von Redundanz und durch Copy & Paste . Dann sind die negativen Auswirkungen auf die Wartung gestiegen, ein deutlicher Indikator für die mangelnde Qualität .

Ähnlichkeit

Bei Klon Handelt es sich im Allgemeinen um Ähnliche Quelltextabschnitte. DAMIT Ist Die Definition der Ähnlichkeit ein zentraler Punkt, wo available in der Forschung noch intensiver Diskutiert Wird. Es herrscht allerdings Übereinstimmung daruber that es keine universal einsetzbare Definition Gibt, Sondern sich this immer nach DM Beton Anwendungsfall Richter. Bei der Definition der Ähnlichkeit Sind unter Anderem sterben following Aspekte zu berücksichtigen:

Mindestlänge
Wenn das Programm auf atomaren Elementen (z. B. Schlüsselwörter, Operatoren, Bezeichner, …) steht, gibt es Programme, die für den Zweck des Programms verwendet werden. Allerdings gibts auf diese Ebene verkauft aussagekräftige Abstraktionsmöglichkeiten und diese atomaren Elemente sind auch sehr einfach. Daher hörte die Definition von Ähnlichkeit der Festsetzung einer Mindestlänge, die angibt, wer lange Codeabschnitte hat, die als Klone angesehen haben. In der Wildnis Einheit, gerichtet an sie, Erkennungsverfahren. Beispiele für Mindestlängen sind Werte wie 10 Segel, 100 Tokens, 7 Hinweise usw.
Normalisierung
Neben der Mindestlänge hat es sich bewärrt, Der Code ist genau der Definition von Ähnlichkeit zu normalisieren. Dies war auch beim Learning Outcome , Einrückungsstil und Kommentare im Code in Bezug auf Klone der Fall. Eine weitere oftmals angewandte Normalisierung ist sterben Abstraktion von Bezeichnern , d. H. Zwei Schleif Werden als angesehen klonen, Auch , ideal in der EINEN in und in der Ande j als Schleifenvariable used Wird. In ähnlicher Weise können literale normalisiert werden. Komplexere Normalisierung Könnte zum beispiel Darin Bestehen, bei kommutativDie Operation der Reihenfolgefolge von Operationen wird durch die Schleifenkonstrukte von der Kunst der Schleife zu Abstrahieren abgeschlossen. Was Normalisierung sinnvoll ist, richtet sich nach allgemeinem starkem Anwendungsfall. Wenn die Normalisierung aber einen großen Einfluss auf die Ergebnisse hatte, waren diese die Essenz des Seins. Hier ist es nicht erwähnenswert, die Erfahrung der Klonerkennung erforderlich.
Ungleiche Abschnitte
Auch wenn die Definition der Ähnlichkeit sehr schön weit ist, ist es möglich, unter Klone über kleine Unterabschnitte („Gaps“) zu zählen. Der Vorteil ist, dass mehrere kleine Klone zu größeren Klonen schmoren, war auf Redundanz auf höherer Ebene leicht gemacht. Die Lücken lassen sich auf Unterschiebungen zurückführen, die möglicherweise unerwünscht sind. Allerdings wird die Erkenntnis von Klonen nicht von allen Werkzeugen unterstützt. Zudem muss festgelegt werden, der viele Lücken einen Klon enthält.

Abgrenzung zu redundanten Literalen

Clone bestimmt sich daruber that Quelltextabschnitte Wacholder Gewiss Größe Zueinander ähnlich Sind. Aus diesem Grund spricht man bei einzelnen duplizierten Tokens üblicherweise nicht von Klon. Dies Betrifft Vorwiegend redundante Literal im Quelltext, sterben besser als Symbolische Konstante repräsentiert Werden sollten (zum beispiel alle wörtlichen Vorkommen Dezember 3,14159 Durch Eine Konstante mit DEM – Bezeichner PI ). Um sterben Wiederholung von Ausdrücken in den Quelltexten zu vermeiden, sollten sich auch schon aus Grund wo Wartbarkeit und der effizienteren Fehlersuche kategorisch Symbolische Konstante used Werden. [1]

Begriffe

Dies ist die Realisierung des Konzepts, das von Software Clone gegründet wurde.

Klon
Ein Quelltextabschnitt der zu einem anderen Quelltextabschnitt ähnlich ist. Alternativ wird auch der Begriff Fragment verwieden. Die Ähnlichkeit wird durch ein Klonpaar oder eine Klonklasse reprosentiert.
Typ-1-Klon
Identische Quelltextabschnitte bis auf Layout und Kommentare.
Typ-1-Klonpaar
int a = 0 ;
int b = a * a ;
String str = "Peter" ;
int a = 0 ; // Kommentar
 int b = a * a ;
String str = "Peter" ;
Typ-2-Klon
Typen 1 Klonen bei den verschiedenen Unterschichten in den Bezeichnern oder Literalen existieren.
Typ-2-Klonpaar
int a = 0 ;
int b = a * a ;
String str = "Peter" ;
int a = 0 ; // Kommentar
int x = a * a ;
String str = "Peter" ;
Typ-3-Klon
Typ-2-Klon tritt in die jugendlichen Abschnitte ein. In der englischen Sprache wird Literature auch von der Bezeichnung Beinahe-Miss Clone verwöhnt.
Typ-3-Klonpaar
int a = 0 ;
int b = a * a ;
String str = "Peter" ;
int a = 0 ; // Kommentar
int x = a * a ;
Druck ( b );
String str = "Peter" ;
Typ-4-Klon
Klone die Semantik ichich aber nie Zwingend syntaktisch ähnlich Geist. Die Synthetic Ähnlichkeit liegt typischerweise unter 16% und liegt in der Regel in Algorithmen, Datenstrukturen, Bibliotheken, Ein- / Ausgabebehandlung und dem objektorientierten Design. [2] Auf der Unmöglichheit der Bestimmung von Semantischer Gemütlichkeit hat dieser Klontyp wenig praktische Nutzen.
Klonpaar
Ein Klonpaar reprasiert die Relation zwischen genau zwei ähnlichen Quelltextabteilungen (Klonen).
Klonklasse
Eine Klonklasse repræsentiert die Relation zwischen zwei oder mehr verschiedenen Quelltextabschnitten (Klonen).
Klonüberdeckung
Der Teil des Systems der Teil eines Klons ist. Wir empfehlen, das Ausma der Redundanz in einem System zu quantifizieren.

Gründe

Klone entstehen schnell ausschließlich durch „copy – & – paste-Programmierung“. Für das Ende von Klonen gibt es eine Reihe von Gründen, die in den folgenden Schweißkategorien: [3]

  • Entwicklung Strategie: Best Practice Feature Wird als Vorlage für Neu zu erste Funktionalität verwendet. Code wird kopiert und nach Bedarf angepasst. Hierher gehören auch die Regeln, in denen Code ausgeführt wird, um die Funktionen des Systems zu erfüllen (Branching).
  • Vorteile bei der Wartung : Durch die Wiederverwendung von existierendem Code wurde die zukünftige Wartung errichtet. So wird zum Beispiel der Code wiederverwenden, um den Fehler zu minimieren. Sie können Komponenten vermeiden und eine bekannte Wartung ermöglichen.
  • Umgehen von Einschränkungen : Programmiersprachen bieten unterschiedliche Kunst der Abstraktionsmechanismen. Sollte in einer optimalisierten Situation sein, wird dieses Problem oft durch Klone gelöst. Klone können auch von Zeitdruck und Fehlenden Erkenntnissen des Entwicklers stammen.
  • Unabhängige Implementation : Auf den neuesten Stand der Kenntnisse wird die Funktionalität erweitert. Zuhören kann Klone durch die Nutzung von Libraries erstellen, das einzige Protokoll erforderlich.

Negative Auswirkungen

Klone wurden in Allgemein als Anti-Patterns gesehen, als sie sich „Prinzip nicht wiederholen “ (DRY) nennen und wenn sie sehr wichtig sind. Sie glauben, dass der Code Smells [4] an. Und auch wenn es eine Vielzahl von Gründern für ihre Entstehung gibt, so haben diese Klone mitunter negative Auswirkungen auf die Software und ihre Wartung.

  • Erhöhter Wartungsaufwand : Der Klon ist signifikant im Aufwand für die Wartung. Identischer Code muss unter Umständen öfter gelöscht und intelligent sein. Zusätzlicher Bedarf ist erforderlich, um zu verstehen, ob kleine Unterteile gewollt oder unbeachtet sind. Im Herbst muss eine Änderung mehr durchgeführt und getestet werden. Ich möchte, dass Sie diese Option verwenden, wenn Sie möchten, dass die Option „Kopie“ am Ende der Sitzung deaktiviert wird.
  • Inkonsistente Spende : Im Rahmen von Änderungen an Klonen bestmöglich die Gefahr, einzelne Kopien zu übersehen. Theses Problem ist umso stärker, Sie sind mehr Entwickler in einem Projekt beteiligt und unwissentlich von vornherein kopieren. Auch wird der beste Code als Vorlage verwendet und sollte am besten die Gefahr, dass diese Anpassung nicht korrekt durchgeführt wird. Ungewollte inkonsequente Änderungen können insbesondere ein problematisches Signal bilden, was bei Äderung um einen Bugfix der Fall ist. Es wird ein Problem behoben, und es wird angenommen, dass das Problem gelöst ist. This unbedeckt inconsistente Änderungen existieren in hoher Zahl in produktiven Systemen.[5]
  • Erhöhter Speicherbedarf : Eine weitere Konsequenz von Klonen ist, dass der Codeumfang größer ist als sein muss. So funktioniert der Speicherplatz der Quelltextdateien wie die Größe des Compilierten Systems. Es kann im Bereich der Computersysteme unsicher sein Probleme mit Hardware und Hardware . Zu einem höheren Codeumfang auch einen Zeitaufwand von Compiler zur Folge.
  • Kopieren von Fehlern : Es wird angenommen, dass der Quelltext kopiert wurde, in dem Fehler gefunden werden. In der Folge müssen die folgenden Stellen des Quelltxtes gesucht und behoben werden. Dabei widmet sich die Gefahr, nur Vorkommen zu übersehen.

Klonerkennung

Die Existenz der Vielzahl und Klonkennungsverfahren, [6] die das Hauptziel der Programmdarstellung ist, umfasst die Arbeit, Kategorie Schweißen. Die Elle Verfahren unterscheiden sich unter Anderem in der Laufzeit , Komplexität , Qualität der ergebnisse und verfügbaren Normalisierungen.

  • Text : Diese Verfahren haben keinlehrsprachspezifisches Löschen und interpretieren den Quelltext als reinen Text. Dave sind diese Verfahren schnell und einfach zu implementieren. Der Nacht ist, dass sie vom Layout des Quelltxtes abhängig sind und nur wenige Möglichkeiten der Normalisierung Bienen.
  • Token : Diese Verfahren basieren auf leinerischen Analysen des Quelltxtes und der Arbeit der Sequenz aus Tokens. This Verfahren sind immer noch vergilingich schnell und einfach zu implementieren. Durch eine bestimmte Sprache schweissen sich Normalisierungen wie z. B. das Ignorieren von Kommentaren oder der Abstrahieren von Bezeichnern durchführen. Zudem sind diese Verfahren kein Dummkopf von Unberührbaren im Layout der Quelltextes.
  • Baum : Diese Verfahren arbeitet an ihnen abstrahiert Syntaxbaum (AST) von Programmen und suchen darin nach ähnlichen Teilbäumen. Dadurch Käfer Sie noch weitere Möglichkeiten der Normalisierung wie z. B. die Abstraktion von der Artiner Schleife oder die Reihenfolge der Operanden in Commutativen Operationen. Baumasierte Verfahren sind sehr komplex, zu implementieren und nicht mehr zu tun. Bitte beachten Sie, dass der Quelltext syntaktisch korrekt ist und ausgeschlossen wird . Dies ist ein deutliches Nachtteil gegenüber textbasierten und tokenbasierten Verfahren.
  • Graph : Diese Verfahren arbeitet am Programm Dependency Graph (PDG) und wie bei Teilgraphen. Damm Köpfe sind die Komplexität der Umsetzung und der langfristigen Verfahren. Ihr Vorteil besteht darin, dass Sie Klone mit mindne syntaktische Ähnlichkeiten erkennen können, die sich als Grundton für andere Verfahren herausstellten.
  • Metriks : This Elle Verfahren berechnen für Bestimmt Entitäten im Quelltext (z B.. Methoden ) Metriks und Erkennen Clone Durch den Vergleich of this Metriks. Dein Verstand ist einfach und leicht zu implementieren. Der Teil besteht nur aus, es kann nur auf der vorderste Granularitätsstufe gefunden werden. So können z. B. Keine Klone wurde in der Mitte von Methoden gefunden, die zur Berechnung von Metriken auf Basis umfassender Methoden verwendet wurden. In der Praxis stellt das Verfahren fest, dass Anwendung, wie viele der wichtigsten, von höchster Qualität sind.

Nicht irgendein Verfahren lässt sich die Kategorien kategorisch zuordnen, weil manche Elemente aus verdeckten Kategorien verären. So existieren z. B. Hybride Verfahren , die simultane Syntaxsynthese, wobei man ein serielles und ein tokenbasiertes Verfahren zur Erkennung von Klonen in der Sequenz der seriellen Knoten einrechnet.

Weiterhin schweißen jedoch, um das Clonerkennungsverfahren aufzudecken, wegen inkrementeller Arbeit oder nicht. Ein inkrementelles Verfahren [7] [8] Klone erkennt in mehreren aufeinanderfolgenden Versionen des Quelltextes. Im vergleich zur wiederholten Version eines Verfahrens, das in der Version für alle Versionen verwendet wird. Dadurch Bienen inkrementelle Verfahren einen bestimmten Geschwindigkeitswert bei der Klonerkennung über mehrere Versionen des Quelltextes.

Werkzeuge

Es Gibt verschiedene Werkzeuge zur statischen Analyse von Programm – Code, sterben Auch Quelltextklone FINDEN can. Dazu Ohr Zahlreiche freie Werkzeug Wie das PMD -Plugin CPD (Copy / Paste Detector) , Clone Digger(für Python und Java ), cppcheck (für C ++ und C ) und Conqat (für Ada , ABAP , C # , C , C ++ , Cobol , Java , Visual Basic , PL / ISowie) Proprietäre Werkzeuge Wie CCFinder (Code – Clone Finder) oder Simian (Ähnlichkeit Analyser) .

Klonmanagement

Klon-Management- Phase alle Aktivitäten im Kontext mit Klonen zusammen. [9] Dazu hört man die Arbeit des Klerus von Klonen als auch die Auswahl und Durchführung entsprechender Gegenmaßnahmen. Hast du über die anderen Dinge nachgedacht:

Entfernten

Diese Klone wurden einschließlich der aufgegebenen Abstraktion erhalten, mit denen redundante Quelltextabschnitte zusammengeführt werden können. Dies Kann zum beispiel Durch Auslagerung von wiederkehrendem Algorithmus in sterben Prozeduren oder Methoden ERFOLG. [10] Häufig wird für das Extract-Verfahren – Refactoring angewendet.

In objektorientierten Sprache Besteht zudem sterben möglichkeit, Clone Durch ausnutzen , wo Vererbung und das Zusammenfassen wo Exemplar Gemeinsame Einer Basisklasse (Pull-Up Method- Refactoring ) zu entfernet. [11]

In Sprachen, sterben EINEN Präprozessor Knochen halten, lassen sich Clone unter umständen Durch entsprechende Makros entfernet. Bei Klon, sterben Mehrere dateien oder Subsystem Ganze umfassen ( „Structural Cloning“), bietet BCVI ein, sterben Clone Durch Auslagerung in Module oder Bibliotheken zu entfernet.

Beobachten

Wickle keine Klone ein, nur einzelne entfernen. Eine der Alternativen zur Arbeit von Darin, die die Arbeit eines Arbeiters klonen. Bei der Änderung eines Entwicklers auf dem Vorhandenen werden weitere Kopien hingeschrieben. Daddy wird das Gegenteil von inkonsistenten Vermijdungen.

Klone außerhalb des Quelltextes

Klonerkennung fokusiert sich auf ähnliche Abschnitte im Quelltext eines Programms. Darüber hinaus existiert Klone aber auch in anderen Artefakten der Softwareentwicklung wie z. B. das Modell [12] [13] [14] oder Anforderungsspezifikationen . [15] [16] Die Gründe für die Klone und deren negative Auswirkungen sind weitestgehend übertragbar. Die Definition von Ähnlichkeit muss hingepasst werden. Wählt man die Erkenntnis von Klonen im Quelltext, so werden in anderen Artefakten oder intensiver Belagerung festgelegte Verfahren vorbereitet.

Beispiel

Das folgende Beispiel in Java zeigt , welche Klone durch ein Extrakt-Verfahren- Refactoring entfernt werden. Der Quelltext bereinigt die Summe der Werte in zwei Arrays.

public int Summe ( int [] Werte1 , int [] Werte2 ) {
 int Summe1 = 0 ;
 int sum2 = 0 ;
 für ( int i = 0 ; i < Werte1 . Länge ; i ++)
 {
 Summe1 + = Werte1 [ i ];
 }
 für ( int i = 0 ; i < Werte2. Länge ; i ++)
 {
 sum2 + = Werte2 [ i ];
 }
 Rückgabe Summe1 + Summe2 ;
}

Die Schleife, der die Berechnung gehört, mag in ihrer Funktion außerordentlich sein.

public int Summe ( int [] Werte )
{
 int Summe = 0 ;
 für ( int i = 0 ; i < Werte . Länge ; i ++)
 {
 Summe + = Werte [ i ];
 }
 Rück Summe ;
}

Die neue Funktion kann zum Erstellen eines einzelnen Jobs verwendet werden. Dave warden de Klone entfernt und Redundanz verringert.

public int sum ( int [] Werten1 , int [] Werte2 ) {
 return sum ( Werten1 ) + sum ( Werte2 );
}

Die Berechnung der Summe der Werte eines Datensatzes stellt einen Klon außerhalb des Quelltextes dar, der ab 8 für die Notwendigkeit Anforderungen vorhanden ist. Die public int sum(int[] values)Methode Kann DAHER gelöscht Werden und Die Zweite Methode folgendermaßen Geändert werden:

public int sum ( int [] Werte1 , int [] Werte2 ) {
 return IntStream . oder ( Werte1 ). Summe () + IntStream . oder ( Werte2 ). Summe ();
}

Literatur

  • Martin Fowler : Refactoring. Wer ist der Designer der Software? Addison Wesley, München 2000 (Originaltitel: Refactoring. Verbesserung der Gestaltung bestehender Codes , übersetzt von Bernd Kahlbrandt), ISBN 3-8273-1630-8 .
  • Nils Göde: Klon Evolution. Dissertation, Universität Bremen, Logos Verlag Berlin GmbH, Berlin 2011, ISBN 978-3-8325-2920-8 .
  • Elmar Jürgens, Florian Deißenböck, Benjamin Hummel: Eine Werkbank für die Klondetektionsforschung . (PDF, 359 kB) In: Proceedings of the 31 st International Conference on Software Engineering , IEEE Computer Society, 2009.
  • Elmar Jürgens, Florian Deißenböck, Benjamin Hummel, Stefan Wagner: Sind Kodierklone wichtig? (PDF, 259 kB) In: Proceedings of the 31 st International Conference on Software Engineering , S. 485-495. IEEE Computer Gesellschaft, 2009.
  • Rainer Koschke: Überblick über die Forschung zu Software Clones . (PDF; 222 KB) Tagesseminar: Vervielfältigung, Redundanz und Ähnlichkeit in der Software, 2006.
  • Dhavleesh Rattan, Rajesh Bhatia, Maninder Singh: Software Klon Erkennung: Eine systematische Überprüfung. Information and Software Technology, Bd. 55, 2013, Ausgabe 7, S. 1165-1199.
  • Chanchal Kumar Roy, James R. Cordy: Eine Umfrage zur Software-Klonerkennung . (PDF; 577 KB) Technischer Bericht, Queens University in Kingston, Ontario (Kanada) 2007.

Weblinks

  • Robert Tairas: Code Clones Literatur . Abgerufen am 28. August 2013.

Einzelstunden

  1. Hochspringen↑ Markus Bautsch: Codewiederholung – Symbolische Konstanten . In: Strukturierte Programmierung . – Wiki
  2. Hochspringen↑ Stefan Wagner, Asim Abdulkhaleq, Ivan Bogičević, Jan-Peter Ostberg, Jasmin Ramandani. Wie unterscheiden sich funktionell ähnliche Code-Klone? . PeerJ Preprints, 2015.
  3. Hochspringen↑ Chanchal Kumar Roy, James R. Cordy: Eine Studie zur Software-Klonerkennung . (PDF; 577 KB) Technischer Bericht, Queens University in Kingston, Ontario (Kanada) 2007, S. 3-7.
  4. Hochspringen↑ Martin Fowler : Refactoring. Wer ist der Designer der Software? Addison Wesley, München 2000 (Originaltitel: Refactoring. Verbesserung der Gestaltung bestehender Codes , übersetzt von Bernd Kahlbrandt), ISBN 3-8273-1630-8 , S. 67-82
  5. Hochspringen↑ Elmar Jürgens, Florian Deißenböck, Benjamin Hummel, Stefan Wagner: Sind Codeklone wichtig? (PDF, 259 kB) In: Proceedings of the 31 st International Conference on Software Engineering . IEEE Computer Society, 2009, S. 485-495.
  6. Hochspringen↑ Nils Göde: Klon Evolution. Dissertation, Universität Bremen, 2011, S. 15-21.
  7. Hochspringen↑ Nils Göde, Rainer Koschke: Inkrementelle Klonerkennung . In: Proceedings of the 13 th European Conference on Software Maintenance und Reengineering . IEEE Computer Society, 2009, S. 219-228.
  8. Hochspringen↑ Benjamin Hummel, Elmar Jürgens, Lars Heinemann, Michael Conradt: Indexbasierte Klonerkennung. Inkrementell, verteilt, skalierbar . (PDF, 440 kB) In: Proceedings of the 26 th International Conference on Software Maintenance . IEEE Computer Gesellschaft, 2010.
  9. Hochspringen↑ Rainer Koschke: Frontiers oder Software-Klon-Management . In: Proceedings of Frontiers oder Softwarewartung . IEEE Computer Society, 2008, S. 119-128.
  10. Hochspringen↑ Markus Bautsch: Codewiederholung – Methodenaufrufe . In: Strukturierte Programmierung . – Wiki
  11. Hochspringen↑ Markus Bautsch: Vermassung von Codewiederholung durch Vererbung . In: Strukturierte Programmierung . – Wiki
  12. Hochspringen↑ Florian Deißenböck, Benjamin Hummel, Elmar Jürgens, Bernhard Schätz, Stefan Wagner, Jean-François Girard, Stefan Teuchert: Klonerkennung in der automobilen modellbasierten Entwicklung . (PDF, 409 kB) In:Proceedings of the 30 th International Conference on Software Engineering . ACM, 2008, S. 603-612.
  13. Hochspringen↑ Florian Deißenböck, Benjamin Hummel, Elmar Jürgens, Michael Pfaehler: Modellklonerkennung in der Praxis . (PDF, 291 kB) In: Proceedings of the 4 th International Workshop on Software Clones . ACM, 2010, S. 57-64.
  14. Hochspringen↑ Harald Störrle: Klonerkennung in UML-Domänenmodellen. In: Proceedings of the 4 th European Conference on Software Architecture . ACM, 2010, Companion Volume, S. 285-293.
  15. Hochspringen↑ Christoph Domann, Elmar Jürgens, Jonathan Streit: Der Fluch des Copy & Paste-Cloning in der Anforderungsspezifikation . (PDF; 107 kB) In: Proceedings des 3. Internationalen Symposiums zum Empirischen Software Engineering und Measurement . IEEE Computer Society, 2009, S. 443-446.
  16. Hochspringen↑ Elmar Jürgens, Florian Deißenböck, Martin Feilkas, Benjamin Hummel, Bernhard Schaetz, Stefan Wagner, Christoph Domann, Jonathan Streit: Kann Klonerkennung Qualitätsbewertungen von Anforderungsspezifikationen unterstützen? (PDF, 400 kB) In: Proceedings der 32 nd International Conference on Software Engineering . ACM, 2010, S. 79-88.