SWC Zwei
Cool
Cool
-
- 1 / 79
-
Flashcards
Was erhöht die Komplextität?
Verzweigungen wie:
- if
- else if
- for
- while
- switch
- catch
- logische Operatoren (&&, ||)
Was bedeutet hohe Komplexität?
- Schwerer verständlich
- Schwieriger Testbar
- Fehleranfälliger
- Schwer wartbar
Was ist Cyclomatic Complexity (McCabe)?
- Das ist die Anzahl von möglichen Ausführungspfade durch den Code
- Für eine einzelne Methode ist die Cyclomatic Number N definiert als N = b + 1, wobei b die Anzahl von "Binären Entscheidungspunkten" ist (if, while, for, case..)
- Je kleiner die Number N ist, desto besser
- N < 10 = Code ist gut lesbar!
Was sind typische Entscheidungspunkte?
- if
- for
- while
- case
Hinweise zu Komplexität:
- Switch-Statement ist kein Entscheidungspunkt
- else und default sind ebenfalls keine Entscheidungspunkte, die Entscheidungen werden im "if"-statement oder in den cases gemacht.
"else" und "default" sind nur die überigen Alternativen
- breakt zwingt einen Wechsel, ist also auch kein Entscheidungspunkt
- Nicht "if" oder "while"-statement selbst ist ein Entscheidungspukt, aber die individuellen Entscheidungspunkte in den Statements if (a < 5 || a > 10) sind 2 Entscheidungspunkte!
SWITCH-STATEMENTS SIND GUT LESBAR; ABER ERHÖHEN DIE KOMPLEXITÄT!
Was ist Lack of Cohension in Methoden?
- Metrik, die angibt, wie stark zwei Entitäten aneinander gekoppelt sind
-Cohesion: Mass innerhalb einer Klasse
-> Misst, wie eng Methoden einer Klasse gekoppelt sind
- Coupling/Dependency: Mass innerhalb mehrere Klassen
-> Misst den Grad, zu dem jede Klasse von anderen Klassen abhängt
- Low Coupling korreliert überweise mit igh Cohsion (Das ist optimal)
- Metriken: LCOM (Lack of Cohesion in Method)
BegriffBedeutung
CohesionZusammenhang innerhalb einer Klasse
CouplingAbhängigkeit zwischen Klassen
LCOMMetrik für fehlende Cohesion
BegriffBedeutung
CohesionZusammenhang innerhalb einer Klasse
CouplingAbhängigkeit zwischen Klassen
LCOMMetrik für fehlende Cohesion
Welche dynamischen Software-Metriken gibt es?
- Programm wird ausgeführt für die Analyse während der Laufzeit
1) Performance Metriken:
- > Time Spent (Laufzeit, Antwortzeit)
- > Memory consumption (Speicherverbrauch während der Ausführung)
- > Network traffic (Wie viel Netzwerkdaten übertragen werden)
- > Bandwidth needed (Wie viel Bandbreite erforderlich ist)
- > Number of clicks to perform a task (Usability)
Welche anderen dynamischen Softwaremetriken gibt es noch?
- Anzahl ausgeführte Tests
- Anzahl fehlgeschlagene Tests
- Code Coverage
Welche Software-Entwicklungs Metriken gibt es?
- Person months/years spent on development
- change requests implemented
- impact of change request per module
- Found bugs per code volume
- bugs per module
- time to solve bugs/costs to solve bugs
Was sind Softwareprojekt Metriken?
- Projektkosten vs vorgesehene Projekkosten
- Kosten pro Funktionalität
- Gelieferte Funktionalität vs. geplannte Funktionalität
- Kostes für seperate Aktivitäten (Meeting vs. Entwicklungszeit)
Es ist wichtig diese Metriken mit einem Kontext zu setzen!
Welche Arten von Test Coverage gibt es? Welche Coverage Typen gibt es?
Coverage = Wie viel vom Code wurde getestet?
1) Statements: Misst, wie viele der Programmanweisungen (Code-Zeilen) durchlaufen wurden. Selbst bei \(100\%\) ist nicht sichergestellt, dass die Software fehlerfrei arbeitet.
- Lines
- Instructions
- Basic Blocks
2) Paths: Prüft jede mögliche Kombination von Ausführungspfaden von Anfang bis Ende. Dies ist bei komplexen Systemen oft mathematisch unmöglich vollständig zu testen.
3) Classes, Methods (Wurden Klassen oder Methoden überhaupt aufgerufen?) Überprüft, ob jede definierte Funktion oder Methode mindestens einmal aufgerufen wurde.
4) Branch Coverage: Stellt sicher, dass jede Verzweigung (z. B. if-else- oder switch-Anweisungen) sowohl mit true als auch mit false durchlaufen wurde.
->Decision/Branch (if (x > 0))
-> Multiple Condition (if (a > 0 && b < 5))
Coverage Ratio = covered Units/total units
Sehr wichtiger Punkt
Mehr Coverage bedeutet NICHT automatisch bessere Tests.
assertTrue(true); kann Coverage erhöhen, testet aber fast nichts Sinnvolles.
- Coverage wird durch Instrumentation gemessen -> Zusätzlicher Code in das Programm einfügen, um während der Ausführung Informationen zu sammeln
Wie funktioniert das?
- Ein Coverage Tool (z.B. JaCoCo) verändert den Bytecode -> Er fügt einen Marker ein
coverageMarker(17);
if (x > 0) {
coverageMarker(18);
doSomething();
}
Was ist Inject Reporting Instructions?
- Zusätzliche Reporting/Tracking Instruktionen werden in den ByteCode eingefügt
ByteCode -> Coverage arbeitet meist nicht direkt auf dem Java-QuellCode -> Sondern auf .class Dateien oder .jar files
Was ist On-the-fly Instrumentation?
- Der ByteCode wird während des Ladens verändert, also zur Laufzeit
- Dafür verwendet man eigene Classloader oder Java Agenten
Was sind Offline Instrumentation?
- Hier wird der ByteCode vorher verändert
-> .class Dateien werden vor dem Programmstart angepasst
Was sind EclEmma Features?
1) Instrumentation:
- > Byte Code einbauen
-> Offline und on-the-fly
2) Coverage-Types (Verschiedene Typen können gemessen werden)m -> Classes, Methods, Lines, Basic Blocks
3) Report Types (Verschiedener Output wird generiert) -> txt, html, xml
4) Statistics -> Method, class, package, "all classes"
5) Execution -> ant, cmd, eclipse plugin
Was ist Refractoring?
Refractoring bedeutet:
- bestehenden Code intern verbessern, ohne das äussere Verhalten der Software zu verändern
Also:
- Code wird sauberer
- verständlicher
- wartbarer
- sicherer
Aber für den Benutzer soll die Software gleich funktionieren
Mach ein Beispiel von Refractoring:
Vorher:
if (s.equals("Hallo"))
Problem wenn s == null; -> NullPointrException
Nachher:
if ("Hallo".equals(s)) -> Prüft, ob s = "Hallo"
Was ist das Ziel von Refractoring?
Refractoring verbessert:
- Lesbarkeit
- Struktur
- Wartbarkeit
- Testbarkeit
- Performance (manchmal)
- SIcherheit gegen Fehler
Was versteht man unter Code Smell?
- Ein Hinweis darauf, dass es möglicherweise Probleme im Aufbau oder Design des Codes gibt
Code, der "komisch riecht" und auf schlechte Struktur hindeutet
Wichtig:
- Code Smell ist nicht unbedingt ein Bug -> Code kann funktionieren, aber er ist:
- Schwer wartbar
- Schlecht lesbar
- Fehleranfällig
- unnötig kompliziert
Was sind Beispiele für Code Smells:
- Zu lange Methoden
- Duplicate Code
- Large Class
- Zu viele Parameter
- Deep Nesting / Zu viele verschachtelte Ifs
- God Object -> Eine Klasse kontrolleirt alles
Welche Smell Levels gibt es? Also auf welchen Ebenen treten Code Smells auf?
- Code Level -> Probleme in einzelnen Methoden oder Codezeilen
- Class Design Level -> Probleme im Aufbau einer Klasse
- Architectural Design Level -> Probleme in der gesamten Systemarchitektur (Zyklische Abhängikeiten, stark gekoppelte Module etc).
Wie kann man Code Smells auffinden?
- Sniff out the bad smells in Code
- Code analysieren:
-> Manuell, in dem man den Code durchliest
-> Automatisiert, in dem man Software benutzt -> Checkstyle for Java, Spotbugs for Java, PMD for Java
Warum braucht es Refractoring?
1) Kontext: Man muss existierenden Code anpassen -> extend/adapt/correct
2) (Bad Solutions) -> Just add new Features
3) Konsequenzen -> Design decays /Qualität nimmt ab, Duplizierter Code, Lange Methoden/grosse Klassen
Gute Lösung:
-> Als erstes Code simpler machen, Code auf Komplexität vorbereiten -> Refractor
-> Neue Features hinzufügen
Konsequenz:
-> Code bleibt Simple
-> Codequalität bleibt hoch
Welche Voraussetzungen für Refractoring gibt es?
Automated Measures:
- Version Control System (VCS) (Man kann zurück gehen, falls Bugs entstehen)
- Continous Integration (CI) (Man möchte nach dem Refractoring das ganze System testen)
- Tests (Man will schauen, ob man etwas kaputt gemacht hat oder nicht)
- Coding Standards
Social Measures (Absteigender Reihenfolge):
- Collective Ownership (Jeder kann Code ändern)
- Rules of Simplicity
- Sustainable Pace /Nachhaltige Geschwindigkeit
- Pair programming (Driver -> Programmiert tatsächlich, Reviewer: schaut dden Code des Drivers an)
Was versteht man unter dem Two Hats-Ansatz?
- Wenn man systematisch Code entwickelt, trägt man zwei verschiedene Hüte:
1) Function Hat
2) Refractoring Hat
- Man sollte nicht versuchen den Code aufzuräumen, wenn man den "Function Hat" trägt
- Man sollte keine Features hinzufügen, wenn man den "Refractoring Hat" trägt
Wann macht man Refractoring?
- Bevor oder nachdem man Funktionalität hinzugefügt hat
- Wenn man etwas über den Code gelernt hat
- Als Konsequenz von einem Bug-Fix
- Als Konsequenz von Code Review
Wann macht man kein Refractoring?
- Wenn die Tests nicht vollstädnig durchlaufen (Pass)
- Wenn man den Code re-implementen muss
Was sollte man beim Refractoring beachten?
- Wenn man zu weit geht, Refractoring kann zu unaufhörbarem herumbasteln von Code führen
- Datenbanken können schwierig sein zu refractoren -> Code is easy to change, databases are not
- Refractoring published interfaces können zu Problemen führen für den Code, der das Interface benutzt -> API's sollen nie angepasst werden
Was sind die Vorteile von Refractoring?
- Refractoring verbessert das Design vom System
- Refractoring macht die Software einfacher zu verstehen -> Weil ihre Struktur verbessert wird, weil duplizierter Code entfernt wird
- Refractoring hilft dabei Bugs zu finden -> Weil es ein tiefes Verständnis über den Code fördert
- Refractoring spart Entwicklunsgzeit -> Weil guter Code einfach zu entwickeln ist -> Weil der Code/Das Design robuster ist
Wozu dient die Verify Methode im Zusammenhang mit Mock Tests?
Verify überprüft ob, wie und welche Methoden eines Mock-Objektes aufgerufen wurden.