Softwaretechnik 2004: Beispielanwendung


LVV - Lehrveranstaltungs-Verwaltungs-Programm


Klassendiagramm


Aufbau der Beschreibung des Klassendiagramms

Dieses Diagramm beschreibt die Klassenstruktur der kompletten Anwendung, d.h. hier müssen die Klassen der GUI (Dialoge und sonstige Fenster) einbezogen werden. Jede Klasse muss komplett durchmodelliert werden. Alle Membervariablen müssen vorhanden sein, außerdem alle Methoden. Jede Methode muss erklärt werden. Bei komplexeren Methoden sollte der Ablauf grob skizziert werden, so dass erkennbar wird, auf welche anderen Klassen die Methode zugreift.

In dieser Stufe des Designs ist die Entwicklungsplattform bekannt, d.h. die Klassen müssen an Besonderheiten der Programmiersprache und an verwendete Libraries angepaßt werden.


Der Aufbau der Beschreibung sollte so sein, dass zuerst die Datenklassen erklärt werden und man sich dann durch die Dialoge und Fenster arbeitet. Die Dialoge sollten nach Aktoren gruppiert werden, so dass zuerst alle Dialoge beschrieben werden, die der Aktor „Administrator“ sieht, anschließend die Dialoge des Lehrbeauftragten usw.


Klassendiagramm anzeigen (Achtung: falls der Internet-Explorer das Bild nicht darstellen kann, auf Festplatte speichern und mit z.B. Paint öffnen).


Anmerkung zur Datenspeicherung:

Wie bereits in der Anforderungsdefinition erwähnt, würde die Datenspeicherung idealerweise in einer Datenbank erfolgen. Dies würde u.a. auch zu einigen weiteren Hilfsklassen führen. Da dies allerdings erst Thema des 5. Semesters ist, gehen wir hier davon aus, dass die Speicherung „irgendwie“ erfolgt. Die „Save/Load/Delete“-Methoden der Datenklassen sind entsprechend nur sehr knapp dokumentiert. In der realen SWT-Projektaufgabe muss dies ausführlicher und konkreter geschehen, da ihr dies natürlich auch realisieren müsst.



Anmerkungen zur Datenkapselung:

Bei Betrachtung der Datenstruktur läßt sich erkennen, dass es einige Datenobjekte gibt, die nur innerhalb eines anderen Datenobjekts existieren können. Beispiele wären die Dateiabgabe, die nur innerhalb einer Arbeitsgruppe existieren kann. Die Arbeitsgruppe wiederum kann nur innerhalb einer Abgabe exisitieren, die Abgabe nur innerhalb eines Lehrveranstaltungstermins, und dieser nur innerhalb einer Lehrveranstaltung. Außerdem gibt es gewisse Regeln, die gewisse Aktionen unter bestimmten Bedingungen verhindern, beispielsweise ist eine Dateiabgabe nicht mehr möglich, wenn der Lehrveranstaltungstermin bereits abgeschlossen ist. Dies kann allerdings nicht das Objekt LVVDateiabgabe prüfen, sondern nur der Termin selbst. D.h. man muss dafür sorgen, dass das Anlegen oder Bearbeiten einer Dateiabgabe nur über den LV-Termin möglich ist.

Ein zweites Beispiel für solche Regeln ist das Objekt LVVLehrbeauftragter. Es darf keine zwei Lehrbeauftragten mit gleicher Personalnummer geben. Das Objekt LVVLehrbeauftragter kann diese Prüfung allerdings nicht vornehmen, da es seine anderen Instanzen überhaupt nicht kennt. Deshalb wird dies von der Klasse LVVLehrbeauftragterCollection übernommen. Auch hier gilt, dass der Lehrbeauftragte nicht ohne Kontrolle dieser Klasse änderbar sein darf.

Deshalb geben Collections, sofern sie eine Referenz auf ein Datenobjekt zurückgegeben, immer einen const-Zeiger zurück. Dadurch ist es nicht möglich, auf dem Datenobjekt ändernde Funktionen aufzurufen. Dies erfordert allerdings ein großes Stück Selbstdisziplin.

Beispielanwendung für diesen Mechanismus:

Ein Beispiel für diesen Mechanismus der Datenkapselung mittels const Funktionen findet sich hier (ConstTest).


