Codequalität: Code-Metrik Version 0.1 Sicherung und Verbesserung der Codequalität mit Hilfe von Code-Metrik Tools Team Code Orange 1
Inhalt Einleitung Tools: - Checkstyle - JavaNCSS - Findbugs - JDepend - Cobertura (Integration in Buildprozess) Team Code Orange 2
Einleitung Grundmotivation Regelmäßige Überwachung und Verbesserung der Codequalität ist essenziell für das technische und geschäftliche Überleben von Softwaresystemen Gerade in Zeiten der fortschreitenden Softwarekrise stellt Codequalität eine fundamentale Säule in der Softwareentwicklung dar Team Code Orange 3
Einleitung Grundmotivation Umfang und Ausprägung moderner Softwareprojekte erfordern moderne Lösungen zur Sicherung von Qualität des Codes und zur Überwachung des Codes (Codereviews) In der Praxis wird die sogenannte Quelltextrezension oftmals nur von wenigen bzw. einer Person durchgeführt (Softwarearchitekt) Team Code Orange 4
Einleitung Grundmotivation Der Softwarearchitekt kann unmöglich jede Codezeile manuell bezüglich Codequalität prüfen Softwareprojekte, Systeme, Teams und Unternehmen sind oft zu unterschiedlich für einheitlichen Standard bezüglich Codequalität Team Code Orange 5
Einleitung Einschub: Konservative Ansätze Regelmäßige Codereviews Eigene Erfahrung Einhaltung von Codeschablonen bzw. softwaretechnischen Verhaltensmustern Lösen jedoch oft nur eine kleine Untermenge von Problemen bezüglich Überwachung der Codequalität Team Code Orange 6
Einleitung Grundmotivation Problemlösungsansatz: Entwicklung/Einsatz von Vorgehensweisen zur Abbildung von Softwareeigenschaften in einem Zahlenwert (Maßzahl) Softwaremetrik (Codemetrik) Team Code Orange 7
Einleitung Codemetrik(Nutzung) Einsatz(Beurteilung) der Codemetrik erstreckt sich über mehrere Bereiche: Entwicklungsphasen Phasenergebnisse Technologien Ziel der Metriken Fehlerprognose und Aufwandsabschätzung Unterscheidung zwischen vorlaufend, mitlaufend und retroperspektiv Team Code Orange 8
Einleitung Codemetrik(Beschränkung) Metriken sollten überschaubar bleiben (eindimensional): Sicht des Managements Kosten, Produktivität, Risiken, Validierung Sicht des Entwicklers Lesbarkeit, Effizienz, Effektivität, Tests, Restfehler Sicht des Kunden Abschätzungen(Budget), Qualität, Wartbarkeit, Erweiterbarkeit Team Code Orange 9
Einleitung Codemetrik(Klassifikation) Verschiedene Metriken(Entwurfsmetrik, Kommunikationsmetrik usw.) werden speziellen Klassen zugeordnet: Prozess-Metrik Ressourcenaufwand, Fehler, Kommunikationsaufwand Produkt-Metrik Umfang, Komplexität, Lesbarkeit, Entwurfsqualität, Produktqualität Komplexitätsmetrik Softwaregröße, Fertigstellungsgrad Team Code Orange 10
Einleitung Codemetrik(Gütekriterien) Gütemerkmale werden in der Regel an der Erfüllung der Kundenanforderung gemessen Gütekriterien für den Kunden: Objektivität (keine subjektive Einflüsse des Messenden) Zuverlässigkeit (bei Wiederholung gleiche Ergebnisse) Normierung (Messergebnisskala und Vergleichbarkeitsskala) Team Code Orange 11
Einleitung Codemetrik(Gütekriterien) Gütekriterien für den Kunden(Fortsetzung): Vergleichbarkeit (Maß mit anderen Maßen in Relation setzbar) Nützlichkeit (messbare Erfüllung praktischer Bedürfnisse) Validität (von messbaren Größen auf andere Kenngrößen zu schließen (schwierig)) Team Code Orange 12
Einleitung Zusammenfassung Für den Menschen (Softwarearchitekt) ist es schwer manuell für eine entsprechende allgemeine Codequalität zu sorgen Lösung: Einsatz einer einheitlichen und allgemein anerkannten Metrik (Codemetrik) Im Folgenden werden Tools vorgestellt, welche zum größten Teil solche Codemetriken erstellen und realisieren Team Code Orange 13
Inhalt von Checkstyle Zitat Sinn und Zweck eines Coding Standards Fälle für die Coding Standards Sinn machen Definierte Punkte bei Checkstyle Einfaches Beispiel für schlecht lesbaren Code Beispiel für schlecht lesbaren Code Tipps Checkstyles als Eclipse-Plugin Team Code Orange 1
Zitat* von Martin Fowler Any fool can write code that a computer can understand. Good programmers write code that humans can understand *("Refactoring - Improving the design of existing code", Seite 15) Team Code Orange 2
Sinn und Zweck eines Coding Standards Ist das Erleichtern von Arbeiten am Code mit mehreren Leuten durch einheitliche Codestruktur innerhalb eines Entwicklungsteams Team Code Orange 3
Fälle für die Coding Standards Sinn machen Kommunikation Urlaubsvertretung funktionierender Code Übersichtlicher Code Module und Modultests Wiederverwendbarkeit des Codes Einfache Wartung des Codes Code, der leicht zu erweitern ist Team Code Orange 4
Definierte Punkte bei Checkstyle Einrückung Namenskonventionen Kommentare Begrenzung der Zeilenlänge Anzahl von Unterklassen Komplexität der Dateistruktur (Packages) Team Code Orange 5
Einfaches Beispiel für schlecht lesbaren Code Ein eingegebener Wert soll von einer temporären Variable einer speziell für Usereingaben definierte Variable zugewiesen werden Schlecht a = b; Gut inputuser = tempinput; Team Code Orange 6
Beispiel für schlecht lesbaren Code 48 through the loop, sortboundary is increased, and the element at the position of the 49 new sortboundary probably isn't in its sorted place in the array, so it's inserted 50 into the proper place somewhere between firstelement and sortboundary. */ for ( int 51 sortboundary = firstelement+1; sortboundary <= lastelement; sortboundary++ ) { int 52 insertval = data[ sortboundary ]; int insertpos = sortboundary; while ( insertval < 53 data[ insertpos-1 ] ) { data[ insertpos ] = data[ insertpos-1 ]; insertpos = 54 insertpos-1; } data[ insertpos ] = insertval; } /* Replace original lower-boundary 55 element */ data[ firstelement-1 ] = lowerboundary; } Team Code Orange 7
for ( 77 int sortboundary = firstelement+1; 78 sortboundary <= lastelement; 79 sortboundary++ 80 ) { 81 int insertval = data[ sortboundary ]; 82 int insertpos = sortboundary; 83 while ( insertval < data[ insertpos-1 ] ) { 84 data[ insertpos ] = data[ insertpos-1 ]; 85 insertpos = insertpos-1; 86 } 87 data[ insertpos ] = insertval; 88 } Beispiel für schlecht lesbaren Code Team Code Orange 8
120 for ( int sortboundary = firstelement + 1; sortboundary <= lastelement; 121 sortboundary++ ) { 122 int insertval = data[ sortboundary ]; 123 int insertpos = sortboundary; 124 while ( insertval < data[ insertpos - 1 ] ) { 125 data[ insertpos ] = data[ insertpos - 1 ]; 126 insertpos = insertpos - 1; 127 } 128 data[ insertpos ] = insertval; 129 } 130 // Replace original lower-boundary element 131 data[ firstelement - 1 ] = lowerboundary; 132 } Beispiel für schlecht lesbaren Code Quelle: Code Complete - von Steve McConnell Team Code Orange 9
Tipps Code sollte ab der ersten Zeile gemessen werden Der gesunde Menschenverstand sollte nicht ausgeschaltet werden Die Sinnhaftigkeit sollte im Einzelfall überprüft werden Team Code Orange 10
Checkstyle in Eclpise Team Code Orange 11
Inhalt JavaNCSS Features NCSS CCN Fazit Quellen Team Code Orange 1
JavaNCSS JavaNCSS ist ein Kommandozeilen Programm Die Metriken, die von JavaNCSS ermittelt werden, sind : NCSS(Non Commenting Source Statements) CCN(Cyclomatic Complexity Number) JVDC(Number of formal Javadoccomments) NCSS und JVDC können auf Global-, Klasse- oder Funktions-Ebene angewendet werden. Team Code Orange 2
NCSS Es wird die Anzahl, der Ausführbaren Codezeilen (Non-Commenting-Source-Statements) ermittelt Vereinfacht kann man sagen, dass diese Metrik die ; und die { in Java Quelltexten zählt Nicht gezählt werden leere Statements, leere Blöcke oder Semikolons nach geschweiften Klammern Kommentare und Formatierung spielen keine Rolle Team Code Orange 3
NCSS Vorteile : Genauer als LOC Ermöglicht Vergleichbarkeit, zu anderen Projekten Nachteile : Die Anzahl der NCSS, müssen immer im Kontext gesehen werden Alleinstehend nicht sehr aussagekräftig Team Code Orange 4
CCN Die von McCabe definierte Metrik ermittelt die strukturelle Komplexität (Cyclomatic Complexity Number), einer Methode oder einer Funktion. Eine Methode oder Funktion hat per Definition der Metrik, eine Komplexität mit dem Wert 1. Dieser CCN-Wert erhöht sich bei jedem Entscheidungspunkt um den Wert 1. Gibt die Anzahl der mindestens benötigten Testfälle an Team Code Orange 5
Einordnung der CCN In Untersuchungen von von McCabe und Halstead wurde nachgewiesen, dass ein signifikanter Zusammenhang zwischen der Komplexität und der Anzahl der Fehler, die beim Testen und im Betrieb gefunden wurden besteht. CCN Einordnung 1-10 Einfaches Programm, mit geringem Risiko 11-20 Komplexeres Programm, mit moderatem Risiko 21-50 Komplexes Programm, mit hohem Risiko > 50 Instabiles Programm,mit sehr hohem Risiko Team Code Orange 6
Beispiel CCN Berechnung public void demomethode(int wert){ } if(wert > 0) for(int i = 0; i<wert; i++) System.out.println("aaaaaaaah!"); else do{ System.out.println("bbbbbbbbbb!");} while(false); // Die CCN dieser Methode ist 4 Team Code Orange 7
Fazit Vorteile : CCN kann Hinweise auf Probleme in der Architektur geben JVDC zeigt fehlende Dokumentationen an Nachteile : Die Kommentar-Metrik sagt nichts über die Qualität der Kommentare aus CCN berücksichtigt nur ein Programmgerüst und lässt die Komplexität einzelner und verschachtelter Anweisungen außer acht Team Code Orange 8
Quellen JavaNCSS Homepage http://www.kclee.de/clemens/java/javancss/ Messen & Metriken Ist Qualität messbar? http://xradar.sourceforge.net/downloads/metrics-isqualitym METRIKEN IM PRAKTISCHEN EINSATZ http://www.sigs.de/publications/os/2007/03/fleischer_os_03 Software Komplexität http://www.pervasive.jku.at/teaching/_2007ss/softwareeng Team Code Orange 9
FindBugs FindBugs Vortragender: Felix Kaminski Team Code Orange 1
Inhalt von FindBugs Allgemeine Beschreibung Was kann es? Was kann es nicht? Bug Kategorien Beispiele Null-Pointer Annotations Live Team Code Orange 2
Allgemeine Beschreibung Fokus: echte Bugs und Performance- Probleme finden Durchsuchen des (Java) Bytecodes mittels statischer Code-Analyse nach Fehlermustern ( bug pattern ) Drei verschiedene Ausführungsarten: Kommandozeile Eigenständige GUI Plugin für Entwicklungsumgebungen Team Code Orange 3
Was kann es? Finden von Bugs (200+) vor der Ausführung Kein Quellcode nötig, da Durchsuchung von Bytecode Priorisierung von Bugs Erweiterbar durch eigene Bugs Integration in Build-Prozess (ANT) Export als XML (HTML) möglich Team Code Orange 4
Was kann es nicht? Eigene Überlegungen ersetzen Nicht alle Bugs sind Bugs Funktionalität wird nicht getestet..nur Java Team Code Orange 5
Bug Kategorien Unterteilung der Bugs in 10 Kategorien Gezieltes Suchen nach bestimmten Kategorien http://findbugs.sourceforge.net/bugdescriptions.html Team Code Orange 6
Kategorie: Dodgy Team Code Orange 7
Kategorie: Security Team Code Orange 8
Beispiel: Null-Pointer Eclipse erkennt Null-Pointer Dereferenzierung nicht Fehler zur Laufzeit! Team Code Orange 9
Beispiel: Null-Pointer Auswertung mit Findbugs Erkennung vor Ausführung Team Code Orange 10
Beispiel: Annotations Fehlererkennung durch Annotations Benötigt werden annotations.jar und jsr305.jar (Findbugs-Ordner/libs/) Team Code Orange 11
Beispiel: Annotations Team Code Orange 12
Quellen FindBugs Hompage - http://findbugs.sourceforge.net Erklärung des Eclipse-Plugins - http://andrei.gmxhome.de/findbugs/index.html IBM Tutorial zu FindBugs - http://www.ibm.com/developerworks/java/library/j-fin Team Code Orange 13
Code-Metriken Teil II The overview pyramid Abstractness/Instability Chart Tools Team Code Orange 1
Overview Pyramid: Basisstruktur Charakterisierung der Struktur eines Systems Größe & Komplexität Verwendung der Vererbung Kopplung Team Code Orange 2
Overview Pyramid: Größe und Komplexität I Direkt erfassbare Kennzahlen CYCLO: zyklomatische Komplexität ( JavaNCSS) LOC: (Executable) Lines of Code NOM: Number of Methods NOC: Number of Classes NOP: Number of Packages Team Code Orange 3
Overview Pyramid: Größe und Komplexität II Abgeleitete Kennzahlen Intrinsic operation complexity (CYCLO/LOC) Operation structuring (LOC/NOM) Class structuring (NOM/NOC) High-Level structuring (NOC/NOP) Granularität des Systems Team Code Orange 4
Overview Pyramid: Kopplung Direkt erfassbare Kennzahlen FANOUT: Zahl der aufgerufenen Klassen CALLS: Zahl der Methoden-Aufrufe Abgeleitete Kennzahlen: Coupling disperson (FANOUT/CALLS): Wie stark sind die Klassen gekoppelt? Coupling intensity (CALLS/NOM) : Wie viele andere Operationen werden von einer Operation aus aufgerufen? Team Code Orange 5
Overview Pyramid: Vererbung Direkt erfassbare Kennzahlen AHH: Average Hierarchy Height (Tiefe des Vererbungsbaums) ANDC: Average Number of Derived Classes (Breite des Vererbungsbaums) Team Code Orange 6
Overview Pyramid: Beispiel PHP: Zend Framework Team Code Orange 7
Abstractness/Instability Chart Abhängigkeiten eines Paketes Ca: Afferent Coupling (incoming dependencies) Anzahl der Packages, die von Klassen innerhalb des Packages abhängen Ce: Efferent Coupling (outgoing dependencies) Anzahl der Packages, von denen Klassen innerhalb des Packages abhängen Beispiel: Package b Ca = 1 Ce = 2 Team Code Orange 8
Instability eines Package Instability I I = Ce Ce Ca [0,1] Bedeutung Von wie vielen anderen Packages hängt ein Package ab? Je mehr fremde Packages benutzt werden, umso größer die Instabilität. Instabil (I = 1): leicht änderbar Stabil (I = 0): schwer änderbar Team Code Orange 9
Abstractness eines Package Abstractness A A = ac ac cc [0,1] ac: Anzahl an abstrakten Klassen / Interfaces cc: Anzahl aller Klassen Team Code Orange 10
Abstractness/Instability Chart Abstractness/Instability Chart Team Code Orange 11
Abstractness/Instability Chart: Beispiel PHP: Zend Framework Team Code Orange 12
Tools Java JDepend (A/I Chart): auch als Eclipse-Plugin http://clarkware.com/software/jdepend.html IPlasma (Overview pyramid) http://loose.upt.ro/iplasma/ PHP PHP Depend (Overview pyramid + A/I Chart) http://www.pdepend.org Team Code Orange 13
Quellen / Abbildungsverzeichnis Quellen Tool-gestütztes Architekturmanagement in J2EE-Projekten http://www.valtech.de/etc/medialib/library/it_consulting/de/de_whitepapers.par.52397.f Using the Overview Pyramid http://www.manuel-pichler.de/archives/31-using-the-overview-pyramid.html#ml06 How reusable, extensible and maintainable is your software? http://www.manuel-pichler.de/archives/21-how-reusable,-extensible-and-maintainable-i Software-Metriken http://www.trautwein.fh-aachen.de/download/swe/swe_ausarbeitungen_ws2008/a_ Abbildungen Übersicht Overview Pyramid : http://www.manuel-pichler.de/archives/31-using-the-overview-pyramid.html#ml06 Team Code Orange 14
Cobertura Einführung Features Beispiel Integration in den Build-Prozess Demo Team Code Orange 1
Cobertura Einführung: la cobertura, spanisch für Abdeckung (von JCoverage) freies Java-Tool zur Berechnung der JUnit Testabdeckung zeigt ungetesteten oder unerreichbaren Code auf Team Code Orange 2
Cobertura Features zeigt den Anteil der getesteten Codezeilen von Klassen, Paketen oder dem Projekt zeigt die zyklomatische Komplexität von Klassen, Paketen oder dem Projekt generiert Reports in HTML oder XML kann über Kommandozeile oder von Buildern ausgeführt werden führt die Tests auf java bytecode aus Team Code Orange 3
Cobertura Beispiel: http://cobertura.sourceforge.net/sample/ Team Code Orange 4
Cobertura Integration in den Build-Prozess: Einschub: Build-Tools wie make, Apache-Ant oder Apache-Maven automatisieren Vorgänge wie: - Kompilierung - Test - Installation von Software Team Code Orange 5
Cobertura Integration in den Build-Prozess: Einschub: Apache-Ant Java Build-Tool Open Source Another Neat Tool XML-gesteuert (Standard: build.xml ) Eclipse-Integration Team Code Orange 6
Cobertura Integration in den Build-Prozess: Einschub: Apache-Ant Grundstrukturen der XML: Project Targets wie build oder clean Tasks (über 150 mitgeliefert; selbst implementierbar): Javac (Kompilieren von Quellcode) Copy, Delete, Move Cvs (CVS-Operationen) Mail (Versenden von E-mails) Junit Properties (z.b. zum Pfade setzen) Team Code Orange 7
Cobertura Integration in den Build-Prozess: build.xml für Cobertura (demo): Team Code Orange 8
Cobertura Integration in den Build-Prozess: Starten des Builds (demo): Team Code Orange 9
Cobertura Quellen und hilfreiche Links: http://cobertura.sourceforge.net/ http://www.ibm.com/developerworks/java/library/j-cobertura/ http://ant.apache.org/ http://www.joller-voss.ch/tools/eclipse/apacheantineclipsesta http://de.wikipedia.org/wiki/apache_ant Team Code Orange 10