MSP:HÜ Rollen

Aus THM-Wiki
Wechseln zu: Navigation, Suche
Dokumentation
Arbeitstitel MSP:HÜ Rollen
Kurs Methoden des Software-Entwicklungsprozesses
Semester WS 09/10
Teilnehmer Alexander Rausch, Johannes Tietje
Programmiersprache PHP


Diese Wiki-Seite dient zur Dokumentation der Hausübung "Rollen", die im Rahmen des Moduls "Methoden des Softwareentwicklungsprozesses (MSP)" an der Fachhochschule Gießen-Friedberg im Wintersemester 09/10 bearbeitet wird. Verantwortlich für die Hausübung sind Alexander Rausch und Johannes Tietje.

Einleitung

Das Modul "Rollenspiel" oder "Rollen" ermöglicht es, den Mitgliedern eines Kurses, neben ihren tatsächlichen eStudy-Rollen (Administrator, Student, etc.) weitere benutzerdefinierte Rollen einzunehmen. Mit dieser Funktion lassen sich beispielsweise Planspiele oder Szenarien aus dem täglichen Alltag auf Mitglieder eines Kurses abbilden.

Ein mögliches Rollenspiel wäre etwa die Durchführung eines Software-Entwicklungsprojektes, in dessen Verlauf einzelnen Kursteilnehmern Rollen wie "Teamleiter", "Entwickler" oder "Kunde" zugeordnet werden können. Rollen werden in sogenannten Rollen-Sets zusammengefasst. Rollen-Sets können vom Administrator des Portals vorgeben, oder von einem Kursdozent für seinen Kurs selbst definiert werden. Rollen lassen sich beliebig wechseln und der Verlauf der Rollenzuteilung kann in einer Chronik vom Teilnehmer nachvollzogen werden.

Aufgabenstellung

Zu den Aufgaben gehört eine ausführliche Analyse des Moduls hinsichtlich der Struktur (UML-Diagramm, PHPDocs), des Datenmodels (DB-Schema) und der vorhandenen Use-Cases. Mit ermittelten Code-Metriken und den Merkmalen der sog. Bad Smells sollen danach eventuell auftretende Unreinheiten im Quellcode identifiziert und im Zuge der Implementierung eines neuen Features beseitigt werden.

Da das eStudy-Portal jedes Semester mit einer größeren Benutzeranzahl zurecht kommen muss, soll die Performance des Moduls überprüft und entsprechende Caching- und Datenbank-Query-Optimierungen vorgenommen werden.

Zum Einsatz kommen verschiedenste Werkzeuge, die an den entsprechenden Stellen benannt werden.

Autoren des Moduls

C. Weiß, M. Keim (vereinzelt)

Bestandsaufnahme

Dokumentation

Anbei die mit Doxygen erstellte Dokumentation des Moduls.

Dokumentation

Quelltext

Metriken

Um die Qualität des Codes auf einer neutralen Basis zu dokumentieren, wurden die Change Risk Analysis and Predictions (C.R.A.P.)-Metriken durch PHPUnit erzeugt.

C.R.A.P.-Metriken des Moduls "Rollen"

Wie an den Metriken zu erkennen, gab es bisher noch keinerlei Unit-Tests für dieses Modul.

Zur Vorgehensweise siehe auch: Code-Metriken mit PHPUnit

Bad Smells

General comment (Modul: Rollen)

Switch-Statements und eine Aufteilung der Logik der Rollen auf Skripting-Dateien und Klassen zieht einen Shotgun Surgery-Smell nach sich.

File: class.chronicle.inc.php
General comment

Die Klasse "Chronicle" gibt eine Übersicht über alle durchgeführten Operationen der User mit der ihren zugewiesenen Rolle in einem bestimmten Kurs. Sie implementiert in ihren Methoden die Logik zur Ausgabe der notwendigen Daten und vermischt hier diese mit der Logik für die Datenbeschaffung aus anderen Klassen des Moduls. Stellenweise behandelt eine Methode zu viel Logik. Mit etlichen Switch-Case Konstrukten wirkt der Code schwer lesbar und etwas überladen.

Method Bad Smell Comment
showChronicle() Switch Statements Diese Methode enthält mehrere ineinander geschachtelte switch-Statement. Das macht den Code schwer lesbar.
listItems() Switch Statements Diese Methode enthält mehrere ineinander geschachtelte switch-Statement. Das macht den Code schwer lesbar.
showChronicle() Long Method Die Logik für Datenbeschaffung und Datenausgabe ist hier stark vermischt.
listItems() Long Method Die Logik für Datenbeschaffung und Datenausgabe ist hier stark vermischt.
File: class.rolesetlist.inc.php
General comment

