Allgemeines
Das Code Analyse Plugin (CAP) ist ein Open Source Plugin für Eclipse, das die Paket- und Klassenabhängigkeiten in Java Projekten untersucht. Das Ziel ist die Verbesserung der Kapselung, Architektur und der Paketstruktur um eine maximale Wiederverwendbarkeit und eine bessere Wartbarkeit zu erreichen.- Homepage
- aktuelle Version: 1.2.0 (November 2006)
- Open Source Lizenz: GNU General Public License (GPL)
- leichte Erweiterbarkeit (um Views, komplett neue Oberfläche, Integration in weitere IDEs)
- Ermittlung von Kennzahlen, durch die Schwächen in der Architektur erkannt werden
Ein Beispiel
Ausgangsituation
- vier Pakete (Einkauf, Lager, Versand, Montage) mit jeweils ein bis zwei konkreten Klassen
- verschiedene Abhängigkeiten untereinander (Pfeile)
- Änderungen betreffen andere Abteilungen ("Touch one – touch everyone")
- Logik (z.B. Unterscheidung Groß-/Kleinteile) ist "verstreut"
- Seiteneffekte
Verbessert
- vorgeschaltete abstrakte Klassen bzw. Interfaces (Annahme, Lagerist, Versender, Monteuer)
- Abhängigkeiten der konkreten Klassen nur von diesen abstrakten Klassen bzw. Interfaces
- Änderungen betreffen nur eine Abteilung
- Logik (z.B. Unterscheidung Groß-/Kleinteile) ist "daheim"
- Keine Seiteneffekte
- Änderungen leicht durchführbar
Kennzahlen & berechnete Werte
Folgende Kennzahlen benutzt CAP:- CC: Anzahl der konkreten Klassen im Paket
- AC: Anzahl der abstrakten Klassen und Interfaces
- Ca: afferente (eingehende) Kopplungen / "used by"
Anzahl der Pakete, die von diesem Paket abhängig sind bzw. die dieses Paket benutzen - Ce: efferente (ausgehende) Kopplungen / "depending on"
Anzahl der Pakete, von denen dieses Paket selbst abhängig ist bzw. die dieses Paket selbst benutzt.
Je höher die Zahl ist, desto mehr Pakete müssen zum kompilieren und zur Laufzeit zur Verfügung stehen.
Aus diesen Kennzahlen lassen sich folgende Werte ermitteln, die auf Schwächen in der Architektur hinweisen.
- A: Abstraktheit
Wert zwischen 0 und 1: AC / Anzahl aller Klassen
Je höher der Wert, desto größer ist der Anteil der Interfaces und abstrakten Klassen im Paket.
A = 0: Keine abstrakten Klassen im Paket
A = 1: Nur abstrakte Klassen im Paket - I: Instabilität
Wert zwischen 0 und 1: Ce / (Ce + Ca)
Gibt an wie hoch das Verhältnis der ausgehenden Abhängigkeiten im Verhältnis zu der Summe der Abhängigkeiten ist.
I = 0: Paket ist komplett stabil. Keine Abhängigkeiten von anderen Paketen vorhanden.
iiiiiiiiiiiiPaket ist unempfindlich gegen Änderungen an anderen Paketen.
I = 1: Paket ist komplett instabil. Alle Abhängigkeiten sind "used by" Abhängigkeiten.
iiiiiiiiiiiiDieses Paket reagiert sehr empfindlich auf Änderungen in anderen Paketen, da es von vielen Paket abhängig ist. - D: Abstand von der Hauptsequenz
Wert zwischen 0 und 1. Idealisierte Hauptsequenz: A + I = 1
Gibt den Abstand von dieser idealisierten Linie an und damit die Balance zwischen Abstraktheit und Stabilität.
Optimale Packages sind vollständig abstrakt und stabil (A = 1und I = 0) oder entsprechend konkret und instabil (A = 0 und I = 1).
Anwendung unter Eclipse
CAP bietet keine Einstellungsmöglichkeiten. Starten lässt es sich über "Rechtsklick auf ein Projekt --> Show CA". Daraufhin öffnet sich eine neue Ansicht:
Hier sieht man ein Projekt, das der Ausgangssituation des Beispiels oben entspricht. Es gibt vier Pakete mit jeweils ein bis zwei konkreten Klassen, die sich
untereinander benutzen.
Die GUI enthält folgende Elemente:
- Links oben: Übersicht über die Pakete und enthaltenen Klassen
- Mitte: Graphische Übersicht die Abhängigkeiten eines ausgewählten Paketes und seine Klassen. Führt ein Pfeil von A zu B bedeutet dies, dass B von A benutzt wird.
EP = die efferenten Pakete, EC = efferente Klassen, AP = afferente Pakete, AC = afferente Klassen - Rechts oben: Graphische Darstellung der Kennzahlen sowie der daraus berechneten Werte
- Rechts unten: Auflistung der afferenten und efferenten Kopplungen
- Links unten: Der Abstandsgraph. Hier sieht man die Ideallinie (graue Gerade) sowie die Positionen der Pakete (Punkte). Je größer ein Paket, desto mehr Klassen enthält es. Das aktuell ausgewählte Paket wird als grüner Punkt dargestellt. Die X-Achse enthält die Abstraktheit, die Y-Achse die Instabilität. Optimale Pakete liegen genau auf der Ideallinie. Je weiter sie von dieser entfernt sind, desto schlechter ist die Kapselung.
Je höher der Anteil der abstrakten Klassen/Interfaces im Paket ist (Abstraktheit), desto weiter rechts wird das Paket in dem Koordinatensystem dargestellt. Je höher der Anteil der efferenten Verbindungen (bzw. je mehr Klassen ein Paket benutzt), desto höher wird es im Koordinatensystem dargestellt (Instabilität).
Der Optimalfall ist eine Balance zwischen der Abstraktheit A und der Instabilität I: A + I = 1.
In unserem Beispiel (Ausgangssituation) liegen die Pakete in X-Richtung alle bei 0, da sie keine abstrakten Klassen oder Interfaces enthalten (Abstraktheit = 0).
Die Position in Y-Richtung (Instabilität) unterscheidet sich durch die Anzahl der Pakete/Klassen, die sie benutzen.
Man kann erkennen, dass fast alle Pakete relativ weit von der Ideallinie entfernt sind.
Sehen wir uns nun die Analyse eines Projekts an, welches die verbesserte Situation unseres Beispiels repräsentiert:
Wir sehen nun hier die eingeführten Interfaces und verbesserten Abhängigkeiten (die konkreten Klassen benutzen nur noch die jeweiligen Interfaces). Dadurch haben sich alle Pakete der Ideallinie angenähert, eines liegt genau auf ihr.