Hinweis: Dieser Blogpost ist vermutlich nur für Informatik-Studenten am KIT im WS 2011 / 2012 interessant!
Hier ein paar Hinweise zu den Abschlussaufgaben aus dem Forum. Dabei habe ich die Antworten von jgraf, mmohr und praktomat genommen.
Allgemeines
- Was wir absolut nicht sehen wollen sind grosse Methoden, die verstreut über den ganzen Code diverse returns enthält. Eventuell sollte man diese Methode dann ohnehin in Hilfsmethoden aufteilen.
- Parameter: Die Anzahl der Parameter muss exakt stimmen. Sind zu überzählige Parameter vorhanden, muss ein Fehler ausgegeben werden.
- toString/equals: Sollte nur für Klassen geschrieben werden, bei denen es Sinn macht. Vor allem auf eins aufpassen: Wenn man equals überschreibt, dann sollte man auch hashCode überschreiben (siehe docs.oracle.com) bzw, beliebige suche nach "equals hashCode"). Mir fallen spontan wenige Fälle ein, wo es keinen Sinn macht, equals()/hashCode() oder toString() zu überschreiben. Die Shell ist vielleicht so ein Fall, oder auch Utility-Klassen.
- Verbergt die tatsächlichen Typen, woimmer es möglich ist! Also z.B.
private Map meineMap = new HashMap
();
Frage: Dürfen Strings direkt im Programmcode stehen, oder sollten diese gesammelt am Beginn einer Klasse stehen?
Antwort: Kommt darauf an, wenn Sie mehr als eimal verwendet werden, dann sollte man Konstanten daraus machen.
Frage: Soll die Shell nur korrekte Werte an den eigentlichen LittlePraktomat übergeben, also alle Fehlerquellen bereits in der Shell-Klasse abgefangen werden oder soll der LittlePraktomat Exceptions werfen, die in der Shell dann gefangen werden? Oder soll beides gemacht werden?
Antwort: Die öffentlichen Methoden einer Klasse sind deren Schnittstelle. In den Javadoc Kommentaren sollte stehen, wie diese Schnittstelle zu verwenden ist. Also welcher Art die Eingaben sein müssen und wie die Ausgaben aussehen. Wenn sich ein Aufrufer nicht and diese Vereinbarung hält, dann sollte die Methode der Schnittstelle eine Exception werfen (IllegalArgument, NullPointer, ...). Diese Exceptions sollten normalerweise nie vom Aufrufer gefangen werden. Sie sollen das Program kontrolliert zum Absturz bringen. Die Logik dahinter ist folgende: Wenn eine IllegalArgumentException (oder ähnliches) fliegt, dann wurde eine Schnittstelle falsch verwendet. Der Aufrufer der Schnittstelle hat aber vor dem Aufruf sicher zu stellen, dass alle Forderungen der Schnittstelle eingehalten werden. D.h. wenn eine solche Exception auftritt liegt ein Programmierfehler vor. Mit Hilfe des Exceptionstacktrace kann der Entwickler diesen realtiv bequem finden und beheben.
Es ist also beides zu machen, die Shell (der Aufrufer) hat vor dem Verwenden der Praktomat-Schnittstelle sicher zu stellen, dass alle Eingaben korrekt sind. Sind die Eingaben falsch, dann wird eine Fehlermeldung ausgegeben. Die Praktomat-Schnittstelle schützt sich vor falscher Verwendung mit Hilfe von Exceptions.
Tests
Ihr müsst eine Tests.txt mit abgeben. Die ist wie ein Beispiel aufgebaut und sollt wichtige Eingaben / Ausgaben enthalten, die eventuell zu Fehlern führen könnten.
Da ihr sie ja sowieso schreibt, könnt ihr euer Programm auch auf eure Tests.txt überprüfen. Ich habe mir dazu folgendes kleines Python-Script zum Vergleichen gebastelt und vergleiche dann den normalisierten realen Output mit hilfe von Meld mit dem erwartetem Output.
Also folgendes in der Bash:
python checkTests.py
meld ../tmp/createdOutputNormalized.txt ../tmp/compareTo.txt
Ihr müsst halt noch die Pfade anpassen.
Abschlussaufgabe 1
Folgendes zum LittlePraktomat:
- Falls die Namen von Personen etwas anderes als Kleinbuchstaben haben (also z.B. Großbuchstaben!) soll ein Fehler ausgegeben werden. äöü müssen nicht als Kleinbuchstaben erkannt werden, a-z reicht.
Abschlussaufgabe 2
Folgendes zu Othello:
- Wer sehr schnell die Aufgabe erledigt hatte (also noch am ersten Tag), dem fehlen hier eventuell ein paar Sachen. Habt ihr den hole-Befehl? Falls ja, ist alles ok. Sonst solltet ihr nochmals rein schauen und eure Lösung nochmals hochladen, weil eine veraltete Aufgabenstellung zu beginn hochgeladen wurde.
- Eine gültige Spielfeldgröße MUSS gerade breite / höhe haben, größer als 0x0 sein und kleiner gleich 26x98 sein.
- Ein gültiges Rechteck MUSS die erste Koordinate links oben und die zweite rechts unten haben!
Es gibt folgende Befehle:
- newGame
[ ] - hole
- move
- abort
- possibleMoves
- quit
Daten
Abschlussaufgabe 1: 01.02.2012 - 12.03.2012 Funktionalität: 0 - 7 Punkte Programmiermethodik: 0 - 7 Punkte Endnote = (2 · Funktionalität + Programmiermethodik)
Abschlussaufgabe 2: 13.02.2012 - 26.03.2012, 13:00 Uhr Funktionalität: 0 - 7 Punkte Programmiermethodik: 0 - 7 Punkte Endnote = (2 · Funktionalität + Programmiermethodik)
Ergebnisse
Mir wird, wenn ich im Abschlussaufgaben-Praktomat auf "Home" klicke, bereits angezeigt, dass es anscheinend maximal 24 Punkte auf die "Abschlußaufgabe 1: Little Praktomat" gibt. Bin ja mal gespannt, wann es Ergebnisse gibt.
Es gab jeweils auf Funktionalität und Programmiermethodik 14 Punkte, wobei die Punktzahl der Funktionalität verdoppelt wurde. Damit kommen wir insgesamt auf 2 * (14*2 + 14)= 84 Punkte. Der Notenschlüssel ist wie folgt:
Bewertungspunkte | Gesamtnote |
---|---|
82,0 - 84,0 | 1,0 |
78,0 - 81,5 | 1,3 |
74,0 - 77,5 | 1,7 |
70,0 - 73,5 | 2,0 |
66,0 - 69,5 | 2,3 |
62,0 - 65,5 | 2,7 |
58,0 - 61,5 | 3,0 |
54,0 - 57,5 | 3,3 |
50,0 - 53,5 | 3,7 |
46,0 - 49,5 | 4,0 |
0 - 45,5 | 5,0 - nicht bestanden |
Meine Abgabe
- LittlePraktomat: Klassendiagramm + JavaDoc + Java Source Code
- Othello: JavaDoc + Java Source Code
Fehlerquellen
Es wurde bemängelt, dass ich wenig Kommentare hab. Ich finde, ich habe wahnsinnig viele ...
LittlePraktomat
Test 4: Eingabe: list-solutions 99999999999999999999 Exception in thread "main" java.lang.NumberFormatException - die Zahl ist zu groß Test 7: Aus Blödheit nicht bestanden ... ich habe eine Funktion (das wechseln von Tutoren) nicht überprüft.
Othello
Test 6 b: Direkt nach dem Start des Programms "hole A1:A1" hat eine (meiner eigenen) Exceptions geworfen ... bzw. mit korrekter Angabe, wo der Fehler liegt ... also auch Dummheit argh