Cyclomatic complexity

Cyclomatic complexity

Die McCabe-Metrik (auch zyklomatische Komplexität - cyclomatic complexity) ist eine Software-Metrik, mit der die Komplexität eines Software-Moduls gemessen werden kann. Die zyklomatische Komplexität wurde bereits 1976 durch Thomas J. McCabe eingeführt.

Hinter der Software-Metrik von McCabe steckt der Gedanke, dass ab einer bestimmten Komplexität das Modul für den Menschen nicht mehr begreifbar ist. Er definiert seine cyclomatic complexity auf dem Kontrollflussgraphen eines Moduls. Einfach ausgedrückt ist das Komplexitätsmaß nach McCabe gleich der Anzahl der binären Verzweigungen plus 1.

Die so ermittelte McCabe-Zahl ist ein Maß für die Komplexität des Kontrollflusses eines Programms (Funktion, Prozedur oder Stück Code). Betrachtet man den Kontrollflussgraphen, wobei die Anweisungen als Knoten und der Kontrollfluss zwischen den Anweisungen als Kanten dargestellt sind, dann ist die McCabe-Zahl M definiert als M = en + 2p

e: Anzahl Kanten im Graphen
n: Anzahl Knoten im Graphen
p: Anzahl der einzelnen Kontrollflussgraphen (ein Graph pro Funktion/Prozedur)

Bei Betrachtung eines einzelnen Kontrollflussgraphen (also p=1) gilt M = b + 1 mit

b: Anzahl Binärverzweigungen, also bedingte Anweisungen mit genau zwei Zweigen, z. B. IF-Anweisungen.

M ist eine untere Schranke für die Anzahl der möglichen Wege durch ein Programm.

M ist außerdem eine obere Schranke für die Anzahl der Testfälle, die nötig sind, um eine vollständige Kantenabdeckung des Kontrollflussgraphen zu erreichen.

Laut McCabe sollte die zyklomatische Zahl eines in sich abgeschlossenen Teilprogramms nicht höher als 10 sein, da sonst das Programm zu komplex und zu schwer zu testen ist. Diese Regel ist allerdings umstritten, da sich die zyklomatische Zahl nur dann erhöht, wenn verzweigende Anweisungen wie IF eingefügt werden, aber nicht beim Einfügen sonstiger Anweisungen (zum Beispiel einer Bildschirmausgabe). Es kann also lediglich eine Aussage über den Testaufwand (Anzahl der zu testenden unabhängigen Programmpfade) getroffen werden.

Kritik

Komplexitätsmaße sind für Menschen mitunter nicht intuitiv zu erfassen, so kann im folgenden Beispiel von Unübersichtlichkeit für Menschen keine Rede sein, jedoch wird als Komplexitätsmaß ein recht hoher Wert angegeben, zum Beispiel von dem Werkzeug CodeAnalyzer.

const char* wochentagsName(const int nummer) {
  switch(nummer)
  {
    case 1: return "Montag";
    case 2: return "Dienstag";
    case 3: return "Mittwoch";
    case 4: return "Donnerstag";
    case 5: return "Freitag";
    case 6: return "Samstag";
    case 7: return "Sonntag";
  }
  return "(unbekannter Wochentag)"
}

In der Praxis wird die switch-Konstruktion häufig für Lookup-Aufgaben dieser Art eingesetzt, die man in Sprachen wie Java zum Beispiel mit Maps lösen würde.

Literatur

  • T. J. McCabe: A Complexity Measure. in: IEEE Transactions on Software Engineering, Band SE-2, 308-320. 1976.
  • Helmut Balzert: Lehrbuch der Software-Technik ; Software-Management, Software-Qualitätssicherung, Unternehmensmodellierung, Seiten 481-482.

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Cyclomatic complexity — (or conditional complexity) is a software metric (measurement). It was developed by Thomas J. McCabe, Sr. in 1976 and is used to indicate the complexity of a program. It directly measures the number of linearly independent paths through a program …   Wikipedia

  • Complexity — For other uses, see Complexity (disambiguation). In general usage, complexity tends to be used to characterize something with many parts in intricate arrangement. The study of these complex linkages is the main goal of complex systems theory. In… …   Wikipedia

  • Essential complexity — refers to a situation where all reasonable solutions to a problem must be complicated (and possibly confusing) because the simple solutions would not adequately solve the problem. It stands in contrast to accidental complexity, which arises… …   Wikipedia

  • Programming Complexity — Programming Complexity, which is often also referred to as Software Complexity is a term that encompasses numerous properties of a piece of software, all of which affect internal interactions. According to several commentators, including… …   Wikipedia

  • Halstead complexity measures — are software metrics indroduced by Maurice Howard Halstead in 1977. These metrics are computed statically, without program execution. Calculation First we need to compute the following numbers, given the program: * n1 = the number of distinct… …   Wikipedia

  • Цикломатическая сложность — программы (англ. Cyclomatic complexity of a program)  структурная (или топологическая) мера сложности программ, используемая для измерения качества программного обеспечения, основанная на методах статического анализа кода. ЦСП равна… …   Википедия

  • Software Quality Model — Software quality can be defined as conformance to requirements and/or fitness of use . Quality achievements start with a loud and clear definition of what quality of source code means to your organization or project. In simple terms all the… …   Wikipedia

  • Panopticode — The Panopticode free software / open source project provides a standardized format for describing the structure of software projects and integrates Software metrics from several tools into that format. Reporting options provide correlation and… …   Wikipedia

  • McCabe-Metrik — Die McCabe Metrik (auch zyklomatische Komplexität cyclomatic complexity) ist eine Software Metrik, mit der die Komplexität eines Software Moduls gemessen werden kann. Die zyklomatische Komplexität wurde 1976 durch Thomas J. McCabe eingeführt.… …   Deutsch Wikipedia

  • McCabe Metrik — Die McCabe Metrik (auch zyklomatische Komplexität cyclomatic complexity) ist eine Software Metrik, mit der die Komplexität eines Software Moduls gemessen werden kann. Die zyklomatische Komplexität wurde bereits 1976 durch Thomas J. McCabe… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”