MSP: HÜ Planer
Inhaltsverzeichnis
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.
Use-Case-Diagramm
Das Anwendungsfalldiagramm wurde mit der Testversion des Tools Enterprise Architect erstellt.
Code-Dokumentation
Die Dokumentation wurde mithilfe des Tools Doxygengeneriert.
Software-Metriken
Die Metriken wurden mit PHPUnit erstellt. Da keine Tests vorhanden waren, mussten zunächst die Testklassen erstellt werden.
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
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.
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
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.
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.
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.
Änderungen am DB-Schema
- 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
- newsplanner.html (neu)
planner/
- migration.sql (neu)
- planner.sql (diff)
planner/classes/
- class.userdataplanner.inc.php (neu)
- class.estudydb.inc.php (diff)
- class.functions.inc.php (diff)
- class.plannerautomation.inc.php (diff)
- class.plannermashup.inc.php (diff)
- class.planningsection.inc.php (diff)
- class.planningsectionlist.inc.php (diff)
- class.planningsectionmanager.inc.php (diff)
- class.resourcemanager.inc.php (diff)
planner/classes/view/
planner/icons/
- icon_calendar2.png (neu)
- icon_sectionToEvent.png (neu)
planner/js/
planner/jscalendar/lang/
planner/templates/
- plannereditor_edit.html (diff)
- planningeditor.html (diff)
- planningsection_current.html (diff)
- planningsection_filter.html (diff)
- ressourcenbrowser.html (diff)
planner/tests/
- class.allplannertests.php (neu)
- class.estudydbtest.php (neu)
- class.functionstest.php (neu)
planner/tests/datasets
- fill.xml (neu)