Die Klasse Rolesetlist beinhaltet Aktionen, die auf allen Rollensets ausgeführt werden. Neben vereinzelten Kommentaren wird auch hier HTML-Ausgabe und Logik vermischt.

Method Bad Smell Comment
listRoleSets() Long Method Die Methode enthält diverse Verschachtelungen und Vermischung von HTML und Logik.

Nichtfunktionale Anforderungen

Performance

Eine Messung der Performance wurde mit dem Tool KCacheGrind unter der Nutzung von Xdebug-Log-Dateien vorgenommen. Wie an den drei vorgenommen Use-Cases "Rollen auflisten", "Rollenset erstellen", "Rollenset löschen" abgelesen werden kann, beansprucht das eigentliche Modul "Rollen" 25-30% der verwendeten Zeit für sich und nutzt ca. 6 SQL-Abfragen (mit Portal-weitem allgemeinen Code) um alle Aufgaben zu erledigen. Eine Verbesserung der Performance durch Caching oder SQL-Tuning würde sich bei Portal-weit eingesetztem Code stärker bemerkbar machen, als am "Rollen"-Modul ("We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. [...]", Donald E. Knuth).

Rollen auflisten
Rollenset erstellen
Rollenset löschen


Klassendiagramm (Auszug)

Das nachfolgende Klassendiagramm zeigt die an dem Modul beteiligten Klassen. Das Diagramm wurde mit dem Tool Enterprise Architect erstellt.

Was auf den ersten Blick ins Auge sticht:

  • Da das Modul unter PHP 4 entwickelt worden ist, sind alle Attribute der Klassen öffentlich und mit keinem Sichtbarkeitsattribut wie private oder public versehen.
  • Methoden sind nach Funktionalität und Entität in den Klassen gruppiert
  • In den Methoden existiert keine Unterscheidung zwischen HTML-Ausgabe und Logik
Klassendiagramm des Moduls vor dem Refactoring

Datenbankschema (Auszug)

Das Datenbankschema wurde mit der Open-Source Version von Mysql-Workbench und GIMP erstellt.

Das Datenbankschema des Moduls

Anwendungsfalldiagramm

Das nachfolgende Anwendungsfalldiagramm zeigt alle Anwendungsfälle des Moduls. Das Diagramm wurde ebenfalls mit dem Tool Enterprise Architect erstellt.

Anwendungsfalldiagramm des Moduls

Ergebnisse des Walkthroughs vom 16.11.09

  • Neues Feature: "Schnelle" Rollenwechsel-Funktionalität via JavaScript aus dem privaten Menü heraus.
    • ⇒ siehe "Refactoring und Implementierung des neuen Features".
  • Überprüfung der Performance der Rollen-Chronik (Kritisch bei vielen Einträgen?).
  • Überprüfung des Planspiel-Rollensets auf spezielle Funktionalität.
    • ⇒ Das Planspiel-Rollenset ist ein Rollenset wie jedes andere auch. Jedoch bieten die Rolleneinstellungen die Möglichkeit, einer Rolle einen eStudy-Style zuzuordnen. Dieser Style wird automatisch ausgewählt (außer, diese Einstellung ist vom Benutzer deaktiviert), falls der Nutzer in die entsprechende Rolle wechselt (Siehe auch class.auth.inc.php, Zeile 481, insbesondere Zeile 494ff.) .
  • Integration des Planers (bzw. der Planungsabschnitte) als weiteres, mögliches Rollen-Artefakt.
    • ⇒ siehe "Refactoring und Implementierung des neuen Features".

Refactoring und Implementierung des neuen Features

Allgemeines Refactoring

Das Rollen-Modul machte bisher keinen Gebrauch von der Data-Klasse. Dieser Mangel wurde im Rahmen des allgemeinen Refactorings beseitigt.

Außerdem wurden diverse Mängel bezüglich des Programmierstils (u.a. wurde im Modul Rollen noch nach PHP4-Vorgaben, also prä-OOP, entwickelt) behoben.

Feature "Schneller Rollenwechsel"

Das Einnehmen und Wechseln einer Rolle geschah bisher über den Menüpunkt "Rollenspiel" im Privaten Menü und sprengte den aktuellen Kontext in dem sich der Benutzer gerade befand. (Bspw. Neuen Forumbeitrag schreiben)

Dieser Screenshot zeigt die bisherige Rollenwechselseite von eStudy:

Der Rollenwechsel im altmodischen Stil sprengt den Seitenkontext.

