- Bei der Durchsicht einer aktuellen Codebasis entstand trotz guter Codequalität ein mental ermüdendes Gefühl
- Das hing weniger mit der Komplexität des Codes als mit seiner Lesbarkeit zusammen
- Es wurden acht Muster abgeleitet, um die Lesbarkeit von Code zu verbessern
Metriken für Codelesbarkeit und alternative Komplexitätsmetriken
- Es gibt keine allgemeingültige und weit verbreitet genutzte Metrik zur Messung der Lesbarkeit von Code
- Stattdessen existieren vor allem wissenschaftliche Arbeiten oder persönliche Meinungen, die in der Praxis kaum verwendet werden
- Anstatt neue Metriken zu entwickeln, liegt der Fokus auf visuellen Mustern, die jeder leicht diskutieren kann
- Wichtige Bedingungen für Komplexitätsmetriken:
- Sie sollten auf Quellcode-Snippets oder einzelne Funktionen anwendbar sein
- Der Fokus liegt auf der Art, wie Code geschrieben ist, nicht auf algorithmischer Komplexität
- Stil-Elemente (Variablennamen, Leerraum, Einrückung usw.) stehen nicht im Fokus
Halstead-Komplexitätsmetriken
- Eine in den 1970er-Jahren von Maurice Halstead entwickelte Metrik für Codekomplexität
- Sie kann die Art, wie Code geschrieben ist, unabhängig von Sprache und Plattform quantifizieren
- Auf Basis der Anzahl von Operatoren und Operanden werden Länge, Volumen und Schwierigkeit eines Programms berechnet
- Wichtige Messwerte:
- Anzahl eindeutiger Operatoren (
n1)
- Anzahl eindeutiger Operanden (
n2)
- Gesamtzahl der Operatoren (
N1)
- Gesamtzahl der Operanden (
N2)
- Je mehr Operatoren und Operanden verwendet werden, desto höher ist die Komplexität des Codes
- Da Operatoren und Operanden nicht in jeder Sprache eindeutig definiert sind, ist der Einsatz konsistenter Tools wichtig
Erkenntnisse aus der Halstead-Komplexität
- Kurze Funktionen mit wenigen Variablen sind besser lesbar
- Sprachspezifische Operatoren oder syntactic sugar sollten nur sparsam eingesetzt werden
- Auch in der funktionalen Programmierung verschlechtern lange Chains (
map/reduce/filter usw.) die Lesbarkeit
Kognitive Komplexität (Cognitive Complexity)
- Eine von SonarSource entwickelte Komplexitätsmetrik
- Ein Versuch, die Schwierigkeit des Codeverständnisses genauer zu messen
- Drei zentrale Prinzipien:
- Kurzschreibweisen (shorthand constructs) verringern die Leseschwierigkeit
- Unterbrechungen des nichtlinearen Kontrollflusses erhöhen die Schwierigkeit
- Verschachtelte Kontrollflüsse erhöhen die Schwierigkeit
Erkenntnisse aus der kognitiven Komplexität
- Kurzschreibweisen sind kompakt, bergen aber ein potenzielles Bug-Risiko
- Bedingungen und logische Operatoren verschlechtern bei übermäßigem Einsatz die Lesbarkeit
- Exception Handling ist ein wesentlicher Treiber von Codekomplexität
goto sollte im Allgemeinen vermieden werden, kann aber in bestimmten Situationen nützlich sein
- Verschachtelte Kontrollstrukturen sollten möglichst reduziert werden
Form, Muster und Variablen in Funktionen
- Die visuelle „Form“ einer Funktion spielt eine wichtige Rolle für die Lesbarkeit von Code
- Drei Prinzipien für bessere Lesbarkeit:
- Klare und spezifische Variablennamen verwenden
- Shadowing von Variablen vermeiden
- Visuell gut unterscheidbare Namen verwenden (
i, j und ähnliche Namen vermeiden)
- Die Lebensdauer von Variablen verkürzen (liveness)
- Je kürzer der Gültigkeitsbereich einer Variablen, desto besser
- Variablen, die lange über Funktionsgrenzen hinweg bestehen bleiben, erhöhen die Komplexität
- Vertraute Code-Muster wiederverwenden
- Konsistente Code-Muster verbessern die Lesbarkeit
- Vertraute bestehende Muster sollten neuen Ansätzen vorgezogen werden
Acht Muster zur Verbesserung der Codelesbarkeit
- Anzahl von Zeilen/Operatoren/Operanden verringern – kleine Funktionen und wenige Variablen verbessern die Lesbarkeit
- Neue Herangehensweisen vermeiden – vertraute Muster in der Codebasis beibehalten
- Gruppierung – lange Funktions-Chains, Iteratoren usw. in Hilfsfunktionen auslagern
- Bedingungen vereinfachen – Bedingungen kurz halten und die Mischung logischer Operatoren minimieren
goto minimieren – wenn nötig, nur eingeschränkt für Error Handling verwenden
- Verschachtelung minimieren – verschachtelte Logik reduzieren und bei Bedarf in Funktionen auslagern
- Klare Variablennamen verwenden – spezifische und nicht doppeldeutige Variablennamen nutzen
- Lebensdauer von Variablen verkürzen – sie innerhalb der Funktion kurz halten und nicht über Funktionsgrenzen hinausreichen lassen
Fazit
- Codelesbarkeit ist ein wichtiger Faktor für Codequalität
- Halstead und Cognitive Complexity können Lesbarkeitsprobleme quantifizieren und Verbesserungsrichtungen aufzeigen
- Prägnanter und klarer Code erleichtert die Wartung und verringert die Wahrscheinlichkeit von Bugs
- Gute Codeerstellung priorisiert Einfachheit, Konsistenz und Klarheit
1 Kommentare
Hacker-News-Kommentare
Das Verketten funktionaler Programmierkonstrukte wie
map,reduceundfilterist kompakt, aber lange Ketten neigen dazu, die Lesbarkeit zu verschlechternmapundfilterzu schimpfenEin wichtiger Aspekt von gutem Code ist qualitativ und literarisch
Das ermüdendste Problem beim Lesen von Code ist Veränderlichkeit
Kleine Funktionen und wenige Variablen sind im Allgemeinen leichter zu lesen
TypeScript macht Code schwerer lesbar
Die Funktion
getOddness4erzeugt AsymmetriegetOddness2bietet eine symmetrische AuswahlDer Artikel ist interessant, aber nicht zufriedenstellend
map,reduceundfilterersetzen bei guter Verwendung andere Operatoren und reduzieren das „Volumen“Der Versuch, Lesbarkeit zu definieren, ist lobenswert
Codekomplexität wird durch die Größe des Syntaxbaums ausgedrückt
Lange Funktionsketten oder Callbacks sollte man in kleine Gruppen aufteilen und gut benannte Variablen verwenden