Jede der Datenklassen führt Prüfungen durch, falls solche erforderlich sind, und wirft Exceptions bei illegalen Zuständen. D.h.: Idealerweise sollte z.B. die Matrikelnummer des Studenten schon bei der Erfassung im Dialog geprüft werden. Trotzdem prüft auch die LVVStudentCollection selbst nochmal das selbe, so dass durch einen Programmfehler im Dialog trotzdem keine illegalen Zustände erreicht werden können. Diese Vorgehensweise sollte überall umgesetzt werden: Nie darauf verlassen, dass die Daten korrekt ankommen, sondern eher zweimal prüfen als einmal zuwenig. Grund: die Eingabe eines Datenobjekts kann über fünf oder mehr Wege im Programm möglich sein, und es kann sein, dass eine bestimmte Prüfung nur an einigen dieser Stellen umgesetzt wurde. Für den Fall, dass irgendwo wegen der fehlenden Prüfung illegale Daten entstehen, würde die Prüfung direkt in der entsprechenden Datenklasse zumindest eine Absicherung dagegen bieten, dass die falschen Daten in den Datenspeicher gelangen. Die bei Erkennung des Fehlerzustands ausgelöste Exception führt zwar zu einem Absturz des Programms, aber immerhin bleiben die Daten korrekt, was viel wichtiger ist.


Klasse LVVGlobal

Diese Klasse dient als Kapselklasse für „globale“ Daten, d.h. Daten, die überall in der Anwendung gleich sind. Gemäß Document-View-Design der MFC wäre dies die von CDocument abgeleitete Klasse. Allerdings enthält diese Klasse sehr viel Funktionalität, die eben nicht von allen Stellen der LVV-Anwendung aus erreichbar sein soll. Aus diesem Grund werden die wirklich globalen Daten der Anwendung (Liste der Lehrbeauftragten, Liste der Studenten, Liste der Lehrveranstaltungen und angemeldeter Benutzer) in einer eigenen Klasse verwaltet. Diese Klasse steckt im LVVDocument und darf nur einmal existieren (wie auch die von ihr verwalteten Datenklassen).

Beim Initialisieren der Anwendung werden die Daten nacheinander eingelesen, d.h. beim Einlesen der Lehrbeauftragten sind die Studenten noch nicht bekannt und die Referenz kann erst anschließend in diese Klasse gesetzt werden.

Membervariablen:

Memberfunktionen:


Klasse LVVDaten

Diese abstrakte Klasse ist die Basisklasse aller Datenklassen der Anwendung. Sie erlaubt es, eine Referenz auf eine Instanz von LVVGlobal zu speichern. Dadurch ist es der Datenklasse möglich, auf Daten wie Lehrbeauftragte, Studenten, Lehrveranstaltungen und den aktuell angemeldeten Benutzer zuzugreifen. So kann z.B. ein Lehrveranstaltungstermin die teilnehmenden Studenten verwalten, die in einer Instanz von LVVStudent gespeichert werden.

Falls irgendwo eine neue Datenklasse erzeugt wird (z.B. im Add oder im Load einer Collection), muss immer auch die Referenz auf LVVGlobaleDaten dieser neuen Datenklasse gesetzt werden

Membervariablen:

Memberfunktionen:


Klasse LVVPerson

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Die Klasse LVVPerson bildet einen menschlichen Benutzer der Anwendung ab. Hiervon gibt es zwei Sorten: Lehrbeauftragte und Studenten. Beide haben gemeinsame Attribute, die von dieser abstrakten Klassen verwaltet werden.

Die Attribute sind:

Die Methoden sind:


Klasse LVVLehrbeauftragter

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Die Klasse LVVLehrbeauftragter bildet einen Lehrbeauftragten ab, also die Person, die Lehrveranstaltungen durchführt. Sie ist von der Klasse LVVPerson abgeleitet (jeder Lehrbeauftragte ist eine Person) und erbt dadurch die Attribute Name, E-Mail, Login und Passwort und erweitert sie um einige weitere Attribute.

Die Attribute sind:

Die Memberfunktionen sind:


Klasse LVVLehrbeauftragterCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Lehrbeauftragten. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVLehrbeauftragter (Hinweis: um die Methodenanzahl nicht zu groß werden zu lassen, werden hier nur Set-Methoden beschrieben. Get-Methoden für den Zugriff auf ein Feld des n-ten Lehrbeauftragten wären zwar ebenfalls sinnvoll, sind aber über Aufruf von GetLehrbeauftragerAt() und anschließendem Aufruf der Get-Methode des zurückgegebenen Objekts realisierbar, d.h. hier würde man nur Code verdoppeln)


Klasse LVVLVTermin2Lehrbeauftragter

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet die Zuordnung eines Lehrveranstaltungstermins zu einem Lehrbeauftragten ab. Dies geschieht durch die Schlüsseldaten der beiden Objekte: Ein Lehrbeauftragter hat eine eindeutige Personalnummer, der Lehrveranstaltungstermin ist durch LV-Nummer, Semester und Gruppenbezeichnung eindeutig identifizierbar.

Attribute:

Memberfunktionen:


Klasse LVVLVTermin2LehrbeauftragterCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Instanzen von LVVLVTermin2Lehrbeauftragter. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVLVTermin2Lehrbeauftragter.

Meine Faulheit nicht als Beispiel nehmen !

Die Doku des fertigen Projekts sollte solche Vereinfachungen nicht enthalten. Jede Methode jeder Klasse muss dokumentiert werden, auch wenn es sich auf Copy&Paste beschränkt.



Klasse LVVStudent

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet einen Studenten ab. Ein Student ist eine Person, d.h. er erbt die Attribute Name, Mailadresse, Login und Passwort von der Klasse LVVPerson.

Weitere Attribute sind:

Die Methoden sind:


Klasse LVVStudentCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Studenten. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVStudent.


Klasse LVVLVTermin2Student

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet die Zuordnung eines Lehrveranstaltungstermins zu einem Studenten ab. Dies geschieht durch die Schlüsseldaten der beiden Objekte: Ein Student hat eine eindeutige Matrikelnummer, der Lehrveranstaltungstermin ist durch LV-Nummer, Semester und Gruppenbezeichnung eindeutig identifizierbar.

Attribute:

Memberfunktionen:


Klasse LVVLVTermin2StudentCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Instanzen von LVVLVTermin2Student. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVLVTermin2Student.


Klasse LVVLehrveranstaltung

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet eine Lehrveranstaltung gemäß Vorlesungsverzeichnis ab. Jede Lehrveranstaltung ist eindeutig identifiziert durch die Lehrveranstaltungs-Nummer.

Die Klasse dient als Einstiegspunkt für alle Zugriffe auf Termine, Abgaben innerhalb Terminen und alle weiteren darin gekapselten Objekte.

Die Membervariablen sind:

Die Memberfunktionen sind:

Außerdem werden Zugriffe auf die Liste der Lehrveranstaltungstermine von dieser Klasse gekapselt:

Zur Manipulation der Abgaben innerhalb eines bestimmten LV-Termins gibt es die Funktionen SetAbgabeXXX, AddAbgabe und DeleteAbgabe, die als Parameter den Index einer Abgabe in einem LV-Termin übergeben bekommen und die Aufrufe an diese Abgabe weiterleiten.

Zur Manipulation der Arbeitsgruppen innerhalb der Abgaben gibt es die Methoden SetArbeitsgruppeXXX, AddArbeitsgruppe und DeleteArbeitsgruppe.

Zur Manipulation der Dateiabgaben innerhalb einer Arbeitsgruppe gibt es die Methoden SetDateiabgabeXXX, AddDateiabgabe und DeleteDateiabgabe.

Zur Manipulation der Studenten-Zuordnungen innerhalb der Arbeitsgruppen gibt es die Methoden SetArbeitsgruppeStudentXXX, AddArbeitsgruppeStudent und DeleteArbeitsgruppeStudent.


Klasse LVVLehrveranstaltungCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Lehrveranstaltungen. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVLehrveranstaltung.

Zur Manipulation der Abgaben innerhalb eines bestimmten LV-Termins gibt es die Funktionen SetAbgabeXXX, AddAbgabe und DeleteAbgabe, die als Parameter den Index einer Abgabe in einem LV-Termin übergeben bekommen und die Aufrufe an diese Abgabe weiterleiten.

