Softwaretechnik (Allgemeine Informatik) Überblick 1 Einführung und Überblick 2 Abstraktion 3 Objektorientiertes Vorgehensmodell 4 Methoden der Anforderungs- und Problembereichsanalyse 5 UML-Diagramme 6 Objektorientiertes Design 7 Test 8 Audits, Metriken, Refactoring 9 Dokumentation und Wartung 10 Projektmanagement und organisation 11 Source Revision Control Systems Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 671 Softwaretechnik (Allgemeine Informatik) Überblick: 8.1 Einleitung 8.2 Software Audits Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 672
8.1 Einleitung Definition (Martin Fowler): Refactoring is making changes to a body of code in order to improve its internal structure, without changing its external behavior. Verbesserung des Designs Zukünftige Änderungen sind leichter möglich Zukünftige Änderungen nicht erwartet: Kein Refactoring Auch Bestandteil des Extreme Programming (XP) Paradigmas Martin Fowler: Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999 Wo soll die Code-Änderung stattfinden? Automatisiertes Finden der kritischen Stellen Qualitätssichernde Audits Software Metriken Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 673 8.1 Einleitung Code Review Kategorien Programmier Standards Entwurfs-Prinzipien Geschäftslogik Laufzeitverhalten (Performance) Audits Statische Überprüfung des Quellcodes Anwendung von Programmierkonstrukten Einhaltung sog. best practices Namenskonventionen Verwendung bestimmter Operatoren (+=) Exception handling Umformatierung des Codes Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 674
8.1 Einleitung Metriken Nicht so präzise definiert (subtle science) Helfen bei Diskussionen über gutes Design Kennzahlen für Einhaltung bekannter softwaretechnischer Konzepte Zusammenhalt (cohesion) Kopplung (coupling) Kapselung (encapsulation) Vererbung Komplexität Polymorphismus Wichtig, Herkunft und Bedeutung der Kennzahlen zu verstehen Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 675 8.1 Einleitung Automatische Durchführung von Audits und automatische Berechnung von Metriken 4 Mentoren von Borland Java Quelltext mit vielen wohlbekannten Verstößen 15 Minuten Zeit Ergebnis Mentoren: 21 Verstöße in 15 Minuten gefunden Together ControlCenter: 150 Verstöße in 2 Sekunden Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 676
Softwaretechnik (Allgemeine Informatik) Überblick: 8.1 Einleitung 8.2 Software Audits Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 677 8.2 Software Audits Automatische Durchführung von Überprüfungen von Quelltext Formatierung Programmierstil Überflüssige Inhalte Fehler bei einer bestimmten Programmiersprache Nachlesbar für Java in Effectiv Java programmieren (Joshua Bloch) Code Reviews Helfen Nachwuchsprogrammierern in ihrer Einarbeitungsphase Automatische Auditing Tool hilft, Schwachstellen zu identifizieren Weist automatisch auf offensichtliche Verstöße hin Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 678
8.2 Software Audits Together ControlCenter Java: ca. 100 Kriterien C++: z.zt. 27 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 679 8.2 Software Audits Ergebnisse Sun Blueprint Program PetStore 1.3 Sun Code Conventions for Java 5258 Verstöße Together ControlCenter Default 851 Verstöße Apache Ant Version 1.4 Together ControlCenter Default 2752 Verstöße 442 davon: High Severity Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 680
Softwaretechnik (Allgemeine Informatik) Überblick: 8.1 Einleitung 8.2 Software Audits Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 681 Metriken erstellen Zählen und messen Hat relative Skala zur Folge Schwerpunkt auf Entwurfsqualität Mögliche Schwächen feststellen Signifikanz der Aussagen ist jedoch nicht beweisbar Voraussetzungen Metriken verstehen Was wird gemessen? Wie wird es gemessen? Wie müssen Ergebnisse interpretiert werden? Objektorientierte Prinzipien kennen Anwendungsdomäne kennen Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 682
Beispiel Metriken Together ControlCenter bietet 11 Gruppen von Metriken zur Qualitätskontrolle an Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 683 Beispiel Metriken Mehrere Details pro Gruppe Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 684
Beispiel Metriken Sechs Basis Metriken (Chidamber & Kemerer 1994) Depth of Inheritance Hierarchy (DOIH) Number of Child Classes (NOCC) Coupling between Objects (CBO) Response for Class (RFC) Weighted Methods per Class (WMPC) Lack of Cohesion of Methods (LOCOM) McCabe 1976 Cyclomatic Complexity (CC) Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 685 Depth of Inheritance Hierarchy (DOIH) Standard Eigenschaft von objektorientierten Entwürfen Alternativen Delegation/Komposition Interface-basierte Entwurfsstrategien DOIH: Anzahl der Elternklassen einer Klasse + 1 d.h. inkl. der eigenen Klasse d.h. oberste Klasse hat Zähler 1 Java Together ControlCenter zählt Implementierungen von Interfaces nicht mit Interface Vererbung wird gezählt Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 686
Number of Child Classes (NOCC) Anzahl der Subklasse, die von dieser Klasse erben Wachsendes NOCC Wiederverwendung nimmt zu Testen wird schwieriger Gefahr des Missbrauchs der Vererbung nimmt zu Java Implementierte Interfaces zählen mit I/F ist durch Klasse implementiert Klasse hat 6 Nachfahren I/F hat NOCC von 7 Klasse hat NOCC von 6 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 687 Coupling between Objects (CBO) Kopplung zwischen Objekten ist beim objektorientierten Entwurf eine Notwendigkeit Zuviel kann jedoch von Nachteil bezüglich Modularität, Wartung und Testen sein CBO: Anzahl der zu einer Klasse gekoppelten anderen Klassen Referenzen, Exceptions, formale Parameter Jede Klasse nur einmal Nicht gezählt werden Elternklassen, implementierte Interfaces, Standardklassen (Java: java.lang.*), primitive Datentypen Hoher Wert Schwächung der Modularität ist zu erwarten Manchmal nicht zu vermeiden Factories, Controllers, Frameworks von User Interfaces Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 688
Coupling between Objects (CBO) Beispiel (in Java) public class CBO extends Base implements Metric { private int number; 1 private List list; private String string; 2 public void one(list l, Map m) { list = l; } 3 private List throws AppException { 4 File file;... return new List(); } } CBO = 4 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 689 Response for Class (RFC) Anzahl von Methoden, die einer Klasse zur Verfügung stehen Intern Klasse und Vorfahrenklassen (überschriebene Methoden nur einmal) Extern Aufgerufene Methoden anderer Klassen (nur die direkt aufgerufenen) Maß für Komplexität einer Klasse Klasse mit vielen öffentlichen Methoden Wird von einem Klienten intensiv benutzt Klient hat hohen RFC-Wert aber möglicherweise nur einen CBO-Wert von 1 CBO misst Kopplung RFC misst Komplexität Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 690
Cyclomatic Complexity (CC) (McCabe, 1976) Anzahl der möglichen Pfade durch eine Methode aufgrund ihrer bedingten Anweisungen Beispiel public void one() { if (true) { while(false) { ; } } else { for (int i=0; i<10; i++) { ; } } } if for if for while while if for if for while while Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 691 Cyclomatic Complexity (CC) (McCabe, 1976) Seien die Pfade durch eine Methode durch einen Directed Acyclic Graph (DAC) repräsentiert if if while e Kanten n Knoten p nicht verbundene Teile CC = V ( G) = e n + 2 p for for while Ergebnis hier: 8 6 + 2 * 1 = 4 if while if while for for Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 692
Weighted Methods per Class (WMPC) Summe der CC-Werte pro Methode für eine Klasse WMPC = n cci i= 1 Together ControlCenter: WMPC1 Alternativ: Anzahl der Methoden plus deren formale Parameter Together ControlCenter: WMPC2 Großer Wert von WMPC: Zeit und Aufwand für Entwicklung und Pflege wächst Potential für Wiederverwendung kann abnehmen Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 693 Weighted Methods per Class (WMPC) Klasse mit einer langen und komplexe Methode WMPC1 groß WMPC2 klein Klasse mit vielen kleinen, nicht komplexen Methoden Ähnliche Werte für WMPC1 und WMPC2 Daten Klasse mit getters und setters für jedes Attribut WMPC2 ist größer als WMPC1 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 694
Lack of Cohesions of Methods (LOCOM) Ungleichheit der Methoden einer Klasse bezüglich deren Attribute Arbeiten verschiedene Methoden mit verschiedenen Sätzen von Attributen? Großer Wert Geringer Zusammenhalt Anzahl Methoden: m Menge von Attributen: A j Anzahl Attribute: a Anzahl Methoden, die auf A j zugreifen: µ(a j ) LOCOM 1 a = a µ ( A i= 1 1 m j ) m 100 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 695 Lack of Cohesions of Methods (LOCOM) Together ControlCenter: LOCOM3 1 a LOCOM = a µ ( A ) i= 1 j m 100 1 m one() one() a1 a1 a2 a2 LOCOM3 = 100 LOCOM3 = 33 Kein Zusammenhalt Hoher Zusammenhalt a3 a3 Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 696
Interpretation Balkendiagramm: Ein Metriktyp für alle Klassen Rot: Obergrenze überschritten Blau: Untergrenze unterschritten Grün: o.k. Kiviat Graph Mehrere Metriken für eine Klasse oder ein Package Skaliert auf einheitlichen Wert (roter Kreis) Distribution Graph Verteilung der konkreten Werte einer Metrik über den gesamten Wertebereich (Histogramm) Trendanalyse Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 697 Softwaretechnik (Allgemeine Informatik) Überblick: 8.1 Einleitung 8.2 Software Audits Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 698
Refactoring Unterstützung in Entwicklungstools Gibt es mittlerweile Woher weiß man, wo etwas geändert werden muss? Software Audits Analyse von Metriken Vorgehensweise Führe Unit Tests, Audits, Code Formatierung durch Erstelle Metriken und analysiere sie Untersuche die kritischen Bereiche Refactor Code, setze ggf. Design Patterns ein Führe alle Tests, Audits und Metrikenerstellung neu durch Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 699 Extract Class Refactoring High Coupling (CBO) Lack of Cohesion (LOCOM3) Number of Attributes (NOA) Extract Method Refactoring Maximum Size of Operation (MSOO) Response for Class (RFC) Maximum Number of Levels (MNOL) Cyclomatic Complexity (CC) Weighted Methods per Class (WMPC1, WMPC2) Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 700
Tomcat 4.0.3 Default Satz von Metriken Resultat: Gesamter Quellcode Maximalwert jeder Metrik über alle Klassen Aggregation: Maximum Granularität: Class Nicht typisch für bestimmte Klasse Die Maximalwerte kommen irgendwo vor Genauer: MSOO: Max. CC in Klasse WMPC1: Summe CC in Klasse Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 701 Klasse WebdavServlet Höchster MSOO Wert Auch WMPC1 ist hoch, wenn auch nicht am höchsten im Projekt Vorgehensweise JUnit Test Cases durchführen Default Audits 2 unused private class members Reformatiere Code... Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 702
Extract Method Refactoring dolock() Methode ist extrem lang Chance, einen Teil des Codes in eine separate Methode auszulagern Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 703 Extract Class Refactoring WebdavServlet LOCOM3-Wert ist 92: Wenig Zusammenhalt In Ordnung NOO: Number of Operations NOC: Number of Inner Classes NOAM: Number of added Methods NOA: Number of Attributes Kritisch NORM: Number of Remote Methods FO: Fan Out HPLen: Program Length LOC: Lines of Code Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 704
Was tut das WebdavServlet? service() Methode: Verschachtelte Verzweigung zu entsprechender do*- Methode Refactoring durch Ersetzen der bedingten Verzweigung durch Polymorphismus Für jede Methode eine implementierte Klasse Factory Pattern zur Erzeugung der passenden Klasse Prof. Dr. Björn Dreher Softwaretechnik (Allgemeine Informatik) 705