Der Benutzer soll seine derzeitige Rolle wechseln/ablegen können, ohne dabei den aktuellen Kontext verlassen zu müssen.

Dazu wurde das "Roleplay" Icon, welches ebenfalls im Header des Privaten Menüs erscheint sobald ein eStudy-User eine Rolle einnimmt, mit einer komplett neuen Logik belegt.

Das neue Menü zum "schnellen Rollenwechsel".

Sobald das Rollenspiel-Modul in einem Kurs aktiviert ist, wird das "Roleplay" Icon automatisch im Kopf des privaten Menüs eingeblendet. Ein Klick darauf öffnet ein Menü indem der User alle Aktionen zu seinen Rollen durchführen kann:

  • Alle möglichen Rollen anzeigen
  • Wechsel zu einer anderen Rolle
  • Informationen zur aktuellen Rolle anzeigen
  • Keine Rolle einnehmen

Ein Rollenwechsel ist jetzt auch möglich ohne das der Kontext gewechselt wird. Wird die Rolle während dem Schreiben eines neuen Forumbeitrags gewechselt, besteht sofort die Möglichkeit mit den Beitrag mit der neuen Rolle zu verfassen.

Die Aktionen werden mittels Ajax Requests an die Roleplay Klasse Userrolemanagement im Hintergrund weitergeleitet. Ist der Request erfolgreich verarbeitet worden wird der Browser refreshed.

Der Javascript / Ajax Teil ist in der Datei roleplay_menu.js zu finden.

Der Code für die Menüeinbindung und der eigentlichen Logik befindet sich in der Klasse class.menu.inc.php (Zeile 750) des Common Moduls und class.userrolemanagement.inc.php (Zeile 492) im Roleplay Modul.

Der Style des Menüs wurde in die CSS Style Definitionen für die folgenden Top-Styles (Nach Statistik) von eStudy eingepflegt und angepasst:

  • eStudy YAML
  • BlueGreens YAML Style
  • FH Style YAML
  • Gipfelstürmer

Screencast

Ein Screencast des Features "Schneller Rollenwechsel" kann unter folgender URL abgerufen werden:

Integration des Planers als neues Rollenartefakt

Planungsabschnitte, die ein Benutzer von eStudy angelegt hat, können nun auch als Rollenartefakt abgefragt werden. Dabei werden natürlich nur diejenigen Planungsabschnitte ausgewählt, die der Benutzer in der entsprechenden Rolle hinzugefügt hat. Eine spätere Erweiterung der Rollenartefakte ist problemlos möglich, in dem die Rollen-Chronik ergänzt wird (vgl. Abfrage auf installiertes Modul, Zeile 126f., Logik der Abfrage, Zeile 832f. ) und in dem die zukünftigen Artefakte als solche beim Erstellen als Rollenartefakt registriert werden (vgl. Hinzufügen eines Planungsabschnittes als neues Rollenartefakt, Zeile 733f.).

Ergebnisse des Walkthroughs vom 08.12.09

  • Im Menü "schneller Rollenwechsel" soll die Option "keine Rolle", sofern anwählbar, an einer festen Position erscheinen. Die übrigen Einträge sollen alphabetisch sortiert werden.
  • Fehlerüberprüfung (CSS-Fehler in der Chronik, Möglichkeit der Rollenmanipulation per GET- oder POST-Parameter
  • Möglichkeit der Verlinkung von Planungsabschnittsartefakten der Chronik auf einzelne Planungsabschnitte oder den kompletten Planer überprüfen.
    • ⇒ Verlinkung auf den Planer ist eingebaut, da auf einzelne Planungsabschnitte nicht verwiesen werden kann.
  • Dokumentation aller Quelltextänderungen zwischen Anfangsrevision (vor Beginn des Kurses) und jeweils aktuellem Stand für jede veränderte Datei.
    • ⇒ siehe Unten.
  • Implementierung der Datenauszugsschnittstelle:
    • Welche Rolle hat der Nutzer aktuell jeweils in seinen Kursen inne
    • Zu welchem Rollenset gehört diese Rolle
    • Welche Rollen kann der Nutzer jeweils in seinen Kursen einnehmen
    • Verlinkung auf den jeweiligen Kurs
    • ⇒ siehe Unten bzw. UserDataRoleplay

Quelltextänderungen



Neu erzeugte Dateien:

Änderungen außerhalb des Moduls:

--Rausch-ARa 10:18, 14. Dez. 2009 (CET)

--Tietje-JFT 20:31, 1. Nov. 2009 (CET)