MSP: HÜ Planer

Aus THM-Wiki
(Weitergeleitet von MSP:HUE Planer)
Wechseln zu: Navigation, Suche

Allgemein

Diese Seite dient der Dokumentation der Hausübung für die Master-Veranstaltung "Methoden des Softwareentwicklungsprozesses (MSP)" im Wintersemester 2009/2010.

Mitglieder der Gruppe sind:

  • Markus Baier
  • Dennis Priefer

Die Aufgabe besteht darin, dass eStudy-Modul "Planer" zu refaktorisieren.

Nicht-funktionale Anforderungen an das Modul

  • Internationalisierung
  • Benutzbarkeit
  • Performance
  • Fehlertoleranz
  • Verfügbarkeit
  • Sicherheit (BSI)
  • Datenschutz
  • Barrierefreiheit (WAI)
  • Benutzerdokumentation
  • WIKI

Autoren des Moduls

  • Daniel Knapp
  • Jan Kammer
  • Peter Gabriel
  • Detlef Kretschmer

Lizenz

Das Modul wurde unter der GNU General Public License, version 2 veröffentlicht.

Reverse-Engineering

Klassendiagramm

Die Klassendiagramme wurden mit der Testversion des Tools Enterprise Architect erstellt.

DB-Schema

Das DB-Schema wurde mit dem Tool MySQL Workbench erstellt.

Das Schema enthält 2 Tabellen:

  • planning_ressources
    • Zuordnung der zu einem Planungabschnitt zugehörigen Ressourcen (Literatur, Forum, Dateien).
  • planningselection
    • Eingetragene Planungsabschnitte. Sind einem Kurs zugeordnet.


Db-schema planner.png

Use-Case-Diagramm

Das Anwendungsfalldiagramm wurde mit der Testversion des Tools Enterprise Architect erstellt.

Code-Dokumentation

Die Dokumentation wurde mithilfe des Tools Doxygengeneriert.

Dokumentation

Software-Metriken

Die Metriken wurden mit PHPUnit erstellt. Da keine Tests vorhanden waren, mussten zunächst die Testklassen erstellt werden.

Metriken

Code-Coverage

Performancetests

Die Performancetests wurden mit Hilfe von XDebug und des Tools KCachegrind erstellt.

Bad Smells

Die folgende Tabelle zeigt die Bad Smells, die innerhalb des Quellcodes identifiziert werden konnten.

Smell Ort
Large Class Klasse EstudyDB
Long Method PlanningSectionManager::editPlanningSectionTemplate
Long Parameter List EstudyDB::addPlanningSection
Middle Man In den Klassen PlannerMashup, PlanningSectionManager, PlannerEditorMashup
Duplicated Code Die Klasse Template ist bis auf die Methode compress_page identisch mit der Klasse Template aus dem Modul Calendar

Sonstige Anmerkungen zum Quellcode

  • Unvollständige Dokumentation
  • Teilweise unterschiedliche Formatierung des Codes
  • Teils nicht eindeutige Methodennamen
  • Fehlende Unit-Tests

Planer in den Datenauszug integrieren

Klasse UserDataPlanner

Um den Planer in den Datenauszug integrieren zu können, wurde zunächst die Klasse UserDataPlanner implementiert. Diese ist von der Klasse UserDataAdapter abgeleitet und implementiert die Schnittstelle des Interfaces UserDataProvider. Die Methode getUserData der Klasse UserDataPlanner gibt als Rückgabe ein Array mit den notwendigen Informationen für den Datenauszug zurück. Das Modul Planer besaß keine Informationen über den Erstellungszeitpunkt eines Planungsabschnitts. Da der Datenauszug diese Information benötigt, wurde der Tabelle planningsection die Spalte create_date hinzugefügt, die in Zukunft einen Unix-Timestamp enthält.


Abschließend muss das Modul in die Datenbanktabelle "userdata_modules" eingetragen werden. Innerhalb des Datenauszugs werden nun auch die Planungabschnitte angezeigt, die innerhalb eines Kurses von einem Benutzer erstellt worden sind. Die Ausgabe beinhaltet die Planungsüberschrift und den Text.

Datenauszug planner.png

Mithilfe des Links am Ende des Planungstextes gelangt der Benutzer in das Modul Planer des zugehörigen Kurses. Dort hat er die Möglichkeit, einen Planungsabschnitt zu entfernen.

Neue Features

Aufgabe nach dem Walkthrough

  • Verknüpfung des Planer-Moduls mit Aktuelles
    • Auf der Seite Aktuelles soll angezeigt werden, ob und welche Planungsabschnitte angelegt wurden --> Analog zu anderen Modulen
  • Verknüpfung mit Kalender
    • Dozent/Admin kann Planungsabschnitte in Kalender aller Kursteilnehmer einfügen
    • Bei Änderung eines Abschnittes sollen Kalendereinträge aktualisiert werden
  • Neues Design für JavaScript-Kalender der Bearbeitungs-Ansicht

