Halstead-Metrik
Die Halstead-Metrik ist eine 1977 von Maurice Howard Halstead vorgestellte Softwaremetrik. Sie gehört zu den statischen, analysierenden Verfahren der Komplexitätsmessung von Software.
Hierbei wird die Systemkomponente nicht aktiv ausgeführt (wie bei den dynamischen Verfahren), sondern gezielt Informationen über den Prüfling mit analytischen Mitteln gesammelt.
Berechnung
Die Halstead-Metrik bedient sich hierbei der Annahme, dass ausführbare Programmteile aus Operatoren und Operanden aufgebaut sind. Die Definition, was die zu betrachtenden Operatoren und Operanden sind, ist dabei eine der Aufgaben vor dem Einsatz einer Halstead-Metrik. Typischerweise werden z. B. Variablen und Konstanten als Operanden betrachtet; Schlüsselwörter, logische und Vergleichsoperatoren usw. als Operatoren.
Es werden dann für jedes Programm folgende Basismaße gebildet:
- Anzahl der verwendeten unterschiedlichen Operatoren (<math>\eta_1</math>) und Operanden (<math>\eta_2</math>), zusammen die Vokabulargröße <math>\eta</math>.
- Anzahl der insgesamt verwendeten Operatoren (<math>N_1</math>) und Operanden (<math>N_2</math>), zusammen die Implementierungslänge <math>N</math>.
Hieraus werden dann die Größen Halstead-Länge (<math>HL</math>) und Halstead-Volumen (<math>HV</math>) errechnet:
- <math>HL = \eta_1 \cdot \log_2 \eta_1 + \eta_2 \cdot\log_2 \eta_2</math>
- <math>HV = N \cdot\log_2 \eta</math>
Aus den Basisgrößen kann man verschiedene Kennzahlen berechnen:
- Schwierigkeit ein Programm zu schreiben bzw. zu verstehen, z. B. bei einem Code-Review: <math>D = { \eta_1 \over 2 } \cdot { N_2 \over \eta_2 } </math>
- Aufwand: <math>E = D \cdot HV </math>
- Implementierungszeit: <math>T = {E \over 18}</math> Sekunden
Die Halstead-Metrik ist leicht zu ermitteln und zu berechnen, automatisierbar und für alle Programmiersprachen einsetzbar. Die Kennzahlen stimmen meist sehr gut mit tatsächlich gemessenen Werten überein<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20100303233051
| {{#ifeq: 20100303233051 | *
| {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20100303233051}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2025-06-13 14:20:05 InternetArchiveBot | 2025-06-13 14:20:05 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20100303233051}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2025-06-13 14:20:05 InternetArchiveBot | 2025-06-13 14:20:05 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| 9 = {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2025-06-13 14:20:05 InternetArchiveBot | 2025-06-13 14:20:05 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }} ({{#if: {{#if: 2025-06-13 14:20:05 InternetArchiveBot | 2025-06-13 14:20:05 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: Programming Effort | {{#invoke:WLink|getEscapedTitle|Programming Effort}} | {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}} }}
}}}}}}}}{{#if:2025-06-13 14:20:05 InternetArchiveBot
| Vorlage:Webarchiv/archiv-bot
}}{{#invoke:TemplatePar|check
|all = url=
|opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
|cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
|errNS = 0
|template = Vorlage:Webarchiv
|format = *
|preview = 1
}}{{#ifexpr: {{#if:20100303233051|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
}}{{#if:
| {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
| web.archive.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}}
| webcitation.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}}
| archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
}}{{#if:
| {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
}}
}}{{#if:{{#invoke:URLutil|isHostPathResource|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml}}
|| {{#if: || }}
}}{{#if: Programming Effort
| {{#if: {{#invoke:WLink|isBracketedLink|Programming Effort}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://www-ivs.cs.uni-magdeburg.de/sw-eng/us/experiments/hals/hal_eff.shtml }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
}}
}}
}}</ref>. Der Nachteil ist, dass sie nur einzelne Funktionen betrifft und ausschließlich lexikalische/textuelle Komplexität misst.
Siehe auch
Literatur
- {{#invoke:Vorlage:Literatur|f}}
- {{#invoke:Vorlage:Literatur|f}}
Weblinks
- Messung von Halstead-Metriken
- Berechnung von McCabe- und Halstead-Metriken anhand eines Beispielprojekts (PDF-Datei; 737 kB)
Einzelnachweise
<references/>