Nehmen Sie das Assignment auf Github Classroom an und wählen Sie Ihren Namen aus der Liste aus. Dadurch wird ein (dieses) Repository für Sie erstellt. Klonen Sie das Repo und pushen Sie Ihre Lösungen in mehreren sinnvoll zusammengefassten Commits (z.B. einer pro Teilaufgabe, es können aber auch gerne mehr sein). Die Erstellung eines Pull Requests ist bei diesem Setup nicht notwendig. Sie müssen Ihre Lösung bis zum 11. Mai um 23:59 Uhr gepusht haben, alle Tests müssen grün sein, und Sie müssen spätestens in der darauf folgenden von Ihnen belegten Übungsgruppe Ihre Lösung kurz demonstrieren.
- Betrachten Sie die Klasse
BowlBuilder
im Paketservice
, das InterfaceBowl
und die KlasseDummyBowlImpl
im Unterpaketdomain
, sowie den dazugehörigen TestBowlBuilderTest
, der das Soll-Verhalten dieser Klassen in Kombination spezifiziert. Betrachten Sie außerdem die KlasseIngredient
, sowie die statische KlasseMenu
im Paketdata
, die bereits eine Reihe von Zutaten definiert. - Erstellen Sie zwei Klassen
PrecomputedBowl
undDynamicallyComputedBowl
, die jeweils das InterfaceBowl
implementieren. Beide Klassen sollen sich nach außen gleich verhalten. EinPrecomputedBowl
-Objekt soll jedoch schon bei seiner Erstellung den fertig berechneten Gesamtpreis, die Gesamtkalorienzahl, sowie die Namen der Zutaten übergeben bekommen, während einDynamicallyComputedBowl
-Objekt bei seiner Erstellung nur eine Liste vonIngredient
-Objekten übergeben bekommt und die jeweiligen Preis-, Kalorien- und Zutatenangaben erst zu dem Zeitpunkt berechnet, wenn die entsprechende Methode aufgerufen wird. Erstellen Sie, wenn es Ihnen hilft, einfache neue Unit-Tests, die testen, ob Ihre Bowl-Implementierungen so funktionieren, wie sie sollen. - Implementieren Sie nun in der
BowlBuilder
-Klasse die drei Methodenadd
,buildPrecomputed
undbuildDynamically
so, dass sie die jeweilige Bowl-Implementierung nutzen (statt derDummyBowlImpl
), um die Testfälle imBowlBuilderTest
grün zu machen (ohne die Tests zu verändern!). - Erstellen Sie mindesten einen neuen Testfall, der beschreibt, dass ein Bowl nur mit mindestens zwei Zutaten gebaut werden kann und ansonsten (also bei weniger als zwei Zutaten) eine
IllegalBowlException
beim Aufruf der jeweiligen build-Methode geworfen wird. - Betrachten Sie die Klasse
SimpleInputParser
und extrahieren Sie daraus ein neues Interface namensInputParser
und lassen dieses vomSimpleInputParser
implementieren. Ändern Sie dann überall im Code, wo bisher der TypSimpleInputParser
in Variablendeklarationen verwendet wurde, die Deklaration so, dass stattdessen der Interface-TypInputParser
verwendet wird.
- Allgemein: Sie können die Anwendung über die Klasse
BowlBotApp
starten, um das aktuelle Verhalten des Gesamtprogramms auszuprobieren. - Zu Teilaufgabe 2: Beachten Sie bei beiden Bowl-Implementierungen die Grundsätze der Datenkapselung.
- Zu Teilaufgabe 3: Bedenken Sie, dass es einen Unterschied macht, ob Sie eine Referenz einer Liste übergeben oder eine Kopie einer Liste erstellen und diese übergeben.
- Zu Teilaufgabe 4: Die JUnit-Methode zum Prüfen, ob eine erwartete Exception geworfen wird, heißt
assertThrows
und wird mit der erwarteten Exception-Klasse (ErwarteterTyp.class
) sowie einer Lambda-Funktion nach dem Schema() -> AufrufInDemDieExceptionFliegenSoll
parametrisiert.