Zur Manipulation der Arbeitsgruppen innerhalb der Abgaben gibt es die Methoden SetArbeitsgruppeXXX, AddArbeitsgruppe und DeleteArbeitsgruppe.

Zur Manipulation der Dateiabgaben innerhalb einer Arbeitsgruppe gibt es die Methoden SetDateiabgabeXXX, AddDateiabgabe und DeleteDateiabgabe.

Zur Manipulation der Studenten-Zuordnungen innerhalb der Arbeitsgruppen gibt es die Methoden SetArbeitsgruppeStudentXXX, AddArbeitsgruppeStudent und DeleteArbeitsgruppeStudent.



Klasse LVVLVTermin

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet einen Lehrveranstaltungstermin ab. Jeder Termin ist eindeutig identifiziert durch die Lehrveranstaltungs-Nummer, das Semester und die Bezeichnung.

An dieser Klasse hängen die Abgaben innerhalb des Termins, darin wiederum die Arbeitsgruppen und alle weiteren darin gekapselten Objekte.

Die Membervariablen sind:

Die Memberfunktionen sind:

Außerdem werden Zugriffe auf die Liste der Abgaben von dieser Klasse gekapselt:

Zur Manipulation der Abgaben innerhalb des LV-Termins gibt es die Funktionen SetAbgabeXXX, AddAbgabe und DeleteAbgabe, die als Parameter den Index einer Abgabe übergeben bekommen und die Aufrufe an diese Abgabe weiterleiten.

Zur Manipulation der Arbeitsgruppen innerhalb der Abgaben gibt es die Methoden SetArbeitsgruppeXXX, AddArbeitsgruppe und DeleteArbeitsgruppe.

Zur Manipulation der Dateiabgaben innerhalb einer Arbeitsgruppe gibt es die Methoden SetDateiabgabeXXX, AddDateiabgabe und DeleteDateiabgabe.

Zur Manipulation der Studenten-Zuordnungen innerhalb der Arbeitsgruppen gibt es die Methoden SetArbeitsgruppeStudentXXX, AddArbeitsgruppeStudent und DeleteArbeitsgruppeStudent.


Klasse LVVLVTerminCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von LV-Terminen. Diese Liste wird pro Lehrveranstaltung verwaltet. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVLVTermin.

Zur Manipulation der Abgaben innerhalb eines bestimmten LV-Termins gibt es die Funktionen SetAbgabeXXX, AddAbgabe und DeleteAbgabe, die als Parameter den Index einer Abgabe in einem LV-Termin übergeben bekommen und die Aufrufe an diese Abgabe weiterleiten.

Zur Manipulation der Arbeitsgruppen innerhalb der Abgaben gibt es die Methoden SetArbeitsgruppeXXX, AddArbeitsgruppe und DeleteArbeitsgruppe.

Zur Manipulation der Dateiabgaben innerhalb einer Arbeitsgruppe gibt es die Methoden SetDateiabgabeXXX, AddDateiabgabe und DeleteDateiabgabe.

Zur Manipulation der Studenten-Zuordnungen innerhalb der Arbeitsgruppen gibt es die Methoden SetArbeitsgruppeStudentXXX, AddArbeitsgruppeStudent und DeleteArbeitsgruppeStudent.


Klasse LVVDateiabgabe

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet eine abgegebene Datei ab, die innerhalb einer Abgabe von einem Mitglied einer Arbeitsgruppe abgegeben wurde.

Ihre Attribute sind:

Die Methoden sind:


Klasse LVVDateiabgabeCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Dateiabgaben. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVDateiabgabe.


Klasse LVVArbeitsgruppe

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet eine Arbeitsgruppe von Studenten für eine bestimmte Abgabe ab. Instanzen dieser Klasse sollten nur innerhalb einer Abgabe existieren können. Die Bewertungen selbst sind nicht in dieser Klasse enthalten, sondern in Instanzen der Klasse LVVArbeitsgruppeStudent.

Ihre Attribute sind:

Die Methoden sind:

Zugriff auf die einzelnen Dateiabgaben:

Modifikation der Studenten-Zuordnungen:


Klasse LVVArbeitsgruppeCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält eine Liste von Arbeitsgruppen innerhalb einer Abgabe. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVArbeitsgruppe.

