Ich habe so eben die Parser-Aufgabe abgeschloßen,
sie kommt wie gefordert mit 5 Ausnahmen-”würfen” aus.
Alle Tests werden anstandslos absolviert, die Auswertung steht jedoch noch aus,
da ich den source gerade erst hochgeladen habe.
Ob noch Optimierungen durchgeführt werden können, wird sich Montag im Praktika zeigen, sei denn Ihr seht schon etwas, zögert nicht mir bescheid zu geben
Einen besonderen Anreiz bei dieser Aufgabe, gab mir die Methode gibWert( ) in der Klasse OperatorAusdruck, hier habe ich auf eine Lösung nach dem Schema/Motto, Clean Code Development (CCD) hingearbeitet.
Dank Polymorphie ist so kein If- oder Switch-Statement notwendig.
Somit steht in der Methode nur noch ein:
return RECHENOPERATION.get(this.operator).berechneWert(
this.linkerAusdruck.gibWert(ausdruck),
this.rechterAusdruck.gibWert(ausdruck));
Anstellen von mehreren Abfragen, um welchen Operator es sich den handelt.
Somit ist diese Lösung nicht nur “schöner” und objektorientiert sonder auch effizienter.
Der source code ist wie immer unter meiner github repo einzusehen.
Zu
offset = nextToken( ) ? offset + 1 : offset;
sei noch erwähnt, dass hier, wie den Kommentaren zu entnehmen, der offset bei erfolgreichem setzen eines neuen Tokens um eins erhöht wird.
Durch nextToken( ) wird der neue Token direkt bestimmt.
Auf den ersten Blick vill. nicht direkt ersichtlich (Dafür ausreichend Kommentiert) jedoch finde ich diese eine Zeile Code schöner als so:
if (nextToken( )) {
offset++;
}
Ohne Kommentierung, wäre es genauso wenig ersichtlich und würde den Code bei weitem länger machen, da es bei jedem neu zu bestimmenden Token ausgeführt werden muß. Warum nicht in der nextToken( )-Methode auch den Offset erhöhen?
Da die Methode den nächsten Token ermittelt und dabei die Leerzeichen überspringt,
hier müsste dann jedes mal überprüft werden, ob es sich um ein Leerzeichen handelt und ob ein neuer Token gesetzt wurde. Dies geschieht jedoch direkt duch die Rekusion.
Somit nutze ich die Rekusion direkt für die “Erfolgsbestimmung” des Tokensetzens aus.
Am liebsten hätte ich es in dieser Form geschrieben:
if (nextToken( )) offset++;
Jedoch ist uns dies ja nicht gestattet…