Software-Metriken B. Sc. Michael Thomas <thomas@thi.uni-hannover.de> Seminar Software-Entwurf WS 2004/05
Gliederung Einführung Traditionelle Metriken / Grundeinheiten Lines of Code Zyklomatische Komplexität Halstead-Maße OO-Metriken Maße nach Chidamber & Kemerer Werkzeuge cccc JDepend Eclipse Plugins Literatur 2
Wann ist ein Software-Entwurf gut? 3
Wann ist ein Software-Entwurf gut? Eigenschaften guter Entwürfe: leicht verständlich Fehler vermeidend wartbar erweiterbar Software-Qualitätsmerkmale nicht direkt messbar! Ausweg: messen von internen Größen Vorhersagen durch Empirie ableiten 4
Einordnung des Themas Creational Patterns Behavioral Patterns Structural Patterns Design Patterns lösen Design-Probleme UML Hilfsmittel OO Analyse & Design betrachtete Programmiertechnik OOP SW-Metriken Beurteilung wichtiger Bestandteil Software-Entwurf 5
Was ist eine Metrik? Maßzahl zur Quantifizierung von Attributen eines SW-Projekts Anforderungen: Einfachheit Objektivität Validität Konsistenz Reproduierbarkeit Nachvollziehbarkeit 6
Metriken messen Vorgehen: Messgröße definieren Daten sammeln auswerten und beurteilen Feste Integration ist wichtig! sonst: Vernachlässigung Ziele setzen Messgrößen definieren Vorgehen überarbeiten Auswerten & beurteilen Entwickeln Daten sammeln 7
Warum Metriken einsetzen? To meassure is to know (Maxwell) Bewertung von Entwurf Designentscheidungen genauere Schätzungen Software-Projekte werden vergleichbar dienen dem erfahrungsbasierten Lernen in Unternehmen Wartungs- und Testumfang vorhersagen Erzieherische Effekte auf den Programmierer (Stil) 8
Arten von Metriken Man unterscheidet Software-Metriken (nach Thaller) in: Software-Metriken Produkt-Metriken Prozess-Metriken 9
Prozess-Metriken dienen dem Projektmanagement beurteilen den Prozess der Software-Entwicklung typische Anwendungen: Kosten- und Aufwandsschätzungen Projektfortschritt beurteilen Wartungskosten abschätzen Risiken erkennen etc. bekannte Metriken: Brooks: The Mystical Man-Month gefundene Fehler pro Phase 10
Produkt-Metriken dienen dem Entwicklerteam vorrangig zur Qualitätsbeurteilung des SW-Produkts: Zuverlässigkeit bzw. Fehleranfälligkeit Designkomplexität Wartungsaufwand Lesbarkeit meist Code-basiert 11
Gliederung Einführung Traditionelle Metriken / Grundeinheiten Lines of Code Zyklomatische Komplexität Halstead-Maße OO-Metriken Maße nach Chidamber & Kemerer Werkzeuge cccc JDepend Eclipse Plugins Literatur 12
Lines of Code einfach die Zeilen des Quellcode zählen Vorteile: extrem einfach zu messen Nachteile: sehr unterschiedliche Definitionen: alle Programmzeilen ausführbare Programmzeilen Leerzeilen? Kommentare? Compiler-Befehle? sprachabhängig bemisst lediglich den Umfang einheitliche Definition und Normierung notwendig (!) 13
Beispiel public void feed(eatable[] eatable){ for (Eatable e : eatable){ if (hungry) // iß etwas... atecalories += e.getcalories(); } } if (atecalories > 150){ // Sodbrennen spitfire(); } alle Zeilen 10 ohne Leerzeilen, Kommentare 7 Anzahl Semikolons 2 14
Cyclomatic Complexity nach McCabe (1976) basiert auf Ablaufgraph F Formel: c F = E V 2 p Fehleranfälligkeit : mittleres Risiko c F 10 : hohes Risiko c F 20 : unbeherschbar c F 50 Vorteile: misst die Komplexität Nachteile: Umfang nicht berücksichtigt 15
Beispiel public void feed(eatable[] eatable){ for (Eatable e : eatable){ if (hungry) // iß etwas... atecalories += e.getcalories(); } if for... if (atecalories > 150){ } // Sodbrennen spitfire(); if... } c F =9 7 2=4 16
Halstead-Metriken erster Einführung von Software-Metriken (1972) Zählt alle verwendeten Operatoren und Operanden = Anzahl der verwendeten Operatoren 1 = Anzahl der verwendeten Operanden 2 = Gesamtzahl der Operatoren N 1 = Gesamtzahl der Operanden N 2 Daraus abgeleitet: Maße für Schwierigkeit Volumen Aufwand D= 1 2 N 2 2 V = N 1 N 2 log 1 2 E=D V 17
Beispiel public void feed(eatable[] eatable){ for (Eatable e : eatable){ if (hungry) // iß etwas... atecalories += e.getcalories(); } if (atecalories > 150){ // Sodbrennen spitfire(); } } D=8,25 V 138,3 E 1141 Operator #Vorkommen Eatable 1 public 1 void 1 for 1 if 2 { } 3 ( ) 6 += 1 > 1 : 1. 1 ; 2 Operand #Vorkommen feed 1 eatable 2 hungry 1 atecalories 2 getcalories 1 spitfire 1 18
Gliederung Einführung Traditionelle Metriken / Grundeinheiten Lines of Code Zyklomatische Komplexität Halstead-Maße OO-Metriken Maße nach Chidamber & Kemerer Werkzeuge cccc JDepend Eclipse Plugins Literatur 19
Problem Traditionelle Maße sagen nichts über OO-Programme aus. Anwendung höchstens in Teilsystemen Wie bildet man objekt-orientierte Konzepte ab? Klassen Vererbung Polymorphismus Nachrichtenaustausch Lösung: Maße von Chidamber und Kemerer Towards a Metric Suite for Object Oriented Design, 1991 20
Weighted methods per class (WMC) Gewichtete Menge an Methoden Gewichtung anhand der zyklomatischen Komplexität (McCabe) Indikator für Weiterentwicklungsaufwand Wartungsaufwand schwierige Wiederverwendung WMC=c F feed c F spitfire =4 1=5 21
Depth in inheritance tree (DIT) Tiefe im Vererbungsbaum genauer: Anzahl der Oberklassen!? Indikator für hohe Wiederverwendung gute Strukturierung Gefahr einer unbeabsichtigeten Änderung in Oberklassen positiv korelliert mit Fehlerwahrscheinlichkeit DIT = 2 DIT = 0 DIT = 1 DIT = 3 22
Number of children (NOC) Anzahl der direkten Unterklassen Idikator für die Wichtigkeit einer Klasse Auswirkungen von Änderungen im System Testaufwand bei Änderungen negativ korelliert mit Fehlerwahrscheinlichkeit NOC = 1 NOC = 2 NOC = 1 23
Coupling between classes (CBO) Kopplung zwischen zwei Klassen zeigt die Anzahl der Klassen, mit denen kommuniziert wird Indikator für: starke Kopplung großen Verwaltungs- & Testaufwand schlechte Aufgabenverteilung positiv korelliert mit Fehlerwahrscheinlichkeit CBO = 2 CBO = 1 CBO = 1 24
Response for a class (RFC) Menge aller genutzen Klassen zeigt die Anzahl aller verschiedenen Methoden, die aufgerufen werden zuzüglich aller Methoden der Klasse die max. mögliche Zahl an Methoden die durch eine Nachricht aufgerufen werden könnten Je größer der RFC: je komplexer ist die Klasse je schwieriger sind Testen und finden von Fehlern RFC = 2 + 1 = 3 25
Lack of cohesion on methods (LCOM) Kohäsionsmangel der Methoden einer Klasse Berechnung: Anzahl der Methodenpaare mit disjunkten Variablen minus der Methodenpaare mit gemeinsam genutzten Variablen Indikator für schlechtes Design schlechte Klassenaufteilung mögliches Trennen in mehrere Klassen LCOM = 2 26
Dynamische Metriken bisher lediglich statische OO-Metriken leider keine Metriken für das dynamische Systemverhalten Kommunikationsabläufe Gebiet der Forschung 27
Gliederung Einführung Traditionelle Metriken / Grundeinheiten Lines of Code Zyklomatische Komplexität Halstead-Maße OO-Metriken Maße nach Chidamber & Kemerer Werkzeuge cccc JDepend Eclipse Plugins Literatur 28
cccc berechnet u.a. die vorgestellten Metriken Programmiersprachen: Ada Java C/C++ kommandozeilen-basiert z.b.: cccc --outdir=~/report `find. -name *.java` Ausgabe nach HTML/XML Vorteil: einfach und intuitiv zu benutzen Nachteil: keine Integration in IDE's 29
Beispiel 30
JDepend berechnet OO-Metriken nach Robert C. Martin Programmiersprachen: Java Ausgabeformen Konsole, XML Swing GUI Integration in Ant JUnit gute Dokumentation 31
Eclipse Plugin: com.teaminabox.eclipse.metrics berechnet die vorgestellten Metriken Features: Export nach HTML/CSV möglich gute Integration Überschrittene Grenzwerte werden in die Probleme -Sicht integriert: 32
Eclipse Plugin: net.sourceforge.metrics berechnete Metriken nach Chidamber und Kemerer sowie Robert C. Martin Features: eigener Metrik-View graphische Darstellung als Dependency Graph Nachteil: Probleme unter Linux 33
Literatur Bücher: Henderson-Sellers, Brian: Object-Oriented Metrics, measures of Complexity Martrin,Robert: Agile Software Development, Principles, Patterns and Practices URLs: http://www.refactorit.com http://cccc.sourceforge.net/ http://www.clarkware.com/software/jdepend.html http://metics.sourceforge.net http://www.teaminabox.co.uk/downloads/metrics/ 34
Ende Vielen Dank für die Aufmerksamkeit! 35