Allerlei zum Softwaretechnik - Praktikum 2006
Hier stehen die Bewertungen der 3. Abgabe (diesmal endgültig).
Falls ihr die vorherigen Abgaben noch korrigiert habt findet ihr die korrigierten Bewertungen bei der jeweiligen Abgabe.
Die Punkte aus Adressverwaltung 2 werden halbiert und als Bonus gutgeschrieben, Adressverwaltung 1 zählt voll.
Endgültige Abgabe bis Sonntag, 13.8. per Mail ! Schickt die Abgaben an meine Firmenadresse,
zuhause bin ich wegen meines lahmen Modems zu nichts in der Lage ;-).
Abgegeben werden sollen das Programm und die Unit-Tests, alles im Quellcode. Das Benutzerhandbuch
soll als Windows-Hilfe im CHM-Format vorliegen.
Außerdem wäre es gut wenn ihr die gesamte technische Dokumentation (Use-Cases, Klassen- und sonstige
Diagramme mit Beschreibung) als "Technisches Handbuch" beilegen könntet. Gebt mir Bescheid ob ihr
dabei FIXMEs aus bisherigen Abgaben behoben habt.
Noten werden auf dieser Seite bekanntgegeben.
Ich bin vom 2.8. bis 12.8. im Urlaub, kann euch also keine Hilfe bei Problemen geben.
Spielbretteditor
Ein Hinweis für die Gruppen die einen Spielfeldeditor entwickeln sollen: für euch ist
es wahrscheinlich sinnvoll die Anwendung als "Multi Document Interface" aufzubauen,
also eine Anwendung mit je zwei Document- und View-Klassen (je ein paar von Document und
View für das eigentliche Spiel und den Editor). Ich habe ein kleines Beispiel zusammengestellt
dass ihr eigentlich direkt als Grundlage für euer Projekt verwenden könnt:
MDIMalefiz/index.html
Am Mittwoch, 26.7. 16 Uhr
ist die Abgabe angepeilt. Auf jeden Fall soll das eine
ausgedehnte Fragestunde werden und ist wahrscheinlich eure letzte Möglichkeit mich persönlich zu erwischen.
Am Mittwoch, 19.07.
gibt es ebenfalls eine Fragestunde.
Update der Anforderungen: statt 10 Testfällen reichen mir 5.
Am Mittwoch, 12.07.
werde ich zur üblichen Zeit um 17 Uhr eine Fragestunde abhalten !
Informationen zum weiteren Verlauf
Vorraussichtlicher Abgabetermin ist Mittwoch der 26.7., wahrscheinlich ab 16 Uhr.
Ich werde bis dahin einmal pro Woche (auch nach den Klausurwochen) eine Fragestunde anbieten, am besten wohl Mittwochs
zur üblichen Zeit. Bitte kündigt euch vorher per Mail bei mir an (mindestens einen Tag vorher) sonst komme ich nicht.
Wenn ein solcher Termin bestätigt ist dann findet ihr ihn hier.
Benutzerhandbuch des Spiels: Das Handbuch/Bedienungsanleitung soll als CHM-Online-Hilfe zur Verfügung gestellt werden. Siehe
Beispiel 5.
Wegen der knappen Zeit reicht es mir wenn ihr das gesamte Handbuch in eine einzelne HTML-Datei packt und diese als ein großes Kapitel
in die Hilfe einbindet (ohne Anbindung ans Programm, beim Drücken von "F1" wird die Hilfe zwar aufgerufen, aber man muss
zu Fuß zum gewünschten Hilfethema navigieren.
Variante 2 (die Bonuspunkte bringt) ist eine kontextsensitive Hilfe, die für einen bestimmten Spielzustand (vor dem Würfeln,
Spielfigur gewählt, Sperre versetzen) beim Drücken von "F1" das entsprechende Kapitel öffnet.
Für Variante 1 ist folgendes zu tun:
- HTML-Datei des Hilfethemas erstellen und ins Projekt einbinden
- In der ".hhp"-Datei einen Eintrag unter "[FILES]" und "[ALIAS]" vornehmen.
- In der ".hhc"-Datei (Inhaltsverzeichnis) den Kapiteleintrag zufügen damit man zum Thema springen kann. ACHTUNG:
Die ".hhc"-Datei darf NICHT mit Visual Studio editiert werden, siehe mein Hinweis im Hilfe-Beispiel.
Bitte reicht mir noch die korrigierten Dokus aus Abgabe 1 nach, ich habe bisher von keiner Gruppe die 2. Abgabe erhalten.
Je früher ihr es mir gebt desto größer ist die Chance die FIXMEs zu beheben (und wenn es zu spät abgegeben wird dann
gibt es garkeine Nachbesserungschance mehr)
Gesammelte Informationen
Installation:
Hinweise zur Installation von Visual-Studio, Doxygen, CppUnit und Together gibt es hier .
Austausch eines MFC-Projekts
Ein Projekt enthält einen ganzen Haufen Dateien, die wir nicht brauchen wenn wir es irgendwo
anders hin übertragen wollen (und ich schlage jeden der mir ein Projekt mit dem gesamten Debug-Ordner
zumailt !).
Dies sind:
-Die kompletten "Debug"-Unterorder in Projektmappe und Projekt.
-Die Datei mit der Endung .ncb im Projektmappen-Verzeichnis
-Die Datei namens %PROJEKTMAPPE%.suo. Dies sind die benutzerspezifischen Einstellungen (diese Info mit Vorbehalt).
-Die Datei %PROJEKTNAME%.vcproj.%COMPUTERNAME%.%USER%.user im Projektverzeichnis (User-spezifische Projekt-Einstellungen).
Benötigte Dateien:
-Natürlich alle .cpp und .h-Dateien
-Das gesamte "res"-Unterverzeichnis
-Datei mit der Endung .sln (dies ist die Projektmappe / Solution, ruhig mal mit einem Texteditor anschauen)
-Datei mit der Endung .vcproj (dies ist die Projektdatei, ebenfalls mal mit einem Texteditor anschauen)
-Die Readme.txt (obwohl die eigentlich nie benötigt/benutzt wird).
-Die Datei mit der Endung .rc (hier stehen die Definition unserer Oberflächen-Elemente,
ebenfalls Texteditor-kompatibel).
-Die .reg-Datei (beispielsweise im MFCBasics-Beispiel).
Malefiz 3 (das Programm):
XML-Speicherung:
Als Beweis wie sinnvoll eine nicht-binäre Speicherung z.B. per XML ist möchte ich erreichen dass die Savegames
zwischen euren einzelnen Abgaben austauschbar sind (auch bei denen die zusätzlich einen Spielfeldeditor bauen). Deshalb gebe
ich im Folgenden das Format der XML vor. Falls irgend jemand Fragen dazu hat oder Fehler oder Ungenauigkeiten entdeckt bitte
sofort melden !
Hier gibt es einen Satz von Beispiel-XML-Dateien (5 verschiedene Dateien, da ich pro Datei nur einen
der fünf möglichen Zustände angeben kann, der Dateiname ist dabei Programm): MalefizRundenstart.xml,
MalefizGewuerfelt.xml, MalefizFigurGewaehlt.xml,
MalefizSperreVersetzen.xml, MalefizRundenende.xml
(Update 22.06.2006: Spielerfarbe für Spieler 4 war "grün" statt wie in der DTD vorgegeben "gruen").
Um die Gültigkeit eurer generierten XML-Dateien sicherzustellen müsst ihr die "Data Type Declaration" einbinden:
<!DOCTYPE MalefizSavegame PUBLIC "Malefiz-Savegame Softwaretechnik 2006 FH Wiesbaden" "http://www.informatik.fh-wiesbaden.de/~knauf/SWT2006/Malefiz.dtd">
Hier gibt es die DTD zum Herunterladen: Malefiz.dtd (Update 22.06.2006, jetzt können die Malefiz-XML-Dateien
mit Visual-Studio editiert werden).
Folgende Definitionen und Einschränkungen habe ich vorgenommen:
- Encoding soll immer UTF-8 sein (
encoding="UTF-8"
). Wenn ihr per Hand so eine Datei erstellen
wollt empfehle ich euch z.B. Notepad, dort kann man beim Speichern dieses Encoding wählen.
- Ich habe das Feld in ein Gitterraster eingeteilt, jedes Feld bekommt eine eindeutige X-/Y-Koordinate. Die Zählung
beginnt (da wir alle Profi-Informatiker sind) natürlich bei 0. Die Leute mit dem Spielfeldeditor haben eventuell
abweichende Maximalwerte für X und Y und natürlich eine völlig andere Spielfeld-Verteilung. Das macht aber nix,
ein eigenes Spielfeld ist sowieso nicht bei den Standard-Spiel-Gruppen einladbar.
Das Gitterraster sieht so aus:
- Die Start-/Zielfelder habe ich auf jeweils ein Feld reduziert, d.h. darauf stehen 0 bis 5 Figuren. Ich denke die meisten
Gruppen haben diese Definition verwendet da die 5-Feld-Cluster nicht ins Feld-Nachbar-Modell passen.
Ihr könnt das natürlich zeichnerisch völlig anders darstellen und auch intern 5 Felder verwenden, nur beim Speichern sollte
das als ein Feld behandelt werden.
- Die 4 Spieler haben Ids von 0 bis 3.
- Die 5 Spielfiguren eines Spielers haben Ids von 0 bis 4 (jeweils pro Spieler).
- Die 17 Sperren haben IDs von 0 bis 16 (bzw bei den Leuten mit Editor auch mehr oder weniger). Einige von euch
haben keine Klasse "CSperre" im Modell. Das macht nix, nummeriert einfach beim Speichern eure Sperrsteine sinnvoll so
dass ihr Dummy-IDs vergeben könnt.
- Ich habe vier Zustände gefunden in denen eine Spielspeicherung sinnvoll ist: "Rundenstart", "Gewürfelt", "Figur gewählt"
und "Sperre versetzen". Eventuell kommt hier ein fünfter Zustand "Rundenende" dazu falls ihr nicht automatisch zum nächsten
Spieler wechselt sondern ein Klick auf einen Button "Nächster Spieler" nötig ist. Welche Attribute die einzelnen Zustände
haben steht in der Beispiel-Datei.
Beim Erstellen des Projekts bitte beachten dass die HTML-Hilfe aktiviert wird:
Malefiz 2:
Abgabe ist (vorraussichtlich) am 14.06.2006.
Hier gibt es die Bewertungen. Kritikpunkte sollten behoben werden.
- Es soll ein Klassendiagramm aller beteiligten Klassen (auch Views, Dialoge und sonstige MFC-Klassen) mit allen
Methoden und Membervariablen erstellt werden (auf Basis des bereits vorhandenen Klassendiagramms). Alle Klassen,
Methoden und Variablen müssen detailliert beschrieben werden, am besten an das Dokument aus Malefiz 1 angehängt.
- Zu zwei Use-Cases sollen Sequenzdiagramme (natürlich ebenfalls mit Beschreibung) erstellt werden.
Wie ein Sequenzdiagramm unter Einbindung der vorhandenen Objekte erstellt wird ist hier beschrieben.
- Definiert eure Unit-Test-Cases: 10 Testfälle (mögliche Schritte im Programm) sollen definiert werden: Was ist
der Initialzustand des Systems ? Was für Aktionen werden im Test durchgeführt ? Wie soll der Zustand des Systems anschließend sein ?
Es sollten weitgehend alle Use-Cases abgedeckt werden. Anhand dieser Test-Definitionen werden wir später die Test-Cases programmieren.
Siehe dazu meine Erläuterungen in der Stunde am 31.05.2006.
Update 17.07.2006: Es reichen 5 Testfälle. Die sollten aber auch hauptsächlich Spiellogik abdecken, und nicht sich nicht
mit eher trivialen Randfällen beschäftigen.
- Für den in der Stunde am 24.05. beschriebenen Zustandsautomat soll ein Diagramm erstellt werden. Dies geht mit
Together, indem im Together ein Diagramm vom Typ "Statechart" zugefügt wird.
Die benötigten Elemente für das Diagramm sind diese (Toolbar):
Und hier ein Beispieldiagramm (der Ablauf einer typischen Abgabe in unserer Gruppe):
Malefiz 1:
Abgabe ist am 17.05.2006.
Hier gibt es die Bewertungen. Kritikpunkte sollten behoben werden,
ich lege erst dann Punktzahlen fest.
Abgegeben werden sollen:
- Use-Case-Diagramm
- Beschreibung des Use-Case-Diagramms. Es soll detailliert jeder Use-Case beschrieben werden.
Die kompletten Spielregeln sollten auf Use-Cases verteilt werden. Zu jedem Use-Case sollen alle
Sonderfälle und eventuelle Festlegungen von offenen Punkten beschrieben werden.
Die Beschreibung jedes Use-Case soll außerdem eine einleitende Vorbedingung (welche anderen Use-Cases
müssen vorher durchlaufen werden bzw. in welchem Zustand muss sich die Anwendung befinden) und
eine abschließende Nachbedingungen (welche Use-Cases können anschließend starten) enthalten.
- Domänen-Klassendiagramm (also die Daten-Klassen und deren Verbindungen untereinander).
- Beschreibung der Klassen: zu jeder Klasse soll ausführlich ihre Funktion und ihre Beziehungen zu anderen
Klassen beschrieben werden. Außerdem soll beschrieben werden welche Spiel-Funktionen bzw. Use-Case-Elemente
in ihr geschehen.
- Das ganze bitte als ein einziges einheitlich formatiertes Word-/OpenOffice-/HTML-Dokument in das die
Diagramme eingebettet sind. Am Ende soll ein einziges Heft mit der gesamten Programm-Doku entstehen.
Jede Gruppe soll ihre Diagramme in der Stunde kurz per Beamer vorführen.
Adressverwaltung 2:
Abgabe ist am 17.05.2006 (verlängert: 24.05.2006).
- Wie die letzte Aufgabe ist auch diese in Einzelarbeit zu erledigen.
- Verwendet das Modified-Flag von CDocument (siehe MFCSchnipsel).
Es reicht wenn der Aufruf von "SetModified" an den richtigen Stellen erfolgt. Die Anpassung des Fenstertitels ist
Spielerei und deshalb nicht nötig.
- Die Anwendung soll als geteiltes Fenster realisiert werden. Dazu muss die Anwendung neu erstellt werden, nur Teile
des Codes aus der Document-Klasse und CAdresse können wiederverwendet werden.
- Die linke View soll eine CFormView sein, auf ein ListControl und die Buttons "Neu", "Bearbeiten", "Löschen" liegen.
Für das ListControl soll die Property "Ansicht" vom Default-Wert "Icon" auf "Bericht" gesetzt werden.
Wie sie befüllt wird seht ihr in "CAdressverwaltungView::OnUpdate" im Beispiel.
Das Grundprinzip ist dieses:
CString sNachname = _T("Müller");
this->m_ListCtrl.InsertItem (0, sNachname);
CString sVorname = _T("Otto");
this->m_ListCtrl.SetItemText (0, 1, sVorname);
sNachname = _T("Huber");
this->m_ListCtrl.InsertItem (1, sNachname);
sVorname = _T("Heinz");
this->m_ListCtrl.SetItemText (1, 1, sVorname);
"InsertItem" fügt eine neue Zeile ein, "SetItemText" setzt den Text in Zeile x, Spalte y.
Für das Erkennen einer Auswahländerung fangen wir das Event "LVN_ITEMCHANGED" ab. Beispielcode siehe Beispiel.
Da sich bei der Auswahländerung der Zustand von zwei Items ändert (das bisher gewählte
hat danach nicht mehr den "selected"-Zustand, dafür aber das neue) und das Event dadurch
bei einem Klick doppelt aufgerufen wird hilft folgender Code, nur das neu gewählte Item
zu verarbeiten:
if ((pNMLV->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
CString sMessage;
sMessage.Format (_T("OnLvnItemchangedList for item %d! "), pNMLV->iItem);
AfxMessageBox ( sMessage);
}
Der Index des neuen Items steckt in "pNMLV.iItem".
Ein Beispiel für das Abrufen des Index des gewählten Items findet sich im "OnBnClickedButtonBearbeiten":
POSITION posFirstSelected = this->m_ListCtrl.GetFirstSelectedItemPosition ();
//Wenn es kein Item gibt dann kommt hier NULL zurück:
if (posFirstSelected == NULL)
{
AfxMessageBox (_T("Kein Item gewählt !"));
return;
}
//Die erste gewählte Adresse holen:
int iItemSelected = this->m_ListCtrl.GetNextSelectedItem (posFirstSelected);
CString sMessage;
sMessage.Format (_T("Sie bearbeiten die Adresse in Zeile %d! "), iItemSelected);
AfxMessageBox ( sMessage);
- Die rechte View soll eine CView sein, auf der die Details der gewählten Adresse zeichnerisch ausgegeben werden.
- Die aktuell gewählte Adresse soll als Membervariable ins Document gesetzt werden, hier holt die Detailview sie ab.
- Beim Klick auf "Neu" oder "Bearbeiten" soll ein Dialog aufgehen in dem eine Adresse bearbeitet werden kann.
- Der Unit-Test soll funktionierend gemacht werden (siehe vorgestelltes Beispiel in der Stunde vom 3.5.).
- Hier findet ihr eine Dummy-Beispielanwendung die das Aussehen vorgibt: Adressverwaltung.zip
(aktualisiert am 24.05.: "SetItemText" statt LVITEM-Struktur).
Adressverwaltung 1:
Abgabe ist am 26.04.2006 (Fristverlängerung: bis Sonntag 30.04.2006).
- Die Aufgabe ist in Einzelarbeit zu erledigen (wobei ihr natürlich zusammenarbeiten könnt, ich will aber keine
komplett identischen Projekte).
- Ich erwarte alle Features aus der Aufgabenstellung von Hr. Dreher.
- Es soll eine komplette Doxygen-Doku vorhanden sein (siehe MFCMinimal-Beispiel). Kommentare in den Methoden
selbst schaden natürlich auch nicht !
- Haltet euch an den Styleguide von Hr. Dreher, um Bezug auf Variablennamen genauso wie bei Klassen- und
Funktionsnamen. Alle Membervariablen in einen MFC-Projekt sind mit durchschnittlichen C++-Kenntnissen von
Hand umbenennbar !
- Es soll außerdem ein Unit-Test-Projekt geliefert werden.
Verwendet sinnvolle Test-Szenarios. Beispiel wären:
-3 Adressen anlegen, Dokument speichern und neu laden -> Enthält es
jetzt die originalen 3 Adressen in der gleichen Reihenfolge ?
-3 Adressen zufügen, eine löschen, über Dokument iterieren: erhält man exakt die beiden nicht
gelöschten Adressen zurück ?
-Hinzufügen und Update einer Adresse ?
Denkt euch ruhig ein paar eigene Tests aus. Ein Test sollte nach Möglichkeit nicht nur eine Trivial-Methode
abdecken sondern ruhig einen ganzen Satz Einzelschritte.
- Unvollständige Features müssen (mit kleinem Punktabzug) nachgeliefert werden.
Beispiele
Beispiel 1: Minimale MFC-Anwendung
Beispiel 2: FormView, Dialog und DocumentView-Architektur
Beispiel 3: Geteiltes Fenster
Beispiel 4: Bitmaps laden, Toolbar, CScrollView, GetLastError
Beispiel 5: HTML-basiertes Hilfesystem
MFC-Fundgrube (einige nützliche Kleinigkeiten: CDocument::SetModifiedFlag,
Exceptions, Zeichnen ohne Flackern, XML-Speicherung, Bitmap als Resource)
Literatur
"Inside Visual C++ .NET" von George Shepherd und David Kruglinski, ISBN: 3860636782
Stand 21.08.2006
Historie:
02.04.2006: Seite erstellt
12.04.2006: Abgabe "Adressverwaltung"
19.04.2006: Weitere Details zur Abgabe "Adressverwaltung", Literaturtips
23.04.2006: Beispiel 3
26.04.2006: Gruppenliste
01.05.2006: Bewertung Adressenabgabe 1
03.05.2006: Adressenabgabe 2
04.05.2006: Gruppenliste aktualisiert.
10.05.2006: Gruppenliste aktualisiert (zwei Wechsel von E nach C). Malefiz-Abgabe 1. Mehr Tricks in
der Anleitung zur Adressabgabe 2.
23.05.2006: Weitere Varianten für ListItem-Zufügen.
24.05.2006: Befüllen des Listcontrol in Adressenaufgabe 2: "SetItemText" statt LVITEM-Struktur.
Beispiel überarbeitet.
Malefiz-Abgabe 2 und StateChart-Mini-Howto.
31.05.2006: Großen, wichtigen Hinweis zu Unit-Tests zugefügt, TestCase-Definitionen für Malefiz-Abgabe 2.
01.06.2006: Gruppe G aufgelöst, 645917 in Gruppe D
07.06.2006: Punktestände für Adressverwaltung, HTML-Hilfe-Info, Link zum Sequenzdiagramm-HowTo
11.06.2006: Punktestände für 145864, 537311, 747651, 145945, 149088 aktualisiert.
12.06.2006: Punktestände für 646882, 645917 aktualisiert. Beispiel 4 und MFCSchnipsel
13.06.2006: Punktestand für 245947 aktualisiert.
15.06.2006: Vergessene Unit-Test-Punktzahl für 845901. Malefiz1-Punktzahlen übertragen.
17.06.2006: XML-Speicherung-Vorgabe
20.06.2006: Punktestand für 334832 aktualisiert.
21.06.2006: Malefiz-Savegame-Beispiel-XML korrigiert ("geld" statt "gelb"), 5 Dateien für jeden der Zustände, da XML
sonst ungültig. Unit-Test-Drohung geändert. Punktestände für 849044 und 845901 aktualisiert.
22.06.2006: DTD für Malefiz geändert, jetzt kann man die XML-Dateien auch mit Visual Studio validieren lassen.
In Beispiel-XML-Dateien war die Spielerfarbe ungültig: "grün" statt wie in DTD "gruen".
Punktestand für 745170, 549473 aktualisiert.
23.06.2006: Punktestände für 243416, 245947, 849044, 949095 aktualisiert und die Unit-Test-Drohung entfernt da sie nicht
zuschlagen musste.
26.06.2006: HTML-Help-Beispiel zugefügt.
28.06.2006: Infos zum weiteren Verlauf.
29.06.2006: Malefiz-1-Update für Gruppe B, Malefiz-2-Punkte für Gruppen B und F.
30.06.2006: Malefiz-1/2-Update für Gruppe D.
09.07.2006: Fragestunde 12.7.
17.07.2006: Fragestunde 19.7., Update Gruppe B, reduzierte Anzahl von Testfällen.
18.07.2006: Update Gruppe C.
19.07.2006: Beispiel "MDI", Fragestunde 26.07.
26.07.2006: Endgültige Abgabe
14.08.2006: Link zur Bewertung Malefiz 3. Bewertung Gruppe B.
15.08.2006: Bewertung Gruppe D, F.
17.08.2006: Bewertung Gruppe A, C.
18.08.2006: Update Gruppe F.
21.08.2006: Update Gruppe A, F