Feature1: Planungsabschnitte in Modul "Aktuell" darstellen

Klassendiagramm

Die Aufgabe bestand darin, neue Planungsabschnitte im Modul "Aktuell" anzeigen zu lassen. Die Integration wurde analog zu der beschriebenen Vorgehensweise durchgeführt. Zu Beginn ist die Erzeugung einer sogenannten Newskategorie erforderlich. Dazu wurde die Klasse NewsCategoryPlanner implementiert, die von der Klasse NewsCategory abegeleitet ist. Zum Ermitteln der Datensätze bzw. Planungsabschnitte, die als Neuigkeit dargestellt werden sollen, dient die Methode getNewsByPeriod. Diese ermittelt die zu einem Kurs zugehörigen Planungsabschnitte, die innerhalb eines gewünschten Zeitraums angezeigt werden sollen. Die Darstellung der Planungsabschnitte als Neuigkeit übernimmt die Methode echoNewsEntry. Diese ermittelt die für die Ausgabe relevanten Informationen und ruft das Template newsplanner.html auf. Damit die Klasse NewsCategoryPlanner von dem Modul Aktuell berücksichtigt wird, muss ein Aufruf in der Klasse News erfolgen. Außerdem musste eine zusätzliche Spalte category27 in die Datenbanktabelle news_preferences angelegt werden.

Plannernews.png

Die Darstellung eines Planungsabschnitts wurde an die Darstellung im Modul Planer angelehnt. Mithilfe des Links am Ende des Planungstextes, gelangt der Benutzer in das Planer-Modul im zugehörigen Kurs. Der gewünschte Zeitraum für die Anzeige der Neuigkeiten, kann mithilfe der Auswahlbox ausgewählt werden. (Analog zu den anderen Newskategorien)






Feature2: Planungsabschnitte in Terminkalender exportieren

Eine Aufageb war die Einbindung der Planungsabschnitte als Kurstermine in den Kalender. Um diese Aufgabe zu realisieren mussten einige neue Funktionen zum bestehenden Modul hinzugefügt werden. Außerdem musste eine neue Tabelle calendar_planningsections angelegt werden, welche aus zwei Feldern besteht: calendarID (Foreign Key der Tabelle calendar) sowie der planID (Foreign Key der Tabelle planningsections).

Ein neuer toCalendar-Button ermöglicht es dem Dozenten eines Kurses entweder einen oder aller Planungsabschnitt(e) als Event(s) zum Kalender hinzuzufügen.
Planner with new icons.png

Dazu wurden der Klasse EStudyDB drei neue Funktionen hinzugefügt, welche die notwendige Logik für die Datenbankzugriffe enthält:

  • sectionInCalendar ($sectionID)
    • Statisch
    • Prüft, ob der Planungsabschnitt bereits als Event im Kalender vorhanden ist
  • sectionToCalendar ($planID, $event)
    • Statisch
    • Fügt Planungsabschnitt in Kalender ein
  • updateSectionInCalendar($sectionID, $event)
    • Statisch
    • Überabeitet geänderten Planungsabschnitt im Kalender

Zusätzlich wurden der Klasse Functions zwei weitere Hilfsfunktionen beigefügt:

  • starttimeToArray ($starttime)
    • Statisch
    • Gibt eine überegebene Startzeit(Datum und Uhrzeit in yyyy-mm-dd hh:mm:ss-Format) als gut verwendbares Array zurück
  • forumQuery($query)
    • Statisch
    • Führt übergebenen SQL-Befehl aus und prüft ob die Transaktion fehlerfrei abläuft


Wenn beim import in den Kalender keine Fehler auftreten, kann man die Abschnitte als Events im Kalender begutachten.
Planningsection successful to calendar.png


Planningsection in calendar.png

Änderungen am DB-Schema

Db schema new.png

  • calendar_planningsections (Zuordnungstabelle: Planungsabschnitte zu Terminen)
    • planID: Fremdschlüsselbeziehung zu Tabelle planningsection
    • eventID: Fremdschlüsselbeziehung zu Tabelle calendar
  • planningsection
    • create_date: Enthält Unix-Timestamp zum Erstellungszeitpunkt eines Planungsabschnitts
    • event: Termin eines Planungsabschnitts

Liste der überarbeiteten und neuen Dateien

Die folgende Liste beinhaltet alle überarbeiteten Dateien im Branch mit der entsprechenden Diff-Ansicht zum Vergleich mit den vorherigen Dateiversionen im Trunk. Außerdem werden alle neue Dateien augelistet.


news/classes/

news/templates

planner/

planner/classes/

planner/classes/view/

planner/icons/

planner/js/

planner/jscalendar/lang/

planner/templates/

planner/tests/

planner/tests/datasets