Methoden für die Manipulation einer DateiAbgabe innerhalb einer Arbeitsgruppe:

Methoden für die Manipulation einer Studentenzuordnung innerhalb einer Arbeitsgruppe:


Klasse LVVArbeitsgruppeStudent

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet die Zuordnung von Studenten zu Arbeitsgruppen von Studenten für eine bestimmte Abgabe ab. Instanzen dieser Klasse sollten nur innerhalb einer Abgabe existieren können.

Ihre Attribute sind:

Die Methoden sind:


Klasse LVVArbeitsgruppeStudentCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält die Liste von Zuordnungen von Student zu Arbeitsgruppe innerhalb einer Arbeitsgruppe. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVArbeitsgruppe.


Klasse LVVAbgabe

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse bildet eine abzugebende Aufgabe innerhalb eines Lehrveranstaltungstermins ab. Instanzen dieser Klasse sollten nur innerhalb einer Lehrveranstaltungstermins existieren können.

Ihre Attribute sind:

Die Methoden sind:

Zugriff auf die einzelnen Arbeitsgruppen:

Zugriff auf die Daten innerhalb der Arbeitsgruppe:

Klasse LVVAbgabeCollection

Abgeleitet von der abstrakten Klasse LVVDaten für den Zugriff auf die globalen Stammdaten.

Diese Klasse enthält die Liste von abzugebenden Aufgaben innerhalb einer Arbeitsgruppe. Sie kapselt eine Instanz der MFC-Klasse CTypedPtrList, die ein Array von Pointern verwaltet und es mittels des Template-Mechanismus erlaubt, sämtliche Methodendeklarationen typsicher zu gestalten. Sie ist nicht von dieser Klasse abgeleitet, da die meisten der Methoden von CTypedPtrList nicht in dieser Klasse benötigt werden.

Die Membervariablen sind:

Die Funktionen sind:

Die Collection enthält außerdem diverse Funktionen für die Manipulation eines einzelnen Objekts LVVAbgabe.

Funktionen für die Manipulation der einzelnen Arbeitsgruppen einer Abgabe:

Analog gibt es die Methoden SetDateiabgabeXXX, AddDateiabgabe und DeleteDateiabgabe, die dazu dienen, eine Dateiabgabe innerhalb einer Arbeitsgruppe zu manipulieren.

Des weiteren gibt es die Methoden SetArbeitsgruppeStudentXXX, AddArbeitsgruppeStudent und DeleteArbeitsgruppeStudent, die dazu dienen, innerhalb einer Arbeitsgruppe die Studentenzuordnung zu manipulieren oder die Abgabe zu bewerten.



Oberflächen-Klassen und Anbindung an die MFC

In diesem Teil der Dokumentation werden die Klassen beschrieben, die die Oberfläche abbilden oder als Control-Klassen verwendet werden.


Klasse LVVDocument

Diese Klasse ist von der MFC-Klasse CDocument abgeleitet und ist die oberste Kapsel-Ebene für alle Daten der Anwendung.

Es wird nicht die Serialize-Fähigkeit der MFC verwendet, sondern eine eigene Funktionalität, die die Daten in einem nicht weiter beschriebenen Datenspeicher verwaltet.

Datenkapselung, die Zweite:

Theoretisch müßte die zu Beginn dieses Kapitels beschrieben Datenkapselung auch über die Klasse LVVDocument laufen, d.h. alle Modifikationen an Lehrbeauftragten, Studenten oder Lehrbeauftragten müßten nur mithilfe der Document-Klasse erlaubt sein (so wie bereits z.B. das Löschen einer Arbeitsgruppe nur über die Zwischenschritte Lehrveranstaltung, LV-Termin und Abgabe erlaubt ist).

Da hier die Gründe nicht mehr ganz so zwingend sind wie bei der Kapselung von z.B. Arbeitsgruppe in einem LV-Termin (ob die Arbeitsgruppe noch modifizierbar ist, weiß nur der Termin selbst, da nur er weiß, ob er bereits abgeschlossen wurde), wurde darauf verzichtet. Die Stammdatencollections sind aus der Document-Klasse abrufbar und dabei direkt modifizierbar.


Membervariablen sind:

Überladene Memberfunktionen:

Überladene Funktionen:

Falls Funktionen überladen werden, müssen diese mit ihrer neuen Funktionalität ebenfalls dokumentiert werden.



Weitere Funktionen:


Grundlagen der Benutzerführung:

Bei Anwendungsstart wird das Hauptfenster initialisiert und sofort der Login-Dialog eingeblendet. Hat der Benutzer sich authentifiziert, steht ihm die Anwendung zur Verfügung. Er hat diese Möglichkeiten:

Nach jeder bearbeitenden Aktion erfolgt direkt ein Save im Datenmodell, z.B. bei fast jedem Klick auf „OK“ in einem Dialog.


Klasse LVVMainFrame

Diese Klasse bildet das Hauptfenster der Anwendung. Sie ist von CFrameWnd abgeleitet, der Standard-MFC-Klasse für das Anwendungsfenster.

Sie enthält eine Membervariable m_Splitter vom Typ CSplitterWnd, mittels der ein geteiltes Fenster abgebildet wird. Das Initialisieren der Splitter-Window erfolgt in der überladenen Methode OnCreateClient von CFrameWnd. Sie enthält im linken Teil eine Instanz von LVVLehrveranstaltungView, im rechten Teil eine Instanz von LVVArbeitsgruppeView.


Klasse LVVDialogLogin

Dieser Dialog wird beim Start der Anwendung angezeigt und dient dazu, den Benutzer zu authentifizieren. Dazu werden Login und Passwort eingegeben. Die Validierung der Eingaben erfolgt nicht in diesem Dialog, sondern im Hauptfenster, aus dem heraus er angezeigt wird.

Der Dialog enthält jeweils eine Membervariable für Login und Passwort, außerdem Get-Methoden zum Abfragen der Eingabe.


Klasse LVVViewLehrveranstaltung

Diese von CTreeView abgeleitete Klasse wird im Hauptfenster der Anwendung im linken Teilfenster angezeigt. Sie stellt die Lehrveranstaltungen und alle Daten in einer Baumstruktur dar:

Damit stellt diese View den Use-Case „Auswahl des Veranstaltungstermins“ dar.

Verweise auf Use-Case-Diagramm

Das Klassendiagramm wird anhand des Use-Case-Diagramms erstellt, d.h. es schadet auf keinen Fall, bei bestimmten Aktionen auf den Use-Case zu verweisen, der gerade umgesetzt wird. Im folgenden geschieht dies bei den Events, die von z.B. einem Button-Klick ausgelöst werden, der mit einem Use-Case korrespondiert.


Überladene Methoden:

Windows-Ereignisse:

Windows-Events im Klassendiagramm:

Sofern von Controls ausgelöste Events eine wichtige Funktionalität (hier: die Verbindung zwischen den beiden Views) auslösen, dann sollten sie auch im Klassendiagramm auftauchen. Natürlich muss hier nicht jeder Mausklick landen, aber jede Kernaktion. Schließlich wird fast jeder Use-Case durch eine Benutzeraktion, also ein Windows-Event ausgelöst.



Diese View verarbeitet alle Menüereignisse des Hauptmenüs, die das Bearbeiten der Stammdaten betreffen.

In der Toolbarleiste finden sich Buttons für folgende Aufgaben:


Klasse LVVViewArbeitsgruppe

Diese von CFormView abgeleitete Klasse stellt die Daten innerhalb einer Abgabe dar. Sie enthält eine Liste (CListCtrl) aller Arbeitsgruppen. Beim Klick auf eine Arbeitsgruppe wird im unteren Teil des Fensters angezeigt, welche Studenten in dieser Arbeitsgruppe vorhanden sind und welche Dateien sie abgegeben haben. Falls ein Student angemeldet ist, wird NUR die Arbeitsgruppe in der Liste angezeigt, zu der er in dieser Abgabe gehörte (oder eine leere Liste, falls er zu keiner Arbeitsgruppe gehörte). Ist die Abgabe bereits bewertet, werden neben jedem Student Punktzahl und Bemerkung angezeigt. Wurde die Bewertung per Mail versendet, werden auch die Daten dieser Mail (Datum und Empfänger) angezeigt.

