Ticketverkauf für Konzerte
AFB I–IIEine Veranstaltungsagentur verkauft Tickets für Konzerte in der Stadthalle über eine eigene Software. Jedes Konzert wird mit Künstlerin oder Band, Datum, Kapazität der Halle und Ticketpreis angelegt. Die Software verkauft Tickets nur, solange genügend Plätze frei sind, und kann ein Konzert absagen. Den Entwurf der zentralen Klasse zeigt Material 1.
- - kuenstler: Zeichenkette
- - datum: Zeichenkette
- - kapazitaet: Ganzzahl
- - verkauft: Ganzzahl
- - preis: Fließkommazahl
- - abgesagt: Wahrheitswert
- c Konzert(kuenstler: Zeichenkette, datum: Zeichenkette, kapazitaet: Ganzzahl, preis: Fließkommazahl)
- + ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswert
- + absagen()
- + getRestplaetze(): Ganzzahl
- + istAusverkauft(): Wahrheitswert
- + getUmsatz(): Fließkommazahl
- + setPreis(neuerPreis: Fließkommazahl)
(1) Die Anzahl der verkauften Tickets wird beim Anlegen eines Konzerts als Parameter übergeben.
(2) Ein anderes Programmteil kann den Wert von verkauft direkt auf 500 setzen.
(3) getUmsatz() liefert eine Kommazahl zurück.
(4) absagen() meldet mit wahr zurück, ob die Absage geklappt hat.
(5) Der Preis eines Konzerts lässt sich nach dem Anlegen ändern, der Name der Künstlerin nicht.
- Beschreiben Sie die Bedeutung der drei Einträge
- verkauft: Ganzzahl,c Konzert(…)und+ ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswertunter Verwendung der Fachsprache. - Ordnen Sie jede der sechs Methoden begründet den Kategorien Anfrage und Auftrag zu. Gehen Sie dabei auf eine Methode ein, bei der die Zuordnung nicht eindeutig ist.
- Ein Mitarbeiter der Agentur hat sich zum Entwurf Notizen gemacht (Material 2). Überprüfen Sie jede Aussage anhand der Klassenkarte und korrigieren Sie falsche Aussagen.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
- verkauft: Ganzzahl ist ein privates Attribut (Minuszeichen) mit dem Datentyp Ganzzahl. Es speichert, wie viele Tickets bereits verkauft wurden, und ist nur innerhalb der Klasse direkt zugänglich.
c Konzert(…) ist der Konstruktor (Kennzeichen c). Er wird beim Erzeugen eines neuen Konzert-Objekts aufgerufen und erhält vier Parameter (Künstler, Datum, Kapazität, Preis), mit denen die Attribute initialisiert werden. Ein Konstruktor hat keinen Rückgabetyp.
+ ticketsVerkaufen(anzahl: Ganzzahl): Wahrheitswert ist eine öffentliche Methode (Pluszeichen) mit einem Parameter anzahl vom Typ Ganzzahl. Sie liefert einen Wahrheitswert zurück – vermutlich wahr, wenn der Verkauf möglich war.
Erwartungshorizont zu Aufgabe b)
Anfragen (Rückgabetyp, Zustand bleibt unverändert): getRestplaetze(), istAusverkauft(), getUmsatz().
Aufträge (kein Rückgabetyp, verändern den Zustand): absagen() setzt abgesagt, setPreis(…) ändert preis.
Nicht eindeutig: ticketsVerkaufen(…) verändert den Zustand (erhöht verkauft) und ist damit ein Auftrag, liefert aber zusätzlich einen Wert als Rückmeldung, ob der Verkauf geklappt hat. Es handelt sich um einen Auftrag mit Rückmeldung; die Zuordnung „Auftrag“ ist mit dieser Begründung zu erwarten.
Erwartungshorizont zu Aufgabe c)
(1) Falsch. Der Konstruktor hat nur die Parameter kuenstler, datum, kapazitaet und preis; verkauft wird intern mit einem Startwert (sinnvoll: 0) belegt.
(2) Falsch. verkauft ist privat und kann von außen weder gelesen noch gesetzt werden. Es gibt auch keine Methode setVerkauft; der Wert ändert sich nur über ticketsVerkaufen.
(3) Richtig. Der Rückgabetyp ist Fließkommazahl.
(4) Falsch. absagen() hat keinen Rückgabetyp und liefert daher nichts zurück; ob abgesagt ist, lässt sich mit den vorhandenen Methoden gar nicht abfragen.
(5) Richtig. Es gibt setPreis, aber keine Methode, die kuenstler verändert. (Streng genommen lässt sich der Name auch nicht abfragen, weil getKuenstler() fehlt.)
Schrittzähler eines Fitnesstrackers
AFB II–IIIEin Start-up entwickelt die Software für ein Fitnessarmband. Der Tracker zählt Schritte, rechnet sie mithilfe der hinterlegten Schrittlänge (in Metern) in eine Strecke in Kilometern um und zeigt an, ob das persönliche Tagesziel erreicht ist. Um Mitternacht beginnt ein neuer Tag, dann wird der Schrittzähler zurückgesetzt. Der Akku wird über eine Ladeschale geladen. Die Firmware-Entwicklerin hat das Klassendiagramm aus Material 3 vorgegeben.
Ein Praktikant hat mit dieser Klasse einen ersten Programmausschnitt für die Handy-App geschrieben (Material 4). Die Entwicklerin vermutet, dass sich darin mehrere Aufrufe finden, die nicht zum Klassendiagramm passen.
- - besitzer: Zeichenkette
- - schritte: Ganzzahl
- - schrittlaenge: Fließkommazahl
- - tagesziel: Ganzzahl
- - akkustand: Ganzzahl
- c Fitnesstracker(besitzer: Zeichenkette, schrittlaenge: Fließkommazahl)
- + schrittZaehlen()
- + neuerTag()
- + getSchritte(): Ganzzahl
- + getStrecke(): Fließkommazahl
- + setTagesziel(ziel: Ganzzahl)
- + istZielErreicht(): Wahrheitswert
- + laden(prozent: Ganzzahl)
- + getAkkustand(): Ganzzahl
Fitnesstracker t = new Fitnesstracker("Lena", 0.7); // Zeile 1
t.setTagesziel(8000); // Zeile 2
int s = t.schrittZaehlen(); // Zeile 3
t.schritte = 0; // Zeile 4
boolean ok = t.istZielErreicht(); // Zeile 5
t.laden(); // Zeile 6
double km = t.getStrecke(); // Zeile 7
Fitnesstracker u = new Fitnesstracker("Tom"); // Zeile 8
double l = t.getSchrittlaenge(); // Zeile 9
- Untersuchen Sie jede Zeile von Material 4 darauf, ob der Aufruf zum Klassendiagramm passt. Begründen Sie für jede unpassende Zeile, gegen welche Angabe der Klassenkarte sie verstößt.
- Im Diagramm ist das Attribut
schritteprivat, und es gibt keine MethodesetSchritte. Begründen Sie diese Entwurfsentscheidung und beschreiben Sie, wie der Schrittstand trotzdem verändert und abgefragt werden kann. - Der Tracker soll zusätzlich den Puls messen. Gespeichert werden soll der zuletzt gemessene Puls sowie das Alter der tragenden Person, aus dem sich der Maximalpuls (220 − Alter) ergibt. Die App soll abfragen können, ob der aktuelle Puls über 90 % des Maximalpulses liegt. Erweitern Sie die Klassenkarte aus Material 3 entsprechend.
- Ein Entwickler schlägt vor, die Methode
getStrecke()durch ein zusätzliches Attribut- strecke: Fließkommazahlmit einer MethodegetStrecke()zu ersetzen, das bei jedem Aufruf vonschrittZaehlen()um die Schrittlänge erhöht wird. Bewerten Sie diesen Vorschlag.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
neuerTag()), Rechenaufwand auf dem Armband, Speicherbedarf, Rundungsfehler durch wiederholtes Addieren.„Bewerten“ heißt: den Vorschlag an Kriterien messen und ein begründetes Werturteil abgeben.Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Passend: Zeile 1 (Konstruktor mit Zeichenkette und Fließkommazahl), Zeile 2 (Ganzzahl-Parameter), Zeile 5 (Rückgabe Wahrheitswert), Zeile 7 (Rückgabe Fließkommazahl).
Zeile 3: schrittZaehlen() hat keinen Rückgabetyp; das Ergebnis kann keiner Variablen zugewiesen werden.
Zeile 4: schritte ist privat; ein Zugriff von außen ist nicht erlaubt. Zum Zurücksetzen ist neuerTag() vorgesehen.
Zeile 6: laden erwartet einen Parameter prozent vom Typ Ganzzahl; er fehlt.
Zeile 8: Es gibt keinen Konstruktor mit nur einem Parameter; die Schrittlänge muss mit übergeben werden.
Zeile 9: Die Methode getSchrittlaenge() ist in der Klassenkarte nicht vorhanden; das Attribut ist privat.
Erwartungshorizont zu Aufgabe b)
Die Schrittzahl soll nur durch tatsächlich gezählte Schritte entstehen. Wäre schritte öffentlich oder gäbe es einen Setter, könnte jeder Programmteil beliebige (auch negative) Werte eintragen; die Daten wären unzuverlässig, z. B. bei Schrittwettbewerben. Durch die private Sichtbarkeit bleibt der Zustand in der Verantwortung des Objekts (Datenkapselung).
Verändert wird der Wert nur kontrolliert über die Aufträge schrittZaehlen() (um eins erhöhen) und neuerTag() (auf 0 setzen); abgefragt wird er über die Anfrage getSchritte().
Erwartungshorizont zu Aufgabe c)
- - puls: Ganzzahl
- - alter: Ganzzahl
- c Fitnesstracker(besitzer: Zeichenkette, schrittlaenge: Fließkommazahl, alter: Ganzzahl)
- + pulsMessen(wert: Ganzzahl)
- + getPuls(): Ganzzahl
- + setAlter(alter: Ganzzahl)
- + getMaximalpuls(): Ganzzahl
- + istPulsZuHoch(): Wahrheitswert
Der Maximalpuls wird nicht gespeichert, sondern aus dem Alter berechnet. Das Alter kann über den Konstruktor oder setAlter festgelegt werden; beides (oder eines von beiden) ist zu akzeptieren. istPulsZuHoch() ist eine Anfrage mit Rückgabetyp Wahrheitswert. Die übrigen Einträge aus Material 3 bleiben erhalten.
Erwartungshorizont zu Aufgabe d)
Für den Vorschlag: Die Strecke muss beim Abfragen nicht berechnet werden. Dieser Vorteil ist jedoch sehr gering, da nur eine Multiplikation anfällt.
Gegen den Vorschlag: Die Strecke ergibt sich vollständig aus schritte und schrittlaenge; ein zusätzliches Attribut speichert dieselbe Information doppelt (Redundanz). Jede Methode, die schritte ändert, muss nun auch strecke anpassen – wird das z. B. in neuerTag() vergessen, entstehen widersprüchliche Zustände. Durch zehntausendfaches Addieren von 0.7 summieren sich außerdem Rundungsfehler. Das Diagramm wird größer, ohne dass die Klasse mehr kann.
Mögliches Urteil: Der Vorschlag ist abzulehnen; eine abgeleitete Größe sollte über eine Anfrage berechnet werden. Erwartet werden mindestens zwei Kriterien und ein daraus abgeleitetes, eindeutiges Urteil.
