Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Grundlagen der Programmierung: Codemetriken

Code Clones

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Duplizierter Code gilt als eine der größten Gefahrenquellen für Softwarequalität. Dieses Video erläutert, wieso.
06:45

Transkript

Eine Sache, die gerne vergessen wird, obwohl sie wahnsinnig viel Einfluss auf die Codequalität hat, sind die sogenannten Code-Clones. Wir beschäftigen uns damit, was sich hinter dem Namen verbirgt und welche negativen Einflüsse sie auf unsere Codebasis haben. Als erstes Beispiel sehen wir uns einen Konstruktor an, und zwar von der Kasse "PageViewModel". Dieser Konstruktor bekommt seine externe Abhängigkeit per "Dependency Injection", und die Abhängigkeit, die er hier angibt, ist eine "NavigationService". Sehr häufig wird in diesem Fall von Entwicklern dann eine so genannte "guard class" eingeführt. Das ist eine Überprüfung, ob die Vorbedingung für alle weiteren Aktionen auch stimmt. Dadurch, dass "NavigationService" ein integraler Bestandteil beziehungsweise eine sehr wichtige Abhängigkeit für die Klasse darstellt, wird also geprüft, ob der übergebene Parameter auch ungleich Null ist, wäre er Null, wäre die ganze Sache ja sinnlos. Dann hätte man eben die Abhängigkeit nicht aufgelöst. Wenn es tatsächlich Null ist, wird eine Exception geworfen, gleich anzuzeigen, ich kann nicht arbeiten. Erst wenn diese "guard class" durchlaufen wird, wird mit dem Rest fortgefahren, also wird die eigentliche Funktionalität erst ausgelöst. Das Interessante ist nun, dass man diese "guard classes" bei "Dependency Injection" sehr, sehr häufig finden kann, da jede Komponente, die ein "NavigationService" verwendet, entsprechend auch eine solche "guard class" schreiben würde, insofern das im Team angebracht ist. Wir haben an dieser Stelle also eine Art von Code-Dopplung, wir haben den gleichen Code an unterschiedlichen Stellen, und das passiert häufiger, also es kann sein, dass wir Code einfach nur doppelt schreiben, so wie ich dieses Bild hier jetzt einfach kopiert habe. Ich brauche es an unterschiedlichen Stellen, also schreibe ich es hin und rein zufällig gleicht es Code an anderer Stelle. Das Ganze ist insofern okay, insofern nur der Code gleich sein soll, aber nicht das Verhalten. Wenn wir jetzt beispielsweise Verhalten kopieren, indem ich ausgehend von einer Stelle zum Beispiel per Copy & Paste das Verhalten an anderer Stelle repliziere, dann wird es zum Problem, denn dann bekommen wir einen Klon. Sehen wir uns das in diesem Beispiel an. Ich habe eine Klasse "PersonManager", "PersonManager" sagt schon aus, irgendwas wird da mit Personen gemacht, und in diesem Fall soll eine Liste mit Personenobjekten gefüllt werden, basierend auf der Anzahl der notwendigen Personen. Nun kann es sein, dass ich zum Beispiel in meinem "PersonViewModel" ebenfalls eine Liste initialisieren möchte, dann mache ich das Gleiche. Was jetzt genau hinter dem "Create" steckt, kann ich an dieser Stelle nicht sagen, aber höchstwahrscheinlich werden dort Personen erstellt. Auch hier haben wir eine Code-Dopplung. Das Probem ist aber, dass es nicht nur darum geht, dass der Code gleich ist, sondern ich habe auch das Verhalten dupliziert. Ich brauche eine Liste mit initialisierten Personen. Wenn nun dieses Verhalten sich aber leicht ändert, weil beispielsweise ich einen Fehler mache, indem ich hier eine Eins eintrage, dann habe ich unterschiedliche Stellen, die sich theoretisch gleich verhalten müssten, es aber nicht tun. In diesem Fall haben wir einen Code-Klon, wir haben ein Duplikat des Verhaltens, das sich nach der Duplizierung verändert hat. Genau das ist, was ein Klon macht, wenn ich heute geklont würde, dann würde mein Klon völlig andere Erfahrungen machen als ich und damit würde er zu einem anderen Menschen werden, er ist nicht mehr genau so wie ich. Und so ist es bei unserem Code, und noch schlimmer wird das, dass diese Code-Klone dazu neigen, dass sie sich extrem vermehren, und dann haben wir ganz viele Stellen in unserem Code, die theoretisch gleich sind, praktisch aber nicht. Hier noch ein anderes Beispiel für so etwas. Wir haben einen Aufruf für ein "Notification"-Fenster. Also, wir wollen dem Nutzer mitteilen, dass wir erfolgreich gespeichert haben. Für eine solche Mitteilung ist einmal eine Überschrift, dieses "saved successfully" und die Beschreibung "Entered user information was successfully saved" und ein entsprechendes Bild, das definiert, wie eine solche Mitteilung aussieht. Nun neigt man dazu, diese Methode über und über in seiner Applikation zu kopieren, immer dort, wo mitgeteilt werden soll, dass gespeichert wurde. Das ist aber von Nachteil, weil es sich ja um eine Definition einer solchen "Notification" handelt. Wenn ich nun an unterschiedlichen Stellen das vorliegen habe und beispielsweise das "saveIcon" in ein "stoppedIcon" oder nur in "Icon" ändere, dann muss ich all diese Stellen anpassen, und das ist schlecht. Es lohnt sich dann, diesen Code zusammenzufassen, in eine eigene Methode, die dann beispielsweise über einen "NotificationHandler" oder was auch immer aufgerufen wird. Und genau das ist die Lösung für unsere Probleme mit Code-Clones. Wenn das gleiche Verhalten an unterschiedlichen Stellen gebraucht wird, dann müssen wir es zusammenfassen. Wir müssen es wiederverwendbar gestalten. Und Copy & Paste ist keine Wiederverwendung. Eine Möglichkeit, das zu analysieren, sind Code-Klon-Analysen beziehungsweise Duplicate-Analysen, denn in der Praxis wird leider zwischen Code-Clones und Code-Duplicates nicht unbedingt immer ein Unterschied gemacht. Hier sehen wir ein Beispiel für die Code-Klon-Analyse des Visual Studios, und dort ist es so, dass in unterschiedliche Klassen von Code-Clones unterschieden wird, denn das, was wir im Hintergrund sehen, zeigt schon, dass der Code durchaus ähnlich aber eben nicht gleich sein muss, durch diese kleinen Veränderungen. Eine solche Code-Klon-Analyse macht dann nichts anderes, als mehrere Zeilen Code miteinander zu vergleichen und anzuzeigen, wie ähnlich sind sich diese. Das wird von Visual Studio dann beispielsweise in unterschiedliche Klassen eingeteilt, wie "Medium Match", "Strong Match", "Heavy Match" und so weiter und so fort, und sagt dann aus, sind es 1:1-Kopien oder unterscheiden die sich nur leicht. Dabei wird immer ein Mindestmaß von Statements beziehungsweise Zeilen genommen, um solche Fälle, wie unsere "guard classes", nicht als Code-Clones zu erkennen. Weiterhin können wir dann über die Anzahl der geklonten Zeilen, was hier im Beispiel 21.332 sind, schon einen sehr guten Eindruck darüber bekommen, wie viel von unserem Code durch Klons bestimmt wird. Denn je mehr das ist, desto sensibler ist die Quellcode-Basis gegenüber Änderungen. Sie sollten also den Anteil von Code-Clones in Ihrem Code so klein wie möglich halten.

Grundlagen der Programmierung: Codemetriken

Lernen Sie Methoden, Prinzipien und Werkzeuge kennen, mit deren Hilfe Sie die Qualität Ihrer Software dauerhaft sicherstellen können.

1 Std. 43 min (20 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:25.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!