Neben der Liste der Arbeitsgruppen gibt es die Buttons „Neu“, „Bearbeiten“, „Löschen“, „Bewerten“ (Dateiabgaben erfassen und bewerten), „Bewertung mailen“ und „Alle Gruppen wie in letzter Abgabe erzeugen“.

Die View bildet den Use-Case „Student: Einsehen eigener Abgaben“ ab.

Memberfunktionen:


Klasse LVVMail

Diese Klasse dient dazu, Bewertungsmails zu Abgaben zu versenden. Sie bietet eine statische Methode SendMail (CString str_Empfaenger, CString str_Text), in der das Versenden einer Mail an den angegebenen Empfänger mit dem angegebenen Text erfolgt. Wie das Mailsenden technisch funktioniert, wird hier nicht weiter spezifiziert.


Klasse LVVDialogLehrbeauftragte

Dieser Dialog enthält eine Listbox mit der Liste aller Lehrbeauftragten im System. Außerdem enthält er die Buttons „Neu“, „Bearbeiten“, „Löschen“ und „Schließen“ für genau diese Aktionen.

Den Dialog können nur Lehrbeauftragte erreichen.

Membervariablen:

Memberfunktionen:


Klasse LVVDialogLehrbeauftragterBearbeiten

Dieser Dialog dient dazu, die Daten eines Lehrbeauftragten zu bearbeiten oder einen neuen Lehrbeauftragten anzulegen.

Der Dialog erlaubt dem Benutzer das Bearbeiten der relevanten Werte (Textfelder für Name, Login, Passwort, Mailadresse und Personalnummer und eine Checkbox für das Administrator-Recht). Das Lehrbeauftragter-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (dem Dialog LVVDialogLehrbeauftragte).

Membervariablen:

Memberfunktionen:


Klasse LVVDialogStudentenListe

Diese abstrakte Dialogklasse enthält eine ListBox mit allen Studenten der Anwendung. Von ihr erben LVVDialogStudentenWahl und LVVDialogStudentenBearbeiten, die den Dialog als Auswahl- bzw. Bearbeiten-Dialog benutzen.

Membervariablen:

Memberfunktionen sind:


Klasse LVVDialogStudentenListeAuswahl

Dieser von LVVDialogStudentenListe abgeleitete Dialog enthält eine Listbox mit der Liste aller Studenten im System, sowie einen OK-Button. Er dient zu Auswahl von mehreren Studenten, d.h. die ListBox sollte Mehrfachauswahl erlauben.

Memberfunktionen sind:


Klasse LVVDialogStudentenListeBearbeiten

Dieser von LVVDialogStudentenListe abgeleitete Dialog enthält eine Listbox mit der Liste aller Studenten im System. Außerdem enthält er die Buttons „Neu“, „Bearbeiten“, „Löschen“ und „Schließen“ für genau diese Aktionen.

Memberfunktionen:


Klasse LVVDialogStudentBearbeiten

Dieser Dialog dient dazu, die Daten eines Studenten zu bearbeiten oder einen neuen Studenten anzulegen.

Der Dialog erlaubt dem Benutzer das Bearbeiten der relevanten Werte (Textfelder für Name, Login, Passwort, Mailadresse, Matrikelnummer und Einstiegssemester). Das Student-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (dem Dialog LVVDialogStudenten).

Falls ein Lehrbeauftragter angemeldet ist und der angemeldete Benutzer nicht das Recht „Administrator“ hat, darf er nur die Mailadresse des Studenten bearbeiten. Falls ein Student angemeldet ist, darf er nur seine eigenen Daten bearbeiten, und zwar nur die Mailadresse. In beiden Fällen werden alle Eingabefelder außer „Mailadresse“ deaktiviert.

Membervariablen:

Memberfunktionen:


Klasse LVVDialogLehrveranstaltung

Dieser Dialog enthält eine Listbox mit der Liste aller Lehrveranstaltungen im System. Außerdem enthält er die Buttons „Neu“, „Bearbeiten“, „Löschen“ und „Schließen“ für genau diese Aktionen.

Den Dialog darf nur ein Lehrbeauftragter öffnen, Studenten benötigen ihn nicht.

Membervariablen:

Memberfunktionen:


Klasse LVVDialogLehrveranstaltungBearbeiten

