Analyse und Bewertung von Software-Architekturen zwecks Unterstützung der präventiven Wartung durch Restrukturierung

BearbeiterIn:Andreas Grünwald
Titel:Analyse und Bewertung von Software-Architekturen zwecks Unterstützung der präventiven Wartung durch Restrukturierung
Typ:masters thesis
Betreuer:Oster, N.; Kreutzer, P.; Kamp, M.; Philippsen, M.
Status:abgeschlossen am 4. April 2017
Vorausetzungen:
Thema:

Problemstellung:
Ausgangssituation ist ein großes, in zahlreiche Komponenten aufgeteiltes Softwaresystem, das größtenteils in C# implementiert wurde. Die einzelnen Komponenten des Systems sind in Module (im C#/.Net Umfeld "Assemblies" genannt) aufgeteilt. Die Abhängigkeiten zwischen den Komponenten bedingen zahlreiche Abhängigkeiten zwischen den Modulen, was dazu führt, dass auch kleine Änderungen an einer Komponente große Auswirkungen auf das Gesamtsystem haben. Neben potentiell unerwarteten Auswirkungen auf das System schlägt sich dies auch in der Übersetzungszeit des gesamten Projekts nieder, da unter Umständen eine große Zahl an Modulen neu übersetzt werden muss.

These:
Es kann davon ausgegangen werden, dass die aktuell vorliegende Aufteilung in Module nicht den natürlichen Abhängigkeiten der Komponenten untereinander entspricht. Beispiele solcher nicht-optimalen Aufteilung sind z.B. falsche Zuordnung einer Komponente zu einem Modul, "unerlaubte Abhängigkeiten" und Bündelung von nicht zusammengehörenden Komponenten.

  • Eine Komponente ist falsch zugeordnet, wenn sie viele Abhängigkeiten zu Komponenten in einem anderen Modul hat, aber zu einem Modul gehört, zu dessen anderen Komponenten wenige Abhängigkeiten bestehen. Um eine solche falsche Aufteilung aufzulösen, sollte die entsprechende Komponente in ein anderes Modul verschoben werden.
  • Unerlaubte Abhängigkeiten könnten entstehen, wenn eine Komponente die architektonische Aufteilung des Programms in Schichten verletzt, indem es beispielsweise die unter der Komponente liegende Schicht "überspringt" und direkt eine noch weitere unten liegende Schicht aufruft. In diesem Fall muss unter Umständen eine neue Abstraktionsschicht eingeführt werden, um eine saubere Architektur herzustellen.
  • Werden Komponenten aus verschiedenen Schichten des Systems in einem Modul zusammengefasst, entstehen ebenfalls falsche Abhängigkeiten, da ein solches Modul von mehreren Schichten aufgerufen wird. Komponenten eines solchen Moduls, sollten in zwei separate Module aufgeteilt werden, sodass jedes Modul eindeutig einer Schicht zugeordnet werden kann.

Verifikation:
Um oben genannte These zu überprüfen, soll das System mittels statischer Code-Analyse untersucht werden und aus den Abhängigkeiten eine Abhängigkeitsmatrix oder ein Abhängigkeitsgraph erzeugt werden. Auf dieser Basis können, mit Hilfe von Clustering-Algorithmen, Gruppen von Komponenten gefunden werden, die starke Abhängigkeiten untereinander aufweisen. Auch können Muster nicht-optimaler Aufteilung, wie beispielsweise die oben beschriebenen Fehler, im Graph oder der Matrix erkannt werden.

Konkrete Umsetzung:
Vorab sind die vorangehend exemplarisch genannten Architekturanomalien um weitere Architektur- bzw. Entwurfs-(Anti-)Muster zu ergänzen und so aufzubereiten, dass sie maschinell auf vorhandenen Code angewendet werden können. Anschließend sollen existierende Werkzeuge zur statischen Code-Analyse hinsichtlich ihrer Eignung zur Identifikation derartiger Architektur-Anomalien evaluiert werden. Falls notwendig und möglich soll ein adäquates Werkzeug ggf. so um weitere Regeln bzw. Plugins erweitert werden, dass Architekturprobleme im Code lokalisiert und anhand einer Metrik priorisiert werden. Im Idealfall soll das so erweiterte Werkzeug Vorschläge für eine Behebung des Architekturproblems generieren und diese auch automatisiert anwenden. Falls es kein adäquates Werkzeug gibt, muss gegebenenfalls ein neues Programm z.B. auf Basis des Microsoft C#-Compilers ("Roslyn") erstellt werden, mit dessen Hilfe die Abhängigkeiten aus dem Quellcode extrahiert und z.B. in einer (Graph-)Datenbank abgelegt werden. Anschließend sollen verschiedene Clustering-Algorithmen untersucht, einer dieser Algorithmen implementiert und dieser auf die Datenbasis angewendet werden.

Erwartetes Ergebnis:
Ziel der Arbeit ist es, eine Infrastruktur zu erschaffen, um in einem großen Softwaresystem, eine Klasse von Problemen in der Strukturierung des Systems mittels statischer Code-Analyse zu identifizieren und Lösungswege für die Behebung solcher Probleme aufzuzeigen. Im besten Fall lässt sich eine Reihe dieser Problemstellen finden, die ohne Beeinträchtigung des Rest-Systems korrigiert werden können.

watermark seal