Im nächsten Abschnitt möchte ich darauf eingehen, auf eine
spezielle Technik eingehen, mit der man Band Smells findet.
Und zwar Clone Detection, 3-4-2.
Dabei geht es uns darum, Publikate zu finden.
Solche Duplikate sind ein Punkt,
die man auch unter Bad Smells bezahlt bezeichnen kann,
weil sie nicht wirklich Fehler darstellen, sondern Mängel bezüglich Wartbarkeit.
Wir haben also hier, die werden auch als Clones bezeichnet.
Wir haben hier die Fragen, 7,
8 und 9,
die sich damit beschäftigen
Was ist, was ist, dass sie uns dazu kommen,
was Clones sind. Wir fügen hier auch in eine neue
Seite und möchte zunächst erst mal erörtern, was sind.
Was ist denn an Code Clones schlecht?
Sie entstehen als Ergebnis von Copy Past
Und das darf man durchaus mit Fug und Recht als eine Form von Wiederverwendung bezeichnen.
Das wird sehr häufig gemacht. Bei Kut und bei,
im Prinzip ist das nichts Verwerfliches, man schaut sich an,
wie wird das woanders gemacht und man macht das genauso,
weil dort hat es ja funktioniert, ich passe,
ich kopiere das, passe es auf meine Verhältnisse an,
die ich nutzen möchte.
Und das ist etwas,
was durchaus ganz viel praktiziert wird und nur unter dem Aspekt
des Reengineering hat das
ein paar Nachteile
Geht es uns um Wartbarkeit, dann sind die Probleme,
die wir dabei bestehen, vor allen Dingen im höheren Aufwand zu sehen.
Höreraufwand für Wartung, für Veränderungen bestehen darin,
dass wir verstehen, schlechter haben,
schwieriger haben und die Endung, den Test schwieriger haben.
Nachteile bezüglich Wartbarkeit sind vor allen Dingen,
dass Fehlerkorrektur schwieriger ist, Das Mehraufwand zum Verstehen notwendig ist.
Dass mehr Daten zu analysieren,
ist einfach
mehr Kot da
Mehr dann zu analysieren und wenn wir Fehler im Code haben,
dann trinken die durch das Kopier
mehrfach auf
Und wenn die nicht überall behoben werden können,
dann ist das schon ein Punkt, der sehr schwierig ist.
Stellen Sie uns ein Szenario vor,
irgend sowas wie Buffer und Wurflow oder irgendein Security-Fehler,
tritt durch das Copy, ist Gegenstand von Codeclones,
tritt also einmal auf, wird einmal gefunden und es gibt aber 144 weitere Auftreten.
Und wenn ich davon nur 80 finde, dann bedeutet,
dass das immer noch sehr viele übrig,
wo der gleiche Fehler noch passiert.
Wir hatten solche Fälle schon in Projekten,
wo es vorkommt
Der Kunde wollte die und die Änderungen, zum Beispiel eine Tabelle wurde geändert.
Und ja, alles klar, ist ja gar kein Problem.
Man kann diese Tabelle ein bisschen ändern. Man macht das,
sagt dem Kunden Bescheid, ja, das ist jetzt geändert.
Gib die Version raus und der sagt, wollt ihr mich verblöd verkaufen?
Das ist doch noch da. Wir sagen da eigentlich so
deinen. Das fragende Entwickler, hast du das gemacht?
Ja, natürlich. Wir schauen uns das an. Tatsächlich,
das ist noch da und wir stellen fest am Ende,
die Tablette ist Tabelle, war komplett kopiert.
Sie war komplett zweimal da. Und der Entwickler hatte das
nicht gewusst. Ja, also deswegen Änderungen müssen dann
mehrfach durchgeführt werden
Musik Diese beiden letzten beiden Sachen, gerade dieses Mehrfache,
das sind schon sehr subtile Fehler,
die dann dazu führen, dass man auch Änderungen,
dass man einen Fehler mehrfach anfassen muss,
dass man einfach
deutlich höheren Aufwand macht
Untersuchungen haben gezeigt, dass in der industriellen Praxis durchaus zwischen
5 und 25 Prozent des Kurz irgendwie redundant sind.
Was sollte man kleinschreiben? Wir sind redundant,
25 Bäffchen und 25 Prozent des Codes,
das ist schon wirklich eine gewaltige Menge.
Und alles, was wir tun können,
um diese Codeclones zu reduzieren,
würde uns helfen
Lass uns noch mal kurz drüber sprechen, wie kommt es dazu?
Copy-Paste ist zunächst erstmal das grundsätzliche Schema. Doch es gibt
da noch Unterschiede und die möchte ich kurz darstellen,
brauchen wir eine neue Seite dazu.
Ich möchte verschiedene Szenarien darstellen
Szenario 1, neue Funktionalität,
die ähnlich zu bestehender ist
Zu sehr ähnlich zu bestehender Funktionalität und das ist ganz naheliegend,
dass man dann sich anschaut, wie ist das Alter,
wie ist das Neue,
ich kopiere das und passt das an.
Dabei treten eine Reihe von Fragen auf, die beantwortet werden müssten.
Wer benutzt, die existierende Funktionalität, die wir also kopiert haben?
Das wäre eine der ersten Fragen. Die nächste,
was diese Funktionalität alles benutzt? Und wir müssten sagen,
Wir müssten genau diese Auswirkungen untersuchen. Das wäre interessant.
Ein weiteres Szenario? Ich könnte darin bestehen, dass wir
unzureichende Versionskontrolle haben. Versionskontrolle zum Teil über Parallelprojekte,
aber auch Zwischenentwicklern oder die Arbeit eines Entwicklers
läuft irgendwie teilweise außerhalb der Versionskontrolle ab
Und da kommt es dazu.
Mehrere Versionen werden unabhängig voneinander.
Wenn ihreinander weiterentwickelt
Wie dann sehr, äh, ähnlich zueinander sind und teilweise Duplikate darstellen.
Und lassen wir uns noch ein drittes Szenario nehmen.
Szenario 3. Dass wir in einer Programme,
wenn es für Programmiersprachen oder Programmierplattformen,
wo es Vererbung und Zusammenfassung durch Abstraktion nicht in dieser Form gibt,
wie wir es bei objektorientierten Programmen kennen oder generische Einheiten nicht haben oder kein Inlining gibt,
da müssen wir den Code duplizieren,
um ihn mehrfach einzusetzen
Sprache ohne Vererbung ist der eine Punkt. Es gibt keine Möglichkeiten,
irgendwas, so wie die Templates oder sowas verallgemeinert zu schreiben,
dass man Sachen zusammenfassen kann.
Oder kein Inlining
Das ist gut, mehrfach notwendig, wir haben stärkere Redundanz.
Eine vierte Szenario müssen wir auch noch angeben,
das quetsche ich mal hier noch drunter, dass wir,
wenn wir Vererbung machen würden,
würden wir
Zügeln bekommen
Tatsächlich kann man in diesem, in dem letzten Szenario,
das kann man nicht vermeiden und in dem Fall wirken wir uns dafür entscheiden,
lieber den Zyklus zu vermeiden als das schwerere Problem und den Klon zu akzeptieren.
Ja, im Szenario 1, da wäre das sinnvoll,
dass sie noch eine Form auszulagern, zu verallgemeinern,
entweder durch sowas wie Templates oder durch Vererbung oder sowas,
eine Zusammenfassung zu machen, eine Ableitung,
eine Auserwerb bekommender Zyklen, was das Szenario 4 hier betrifft.
Versionskontrolle ganz klar, das können wir besser organisieren,
indem wir Sachen mit Fork teilen und dann wieder mit Joyen,
just mit Merch wieder zusammenführen,
sodass wir dann verallgemeinerte Einheiten durchaus behalten können im Feldex und das organisieren,
das wäre durchaus möglich.
Und wenn wir so eine Sprache haben,
die das nicht unterstützt, dann müssen wir eben auch durchaus
Duplikate in Anspruch in Kauf nehmen.
Das wären schon fast die Lösungen,
die wir hier gleich bei der Gelegenheit diskutieren können
Ich möchte,
und zu den Fragen zurückgehen,
das waren schon die positiven Effekte der Eliminierung von Clones,
nämlich gerade wenn wir die negativen Effekte,
dass die Frage wird auch beantwortet werden durch die negativen Effekte und die negative Effekte hatten wir hier gerade auf der Folie,
unter welchen Umständen Clones zugelassen werden,
das war das dritte und das vierte Szenario,
wenn die Programmiersprache eine solche Verallgemeinung nicht unterstützt oder wenn wir dadurch Zyklen erzeugen würden,
etwas,
was wir noch sehr viel stärker hätten,
das würden wir nicht machen und jetzt möchte ich gerne mit Ihnen
über verschiedene Typen sprechen und gleichzeitig hier eine Anwendung für den abstrakten Syntagsbaum,
den wir bei der letzten Einheit haben,
nochmal vorstellen können
Die haben wir hier schon in der Tabelle für Sie zusammengefasst.
Ich sehe gerade hier essen. Wir sind ein Fehler drin,
also das heißt natürlich nicht identische Klone.
Also wir haben verschiedene Typen von Clones hier mal aufgelistet.
Das sind vier Typen. Zum einen kann es dazu,
kann es sein, dass wir einfach original und Kopie völlig identisch haben.
Wir haben einfach Copy-Paste gemacht. Dann würde das bedeuten,
AST steht für abstrakter Syntaxbaum. Das würde bedeuten, der
abstrakte Syntaxbaum ist komplett identisch. Sie sehen schon aus der Struktur,
aus der Tabelle, dass wir versuchen, Clowns anhand des abstrakten Syntaxbaums zu erkennen.
Und wenn wir jetzt hier mal zu den Sachen hier zurückgehen,
was wir hier hatten, mit dem gut bestäbigen Compiler-Strukturen oder dem abstrakten Sündersbaum,
das ist genau das Mittel, um sowas zu erkennen.
Zurück zu unserer Tabelle. Also es gibt die identischen Clowns,
da ist auch der abstrakte Syntaxbaum identisch. Manche sehr viel häufiger ist aber,
dass man doch ein paar Anpassungen vornimmt, Umbenennungen vornimmt,
also hier in dem Fall haben wir hier zum Beispiel eben bei dem Clown,
haben wir zwar hier im Vergleich,
aber wir vergleichen nicht literal mit einer Variat ist und zwei Variable miteinander,
dann wird es sein, dass der Baum von der Struktur her identisch ist,
aber die Blätter im abstrakten Syntaxbaum sind unterschiedlich.
Das würde also, wenn wir hier mal das anschauen,
ja, in Blätter sind ja dann am Ende die Variablen,
die wir hier haben, die werden denn unterschiedlichen,
das werden in dem Fall hier die Blätter dieses Baumes.
Ja, wenn man noch eine weitergehende Änderung macht als nur etwas umzubenennen,
dass man zum Beispiel mehrfach so etwas tut oder Kombinationen,
dann sind eben jeweils, weil man nur etwas umbenennt,
die Blätter weiterhin unterschiedlich, aber die Struktur ist gleich.
Wenn man weitergehende Änderungen macht, indem man etwas einfügt oder etwas herauslässt,
dann können wir nicht mehr so sehr viel in die Struktur des Syntaxbaums sagen.
Die wird ja den teilweise schon sich abweichen.
Aber was wir sagen können, Teilbäume werden identisch sein.
Und da gibt es in der theoretischen Informatik,
in der Karfentheorie oder in den Krafen,
auch Praxis gibt es eine Menge von super Algorithmen,
die uns helfen.
Zum Beispiel effektiv in Bäumen zu suchen.
Da kann man suchen, wo sind Ähnlichkeiten,
wo sind Teilbäume identisch
Das wäre der Typ 3, Clones mit Änderungen.
Da sind die wenigsten noch Teilbäume da.
Und dann gibt es noch einen vierten Typ,
das sind Clones, die eigentlich nur die Funktionen gemeinsam haben.
Der Aufbau ist komplett unterschiedlich. Ich habe hier zwei unterschiedliche Sortieralgorithmen
mal angegeben. Die unterscheiden sich in der Struktur sehr.
Die haben nur das gleiche Resultat, beides sortieren.
Und da kann ich ein Hirn, der im Starks der
abstrakten Syntaxbaums nichts mehr finden.
Das wäre auch die Antwort auf die Frage. Sieben,
welche Typen von Code Clones gibt es und wie erkenne ich
die in abstrakten Syntaxbaumen