www.wikidata.de-de.nina.az
Bei Quelltextklonen auch Codeduplikate Softwareklonen oder einfach nur Klonen handelt es sich um ahnliche Abschnitte im Quelltext eines Computerprogramms Solche Klone sind eine Form von redundantem Code und entstehen vorwiegend durch Kopieren und Einfugen Da sie negative Auswirkungen auf die Wartung haben sind Klone ein starker Indikator fur mangelnde Qualitat Inhaltsverzeichnis 1 Ahnlichkeit 1 1 Abgrenzung zu redundanten Literalen 2 Begriffe 3 Grunde 4 Negative Auswirkungen 5 Klonerkennung 5 1 Werkzeuge 6 Klonmanagement 6 1 Entfernen 6 2 Beobachten 7 Klone ausserhalb des Quelltextes 8 Beispiel 9 Literatur 10 Weblinks 11 EinzelnachweiseAhnlichkeit BearbeitenBei Klonen handelt es sich im Allgemeinen um ahnliche Quelltextabschnitte Damit ist die Definition der Ahnlichkeit ein zentraler Punkt der auch in der Forschung noch intensiv diskutiert wird Es herrscht allerdings Ubereinstimmung daruber dass es keine universell einsetzbare Definition gibt sondern sich diese immer nach dem konkreten Anwendungsfall richtet Bei der Definition der Ahnlichkeit sind unter anderem die folgenden Aspekte zu berucksichtigen Mindestlange Da sich jedes Programm aus den atomaren Elementen z B Schlusselworter Operatoren Bezeichner der jeweiligen Programmiersprache zusammensetzt besteht auf dieser Ebene immer Ahnlichkeit zwischen verschiedenen Codefragmenten Allerdings gibt es auf dieser Ebene selten sinnvolle Abstraktionsmoglichkeiten und diese atomaren Elemente schon als Klone anzusehen ist selten hilfreich Daher gehort zur Definition der Ahnlichkeit die Festlegung einer Mindestlange die angibt wie lang Codeabschnitte mindestens sein mussen damit sie als Klone angesehen werden In welcher Einheit diese Mindestlange angegeben wird richtet sich nach dem Erkennungsverfahren Beispiele fur Mindestlangen sind Werte wie 10 Zeilen 100 Tokens 7 Anweisungen usw Normalisierung Neben der Mindestlange hat es sich bewahrt den Code hinsichtlich der Definition von Ahnlichkeit zu normalisieren So werden in vielen Fallen Leerraume Einruckungsstil und Kommentare im Code in Bezug auf Klone ignoriert Eine weitere oftmals angewandte Normalisierung ist die Abstraktion von Bezeichnern d h zwei Schleifen werden als Klone angesehen auch wenn in der einen i und in der anderen j als Schleifenvariable verwendet wird In ahnlicher Weise konnen Literale normalisiert werden Komplexere Normalisierung konnte zum Beispiel darin bestehen bei kommutativen Operationen die Reihenfolge der Operanden eindeutig zu machen oder bei Schleifenkonstrukten von der Art der Schleife zu abstrahieren Welche Normalisierung sinnvoll ist richtet sich im Allgemeinen stark nach dem Anwendungsfall Da die Normalisierung aber einen sehr grossen Einfluss auf die Ergebnisse hat sollte diese gewissenhaft vorgenommen werden Hierfur ist nicht zuletzt eine gewisse Erfahrung im Bereich der Klonerkennung erforderlich Ungleiche Abschnitte Gaps Auch wenn man mit der Normalisierung die Definition der Ahnlichkeit schon sehr weit fassen kann ist weiterhin zu uberlegen ob Klone daruber hinaus kleinere ungleiche Abschnitte Gaps beinhalten durfen Der Vorteil ist dass mehrere kleine Klone dadurch zu grosseren Klonen verschmelzen was die Redundanz auf hoherer Ebene sichtbar macht Die Gaps weisen zudem auf Unterschiede hin die moglicherweise unbeabsichtigt sind Allerdings wird die Erkennung von Klonen mit Gaps nicht von allen Werkzeugen unterstutzt Zudem muss festgelegt werden wie viele Gaps ein Klon enthalten darf Abgrenzung zu redundanten Literalen Bearbeiten Klone definieren sich daruber dass Quelltextabschnitte einer gewissen Grosse zueinander ahnlich sind Aus diesem Grund spricht man bei einzelnen duplizierten Tokens ublicherweise nicht von Klonen Dies betrifft vorwiegend redundante Literale im Quelltext die besser als symbolische Konstante reprasentiert werden sollten zum Beispiel alle Vorkommen des Literals 3 14159 durch eine Konstante mit dem Bezeichner PI Um die Wiederholung von Ausdrucken in den Quelltexten zu vermeiden sollten also schon aus Grunden der Wartbarkeit und der effizienteren Fehlersuche kategorisch symbolische Konstanten verwendet werden 1 Begriffe BearbeitenEs existiert eine Reihe von Begriffen die sich mit der Zeit im Bereich der Softwareklone etabliert haben Klon Ein Quelltextabschnitt der zu mindestens einem anderen Quelltextabschnitt ahnlich ist Alternativ wird auch der Begriff Fragment verwendet Die Ahnlichkeit wird entweder durch ein Klonpaar oder eine Klonklasse reprasentiert Typ 1 Klone Identische Quelltextabschnitte bis auf Layout und Kommentare Typ 1 Klonpaar int a 0 int b a a String str Peter int a 0 Comment int b a a String str Peter Typ 2 Klone Typ 1 Klone bei denen zusatzlich Unterschiede in den Bezeichnern oder Literalen existieren Typ 2 Klonpaar int a 0 int b a a String str Peter int a 0 Comment int x a a String str Peter Typ 3 Klone Typ 2 Klone die ungleiche Abschnitte Gaps enthalten Insbesondere in der englischsprachigen Literatur wird auch der Begriff Near Miss Clone verwendet Typ 3 Klonpaar int a 0 int b a a String str Peter int a 0 Comment int x a a print b String str Peter Typ 4 Klone Klone die semantisch ahnlich aber nicht zwingend syntaktisch ahnlich sind Die syntaktische Ahnlichkeit liegt typischerweise unter 16 und andere Unterschiede liegen in den genutzten Algorithmen Datenstrukturen benutzten Bibliotheken Ein Ausgabebehandlung und dem objektorientierten Design 2 Aufgrund der Unmoglichkeit der Bestimmung von semantischer Ahnlichkeit hat dieser Klontyp wenig praktischen Nutzen Klonpaar Ein Klonpaar reprasentiert die Relation zwischen exakt zwei ahnlichen Quelltextabschnitten Klonen Klonklasse Eine Klonklasse reprasentiert die Relation zwischen zwei oder mehr ahnlichen Quelltextabschnitten Klonen Klonuberdeckung Der Anteil des Systems der Teil eines Klons ist Wird haufig verwendet um das Ausmass der Redundanz in einem System zu quantifizieren Grunde BearbeitenKlone entstehen fast ausschliesslich durch copy amp paste Programmierung Fur das Entstehen von Klonen gibt es eine Reihe von Grunden die sich in die folgenden Kategorien einteilen lassen 3 Entwicklungsstrategie Bestehende Funktionalitat wird als Vorlage fur neu zu erstellende Funktionalitat verwendet Dabei wird der bereits existierende Code kopiert und nach Bedarf angepasst Hierzu zahlen auch Situationen in denen Code dupliziert wird um Anderungen zu erproben ohne die Funktion des Systems zu gefahrden Branching Vorteile bei der Wartung Durch die Wiederverwendung von existierendem Code soll die zukunftige Wartung erleichtert werden So wird zum Beispiel bewahrter Code wiederverwendet um das Risiko neuer Fehler zu minimieren Ausserdem konnen durch das Kopieren von Code unerwunschte Abhangigkeiten zwischen Komponenten vermieden und eine getrennte Wartung ermoglicht werden Umgehen von Einschrankungen Programmiersprachen bieten unterschiedliche Arten von Abstraktionsmechanismen Sollte in einer bestimmten Situation keine geeignete Abstraktionsmoglichkeit vorhanden sein wird dieses Problem oft durch Klone gelost Klone konnen aber auch aufgrund von Zeitdruck und fehlenden Kenntnissen des Entwicklers entstehen Unabhangige Implementierung Aufgrund mangelnder Kenntnis bestehender Funktionalitat wird diese mehrfach implementiert Zudem konnen Klone durch die Verwendung von Bibliotheken entstehen die ein bestimmtes Protokoll erfordern Negative Auswirkungen BearbeitenKlone werden im Allgemeinen als Anti Pattern angesehen da sie dem Prinzip Don t repeat yourself DRY widersprechen und als das am haufigsten auftretende Merkmal fur schlechten Code gelten Sie fuhren aus den genannten Grunden die Liste der sogenannten Code Smells 4 an Auch wenn es eine Vielzahl von Grunden fur ihre Entstehung gibt so haben Klone mitunter gravierende negative Auswirkungen auf die Software und ihre Wartung Erhohter Wartungsaufwand Klone erhohen den Aufwand fur die Wartung signifikant Oft muss identischer Code mehrfach gelesen und verstanden werden Zusatzlicher Aufwand ist erforderlich um zu verstehen ob kleine Unterschiede gewollt oder unbeabsichtigt sind Im Fall einer Anderung muss diese mehrfach durchgefuhrt und getestet werden Dabei muss fur jede Kopie mindestens gepruft werden ob die Anderung auch hier durchgefuhrt werden muss selbst wenn die Kopie am Ende nicht verandert wird Inkonsistente Anderungen Im Rahmen von Anderungen an Klonen besteht immer die Gefahr einzelne Kopien zu ubersehen Dieses Problem ist umso starker je mehr Entwickler in einem Projekt beteiligt sind und unwissentlich voneinander kopieren Auch wenn bestehender Code als Vorlage verwendet wird und angepasst werden muss besteht immer die Gefahr dass diese Anpassung nicht korrekt durchgefuhrt wird Ungewollt inkonsistente Anderungen konnen insbesondere dann problematisch sein wenn es sich bei der Anderung um einen Bugfix handelt Der Fehler wird an einer Stelle behoben und es wird angenommen dass das Problem damit gelost sei obwohl der Fehler an noch mindestens einer anderen Stelle im System verbleibt Diese unbeabsichtigten inkonsistenten Anderungen existieren nachweislich in hoher Zahl in produktiven Systemen 5 Erhohter Speicherbedarf Klone vergrossern den Codeumfang Dies betrifft sowohl den Speicherplatz der Quelltextdateien als auch die Grosse des kompilierten Systems Dies kann insbesondere im Bereich der eingebetteten Systeme zu Problemen fuhren und teurere Hardware erforderlich machen Zudem hat ein erhohter Codeumfang auch einen langere Kompilierung zur Folge Kopieren von Fehlern Es besteht die Gefahr dass der kopierte Quelltext Fehler enthalt In der Folge kommt es zu den Problemen die unter Inkonsistente Anderungen beschrieben sind Klonerkennung BearbeitenEs existiert eine Vielzahl an Klonerkennungsverfahren 6 die sich grob anhand der Programmreprasentation mit der sie arbeiten kategorisieren lassen Die Verfahren unterscheiden sich unter anderem in der Laufzeit Komplexitat Qualitat der Ergebnisse und verfugbaren Normalisierungen Text Diese Verfahren haben keinerlei sprachspezifisches Wissen und interpretieren den Quelltext als reinen Text Dadurch sind diese Verfahren vergleichsweise schnell und einfach zu implementieren Der Nachteil ist dass sie vom Layout des Quelltextes abhangig sind und nur sehr wenige Moglichkeiten der Normalisierung bieten Tokens Diese Verfahren basieren auf einer lexikalischen Analyse des Quelltextes und arbeiten auf einer Sequenz aus Tokens Diese Verfahren sind immer noch vergleichsweise schnell und einfach zu implementieren Durch eine gewisse Kenntnis der analysierten Sprache lassen sich Normalisierungen wie z B das Ignorieren von Kommentaren oder das Abstrahieren von Bezeichnern durchfuhren Zudem sind diese Verfahren nicht anfallig gegen Unterschiede im Layout des Quelltextes Baum Diese Verfahren arbeiten auf dem abstrakten Syntaxbaum AST des Programms und suchen darin nach ahnlichen Teilbaumen Dadurch bieten sie noch weitere Moglichkeiten der Normalisierung wie z B die Abstraktion von der Art einer Schleife oder die Reihenfolge der Operanden in kommutativen Operationen Baumbasierte Verfahren sind allerdings komplexer zu implementieren und benotigen deutlich mehr Laufzeit Zudem erfordern sie dass der Quelltext syntaktisch korrekt ist und geparst werden kann Dies ist ein deutlicher Nachteil gegenuber textbasierten und tokenbasierten Verfahren Graph Diese Verfahren arbeiten zumeist auf dem Program Dependency Graph PDG und suchen nach ahnlichen Teilgraphen Damit sind sie die am komplexesten zu implementierenden und zugleich langsamsten Verfahren Ihr Vorteil besteht darin dass sie Klone mit geringer syntaktischer Ahnlichkeit erkennen konnen die von keinem der anderen Verfahren gefunden werden Metriken Diese Verfahren berechnen fur bestimmte Entitaten im Quelltext z B Methoden Metriken und erkennen Klone durch den Vergleich dieser Metriken Sie sind recht einfach zu implementieren und auch vergleichsweise schnell Der Nachteil besteht darin dass Klone nur auf der vorher festgelegten Granularitatsstufe gefunden werden konnen So konnen z B keine Klone innerhalb von Methoden gefunden werden wenn die Metriken auf Basis ganzer Methoden berechnet werden In der Praxis finden diese Verfahren wenig Anwendung da viele Entitaten rein zufallig ahnliche Metrikwerte aufweisen ohne dass eine syntaktische oder semantische Ahnlichkeit besteht Nicht jedes Verfahren lasst sich eindeutig einer der Kategorien zuordnen da manche Verfahren Elemente aus verschiedenen Kategorien vereinen So existieren z B hybride Verfahren die zunachst einen abstrakten Syntaxbaum erstellen diesen dann serialisieren und ein tokenbasiertes Verfahren zur Erkennung von Klonen in der Sequenz der serialisierten Knoten einsetzen Weiterhin lassen sich Klonerkennungsverfahren danach unterschieden ob sie inkrementell arbeiten oder nicht Ein inkrementelles Verfahren 7 8 erkennt Klone in mehreren aufeinanderfolgenden Versionen des Quelltextes Im Vergleich zur wiederholten Anwendung eines nicht inkrementellen Verfahrens fur jede einzelne Version machen sich inkrementelle Verfahren die Analyseergebnisse der vorherigen Version zunutze Dadurch bieten inkrementelle Verfahren einen deutlichen Geschwindigkeitsvorteil bei der Klonerkennung uber mehrere Versionen des Quelltextes Werkzeuge Bearbeiten Es gibt verschiedene Werkzeuge zur statischen Analyse von Programmcode die auch Quelltextklone finden konnen Dazu gehoren zahlreiche freie Werkzeugen wie das PMD Plugin CPD Copy Paste Detector Clone Digger fur Python und Java Cppcheck fur C und C und ConQAT fur Ada ABAP C C C COBOL Java Visual Basic PL I sowie proprietare Werkzeuge wie CCFinder Code Clone Finder oder Simian Similarity Analyser Klonmanagement BearbeitenKlonmanagement fasst alle Tatigkeiten im Umgang mit Klonen zusammen 9 Dazu gehort sowohl die werkzeuggestutzte Erkennung von Klonen als auch die Auswahl und Durchfuhrung entsprechender Gegenmassnahmen Zu den moglichen Gegenmassnahmen zahlen unter anderem Entfernen Bearbeiten Die Klone werden entfernt indem eine geeignete Abstraktion geschaffen wird mit der die redundanten Quelltextabschnitte vereinheitlicht werden konnen Dies kann zum Beispiel durch die Auslagerung von wiederkehrenden Algorithmen in Prozeduren oder Methoden erfolgen 10 Haufig wird hierfur das Extract Method Refactoring angewendet In objektorientierten Sprache besteht zudem die Moglichkeit Klone durch Ausnutzen der Vererbung und das Zusammenfassen der Kopien in einer gemeinsamen Basisklasse Pull Up Method Refactoring zu entfernen 11 In Sprachen die einen Praprozessor beinhalten lassen sich Klone unter Umstanden durch entsprechende Makros entfernen Bei Klonen die mehrere Dateien oder ganze Subsysteme umfassen Strukturelle Klone bietet sich an die Klone durch Auslagerung in Module oder Bibliotheken zu entfernen Beobachten Bearbeiten Nicht immer lassen Klone sich einfach entfernen Ein alternativer Umgang besteht darin die Klone durch ein entsprechendes Werkzeug zu beobachten Bei der Anderung eines Klons wird der Entwickler auf das Vorhandensein weiterer Kopien hingewiesen Dadurch wird das Risiko von ungewollt inkonsistenten Anderungen vermieden Klone ausserhalb des Quelltextes BearbeitenKlonerkennung fokussiert sich stark auf ahnliche Abschnitte im Quelltext eines Programms Daruber hinaus existieren Klone aber auch in anderen Artefakten der Softwareentwicklung wie z B Modellen 12 13 14 oder Anforderungsspezifikationen 15 16 Die Grunde fur die Klone und deren negative Auswirkungen sind weitestgehend ubertragbar Die Definition der Ahnlichkeit hingegen muss angepasst werden Wahrend es fur die Erkennung von Klonen im Quelltext bereits etablierte Verfahren gibt wird an der Erkennung von Klonen in anderen Artefakten noch intensiv geforscht Beispiel BearbeitenDas folgende Beispiel in Java zeigt wie Klone durch ein Extract Method Refactoring entfernt werden konnen Der Quelltext berechnet die Summe der Werte in zwei Arrays public int sum int values1 int values2 int sum1 0 int sum2 0 for int i 0 i lt values1 length i sum1 values1 i for int i 0 i lt values2 length i sum2 values2 i return sum1 sum2 Die Schleife die die eigentliche Berechnung vornimmt kann in eine eigene Funktion extrahiert werden public int sum int values int sum 0 for int i 0 i lt values length i sum values i return sum Die neue Funktion kann fur jedes Array einmal aufgerufen werden Dadurch wurden die Klone entfernt und die Redundanz verringert public int sum int values1 int values2 return sum values1 sum values2 Die Berechnung der Summe der Werte eines Arrays stellt einen Klon ausserhalb des Quelltextes dar da ab Java 8 fur derartige Anforderungen Streams existieren Die public int sum int values Methode kann daher geloscht werden und die zweite Methode folgendermassen geandert werden public int sum int values1 int values2 return IntStream of values1 sum IntStream of values2 sum Literatur BearbeitenMartin Fowler Refactoring Wie Sie das Design vorhandener Software verbessern Addison Wesley Munchen 2000 Originaltitel Refactoring Improving The Design Of Existing Code ubersetzt von Bernd Kahlbrandt ISBN 3 8273 1630 8 Nils Gode Clone Evolution Dissertation Universitat Bremen Logos Verlag Berlin GmbH Berlin 2011 ISBN 978 3 8325 2920 8 Elmar Juergens Florian Deissenboeck Benjamin Hummel A Workbench for Clone Detection Research PDF 359 kB In Proceedings of the 31st International Conference on Software Engineering IEEE Computer Society 2009 Elmar Juergens Florian Deissenboeck Benjamin Hummel Stefan Wagner Do code clones matter PDF 259 kB In Proceedings of the 31st International Conference on Software Engineering S 485 495 IEEE Computer Society 2009 Rainer Koschke Survey of Research on Software Clones PDF 222 kB Dagstuhl Seminar Duplication Redundancy and Similarity in Software 2006 Dhavleesh Rattan Rajesh Bhatia Maninder Singh Software clone detection A systematic review Information and Software Technology Band 55 2013 Ausgabe 7 S 1165 1199 Chanchal Kumar Roy James R Cordy A survey on software clone detection research PDF 577 kB Technical report Queens University at Kingston Ontario Canada 2007 Weblinks BearbeitenRobert Tairas Code Clones Literature Abgerufen am 28 August 2013 Einzelnachweise Bearbeiten Markus Bautsch Codewiederholung Symbolische Konstanten In Strukturierte Programmierung Wikibook Stefan Wagner Asim Abdulkhaleq Ivan Bogicevic Jan Peter Ostberg Jasmin Ramandani How are functionally similar code clones different PeerJ Preprints 2015 Chanchal Kumar Roy James R Cordy A survey on software clone detection research PDF 577 kB Technical report Queens University at Kingston Ontario Canada 2007 S 3 7 Martin Fowler Refactoring Wie Sie das Design vorhandener Software verbessern Addison Wesley Munchen 2000 Originaltitel Refactoring Improving The Design Of Existing Code ubersetzt von Bernd Kahlbrandt ISBN 3 8273 1630 8 S 67 82 Elmar Juergens Florian Deissenboeck Benjamin Hummel Stefan Wagner Do code clones matter PDF 259 kB In Proceedings of the 31st International Conference on Software Engineering IEEE Computer Society 2009 S 485 495 Nils Gode Clone Evolution Dissertation Universitat Bremen 2011 S 15 21 Nils Gode Rainer Koschke Incremental clone detection In Proceedings of the 13th European Conference on Software Maintenance and Reengineering IEEE Computer Society 2009 S 219 228 Benjamin Hummel Elmar Juergens Lars Heinemann Michael Conradt Index based code clone detection Incremental distributed scalable PDF 440 kB In Proceedings of the 26th International Conference on Software Maintenance IEEE Computer Society 2010 Rainer Koschke Frontiers of software clone management In Proceedings of Frontiers of Software Maintenance IEEE Computer Society 2008 S 119 128 Markus Bautsch Codewiederholung Methodenaufrufe In Strukturierte Programmierung Wikibook Markus Bautsch Vermeidung von Codewiederholung durch Vererbung In Strukturierte Programmierung Wikibook Florian Deissenboeck Benjamin Hummel Elmar Jurgens Bernhard Schatz Stefan Wagner Jean Francois Girard Stefan Teuchert Clone detection in automotive model based development PDF 409 kB In Proceedings of the 30th International Conference on Software Engineering ACM 2008 S 603 612 Florian Deissenboeck Benjamin Hummel Elmar Juergens Michael Pfaehler Model clone detection in practice PDF 291 kB In Proceedings of the 4th International Workshop on Software Clones ACM 2010 S 57 64 Harald Storrle Towards clone detection in UML domain models In Proceedings of the 4th European Conference on Software Architecture ACM 2010 Companion Volume S 285 293 Christoph Domann Elmar Juergens Jonathan Streit The curse of copy amp paste cloning in requirements specifications PDF 107 kB In Proceedings of the 3rd International Symposium on Empirical Software Engineering and Measurement IEEE Computer Society 2009 S 443 446 Elmar Juergens Florian Deissenboeck Martin Feilkas Benjamin Hummel Bernhard Schaetz Stefan Wagner Christoph Domann Jonathan Streit Can clone detection support quality assessments of requirements specifications PDF 400 kB In Proceedings of the 32nd International Conference on Software Engineering ACM 2010 S 79 88 Abgerufen von https de wikipedia org w index php title Quelltextklon amp oldid 237529854