Dieser Dialog dient dazu, die Daten einer Lehrveranstaltung zu bearbeiten oder eine neue Lehrveranstaltung anzulegen.

Der Dialog erlaubt dem Benutzer das Bearbeiten der relevanten Werte (Textfelder für LV-Nummer, Bezeichnung und Semesterwochenstundenzahl). Das Lehrveranstaltung-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (dem Dialog LVVDialogLehrveranstaltung).

In diesen Dialog darf nur ein Administrator gelangen.

Membervariablen:

Memberfunktionen:


Klasse LVVDialogLehrveranstaltungsterminBearbeiten

Dieser Dialog dient dazu, die Daten eines Lehrveranstaltungstermins zu bearbeiten oder einen neuen Lehrveranstaltungstermin anzulegen.

Der Dialog erlaubt dem Benutzer das Bearbeiten der relevanten Werte (Textfelder für Semester und Bezeichnung, DatePicker für Beginn, Ende und die Uhrzeiten, eine ComboBox für den Wochentag und ein für die Auswahl des Lehrbeauftragten sowie Checkboxen für die Flags „Gestartet“ und „Durchgeführt“). Der Administrator kann alle Felder bearbeiten, der Lehrbeauftragte kann nur das Flag „Durchgeführt“ setzen.

Außerdem werden in einer ListBox alle Studenten aufgelistet, die den Termin belegt haben. Der Administrator kann Studenten frei hinzufügen oder entfernen, der Lehrbeauftragte, der den Termin durchführt, kann nur neue Studenten hinzufügen.

Das Lehrveranstaltungstermin-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (der View LVVViewLehrveranstaltung).

In diesen Dialog dürfen Administrator und Lehrbeauftragter gelangen (letzterer nur, wenn er selbst den Lehrveranstaltungstermin durchführt).

Membervariablen:

Memberfunktionen:


Klasse LVVDialogAbgabeBearbeiten

Dieser Dialog dient dazu, die Daten einer Abgabe innerhalb eines Lehrveranstaltungstermins zu bearbeiten oder eine neue Abgabe anzulegen.

Der Dialog erlaubt dem Lehrbeauftragten das Bearbeiten der relevanten Werte (Textfelder für Bezeichnung und Maximalpunktzahl).

Das Abgabe-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (der View LVVViewLehrveranstaltung).

Membervariablen:

Memberfunktionen:


Klasse LVVDialogArbeitsgruppeBearbeiten

Dieser Dialog dient dazu, die Daten einer Arbeitsgruppe innerhalb einer Abgabe zu bearbeiten oder eine neue Arbeitsgruppe anzulegen.

Der Dialog erlaubt dem Lehrbeauftragten das Bearbeiten der relevanten Werte (Textfeld für die Bezeichnung). In einer ListBox werden die Studenten angezeigt, die zu dieser Arbeitsgruppe gehören, neben der ListBox sind Buttons für das Hinzufügen oder Entfernen von Studenten.

Das Arbeitsgruppe-Datenobjekt wird nicht modifiziert, dies bleibt dem Verwender des Dialogs überlassen (der View LVVViewArbeitsgruppe).

Membervariablen:

Memberfunktionen:


Klasse LVVDialogBewertungBearbeiten

Dieser Dialog dient dazu, eine einzelne Bewertung zu bearbeiten. Dazu kann man einen beliebig langen Kommentartext und eine Punktzahl eingeben.

Memberfunktionen:


Klasse LVVDateiabgabeBearbeiten

Dieser Dialog dient zum Eingeben einer Dateiabgabe. Man kann eine Datei auswählen und einen Kommentartext dazu angeben (z.B. eine Beschreibung der Datei). Der Kommentartext ist genauso wie die Datei Pflicht.

Memberfunktionen:

Klasse LVVDialogArbeitsgruppeBewertungBearbeiten

In diesem Dialog erfolgt das Verwalten der Dateiabgaben und das Bewerten der Leistungen der Arbeitsgruppe. Hierzu enthält er eine Liste der Studenten (CListCtrl), in der neben dem Studenten-Namen auch Individualbewertung und –punktzahl enthalten sind.

In einer zweiten Liste (CListBox) werden die Dateiabgaben der Arbeitsgruppe angezeigt.

Membervariablen:

Memberfunktionen: