Block 03 · UML-Modellierung – Lösungen

Lösungssatz zu 03_UML.html · Diagramme als Musterlösung; zu den Struktogramm-Aufgaben lauffähige Java-Dateien im Ordner java\03_UML\ (Start mit java Aufgabe_UML_07_k.java)
Hinweise zur Bewertung Wie in den IHK-Lösungshinweisen gilt: Andere sach- und fachgerechte Lösungen werden mit voller Punktzahl bewertet. Bei Diagrammen zählt der Inhalt (jeder Sachverhalt aus dem Text ist korrekt abgebildet) und die Notation (richtige Symbole, Pfeilspitzen, Bedingungen in eckigen Klammern). Anordnung, Namensvarianten („Rückgabe buchen“ statt „Rückgabe im BiblioNet buchen“) und die Zahl der Endknoten spielen keine Rolle. Die Punktzahlen unten zeigen eine mögliche IHK-typische Verteilung.

Lösungen

UML-01 · Verhaltensdiagramme allgemein / Diagrammwahl

Aufgabe UML-01.1 · 5 Punkte

a) Struktur oder Verhalten (2 P)

DiagrammStrukturdiagrammVerhaltensdiagramm
KlassendiagrammX
AktivitätsdiagrammX
ObjektdiagrammX
ZustandsdiagrammX
SequenzdiagrammX
KomponentendiagrammX
AnwendungsfalldiagrammX
VerteilungsdiagrammX

b) Geeignete Diagramme (3 P)

Nr.SachverhaltDiagramm
1Funktionen der App für Leser und PersonalUse-Case-Diagramm (Anwendungsfalldiagramm)
2Zustände eines LeserkontosZustandsdiagramm
3Ablauf der Fernleihe über mehrere StellenAktivitätsdiagramm (mit Partitionen)
4Reihenfolge der Methodenaufrufe App – KatalogService – DatenbankSequenzdiagramm
5Klassen mit Attributen, Methoden, BeziehungenKlassendiagramm
6Software auf Server, Terminal, SmartphoneVerteilungsdiagramm
Bewertung: a) je Zeile 0,25 P. b) je Zeile 0,5 P; bei 4 wird auch „Kommunikationsdiagramm“ akzeptiert (ebenfalls ein Interaktionsdiagramm), bei 6 „Einsatz-/Deployment-Diagramm“.

Erklärung: Häufigster Fehler: Das Anwendungsfalldiagramm wird für ein Strukturdiagramm gehalten, weil es keine Reihenfolge zeigt. Es beschreibt aber, was das System für seine Akteure tut, und gehört deshalb zu den Verhaltensdiagrammen.

Aufgabe UML-01.2 · 10 Punkte

a) Ablauf nach „Ausleihe verbuchen“ (2 P)

Nach dem Verbuchen sollen zwei Schritte unabhängig voneinander (parallel) ausgeführt werden: Die Diebstahlsicherung des Mediums wird deaktiviert und das Rückgabedatum wird angezeigt. Erst wenn beides erledigt ist, fragt das Terminal, ob weitere Medien ausgeliehen werden sollen. Bei „ja“ legt der Leser das nächste Medium auf und der Ablauf wiederholt sich ab dort; bei „nein“ wird eine Quittung gedruckt und der Vorgang endet.

Bewertung: Parallelität beider Aktionen und das Warten auf beide 1 P; Schleife bzw. Quittung und Ende 1 P. (Die Lösung beschreibt den gemeinten Ablauf – dass das Diagramm ihn wegen der Fehler aus b) nicht korrekt ausdrückt, ist hier nicht gefragt.)

b) Fehler, Auswirkung, Korrektur (8 P)

Nr.FehlerAuswirkungKorrektur
1Die Guards an der ersten Entscheidung [offene Gebühren > 10 €] und [< 10 €] decken den Fall „genau 10,00 €“ nicht ab.Bei genau 10,00 € trifft keine Bedingung zu; der Ablauf ist nicht definiert (bleibt stehen). Laut Anlage 1 ist das Konto in diesem Fall gesperrt.[offene Gebühren >= 10 €] und [offene Gebühren < 10 €]
2Die Rückführung [ja] mündet direkt in die Aktion „Medium auflegen“, die damit zwei eingehende Kanten hat.Mehrere eingehende Kanten einer Aktion wirken wie eine Synchronisation (UND): „Medium auflegen“ würde auf beide Kanten warten – der Ablauf verklemmt sich schon beim ersten Medium.Eine Zusammenführung (Raute) vor „Medium auflegen“ einfügen, in die beide Kanten münden.
3Nach „RFID-Etikett lesen“ steht eine Teilung (Balken) mit Guards statt einer Entscheidung.Bei einer Teilung werden alle Zweige ausgeführt: Die Ausleihe würde gleichzeitig abgelehnt und verbucht. Guards sind an einer Teilung nicht zulässig.Entscheidung (Raute) mit [für andere Person vorgemerkt] / [nicht vorgemerkt].
4Die parallelen Zweige (Diebstahlsicherung, Rückgabedatum) werden mit einer Zusammenführung (Raute) statt einer Synchronisation zusammengeführt.Es wird nicht auf beide Zweige gewartet; beide Zweige laufen einzeln weiter. Die Frage „weitere Medien?“ und alles danach würde doppelt ausgeführt (z. B. zwei Quittungen).Synchronisationsbalken (Join) statt der Raute.
Bibliotheksausweis scannen Leserkonto prüfen Hinweis „Kontogesperrt“ anzeigen [offene Gebühren >= 10 €] [offene Gebühren < 10 €] Medium auflegen RFID-Etikett lesen [für andere Person vorgemerkt] [nicht vorgemerkt] Ausleihe ablehnen Ausleihe verbuchen Diebstahlsicherungdeaktivieren Rückgabedatumanzeigen weitere Medien? [ja] Quittung drucken [nein]
Lösung UML-01.2: korrigiertes Aktivitätsdiagramm (Guards vollständig, Zusammenführung vor „Medium auflegen“, Entscheidung statt Teilung, Synchronisation statt Zusammenführung)
Bewertung: je Fehler 2 P (Fehler mit Auswirkung 1 P, Korrektur 1 P). Eine Zeichnung ist nicht verlangt; die Abbildung zeigt das korrigierte Diagramm zur Kontrolle. Weitere sinnvolle Verbesserungen (z. B. Hinweis bei abgelehnter Ausleihe) werden nicht zusätzlich bewertet.

Erklärung: Mit dem Marken-Modell (Erklärungssatz UML-02) lassen sich alle vier Fehler begründen: Raute = ein Weg (ODER), Balken = alle Wege (UND). Eine Aktion mit zwei Eingängen wartet auf beide – deshalb laufen Schleifen immer über eine Zusammenführung.

Aufgabe UML-01.3 · 20 Punkte

a) Diagrammwahl (6 P)

AspektDiagrammBegründung
A1Sequenzdiagrammzeigt den Nachrichtenaustausch (Methodenaufrufe und Antworten) zwischen mehreren Objekten bzw. Systemen in zeitlicher Reihenfolge.
A2Zustandsdiagrammbeschreibt ein einzelnes Objekt (ein Fach), seine möglichen Zustände und die Ereignisse (Sensormeldungen, Codeeingabe, Fristablauf), die Zustandswechsel auslösen.
A3Use-Case-DiagrammÜbersicht über Akteure (Leser, Personal, Techniker, Server) und die Funktionen, die sie nutzen – aus Außensicht, ohne Ablauf.
A4Aktivitätsdiagramm mit Partitionenstellt einen Ablauf mit Verzweigungen über mehrere Beteiligte dar; die Partitionen zeigen die Zuständigkeiten.
Bewertung: je Aspekt 1,5 P (Diagramm 1 P, Begründung 0,5 P).

b) Zustandsdiagramm eines Fachs (10 P)

Frei Reserviert vormerkungZugeordnet/ Fach reservieren Belegt entry / Abholcode an Leser senden fristVerlängern [noch nicht verlängert] / Abholfrist + 2 Tage türGeschlossen [Fach belegt] Abholfrist abgelaufen entry / Personal benachrichtigen abholfristAbgelaufen medienEntnommen/ Vormerkung löschen Geöffnet codeEingegeben[Code gültig]/ Tür entriegeln,Medien verbuchen türGeschlossen Außer Betrieb sensorFehler reparaturBestätigt stilllegen
Lösung UML-01.3 b): Zustandsdiagramm eines Fachs der Abholstation
Bewertung: Zustände Frei, Reserviert, Belegt, Geöffnet, Abholfrist abgelaufen, Außer Betrieb je 0,5 P (3 P); Start- und Endzustand 1 P; Transitionen mit passenden Ereignissen und Bedingungen 4 P; Aktionen (entry / Abholcode senden, Verlängerung, Tür entriegeln und Medien verbuchen, Personal benachrichtigen, Vormerkung löschen) 2 P. Akzeptiert werden auch after(3 Tage) statt abholfristAbgelaufen (mit Hinweis auf die Verlängerung), eine interne Transition codeEingegeben [Code ungültig] / Hinweis anzeigen in „Belegt“ sowie andere sinnvolle Ereignisnamen.

c) Zustands- statt Aktivitätsdiagramm (4 P)

Bewertung: je sachlich richtig erläutertem Grund 2 P (max. 4 P).

UML-02 · Aktivitätsdiagramm

Aufgabe UML-02.1 · 6 Punkte

a) Elemente (4 P)

Nr.BezeichnungNr.Bezeichnung
①Startknoten⑤Zusammenführung
②Partition (Schwimmbahn, Swimlane)⑥Teilung (Gabelung, Fork)
③Entscheidung (Verzweigung)⑦Synchronisation (Vereinigung, Join)
④Bedingung (Guard, Wächterbedingung)⑧Endknoten (Aktivitätsende)
Bewertung: je Element 0,5 P.

b) Wann wird „Ausweis aushändigen“ ausgeführt? (2 P)

Erst wenn beide parallelen Aktionen „Ausweis drucken“ und „Zugangsdaten für die App senden“ abgeschlossen sind. Die Synchronisation ⑦ wartet, bis an allen eingehenden Kanten der Ablauf angekommen ist (UND-Verknüpfung), und setzt den Ablauf dann einmal fort.

Bewertung: Zeitpunkt 1 P, Bedeutung der Synchronisation 1 P.
Aufgabe UML-02.2 · 10 Punkte
Medium einlegen RFID-Etikett lesen Medium ausgeben Hinweis „Bitte an derTheke abgeben“ anzeigen [Etikett nicht lesbar] [Etikett gelesen] Rückgabe imBiblioNet buchen Medium zur Sortier-anlage transportieren Rückgabe anzeigen [weiteres Medium] [kein weiteres Medium] Quittung drucken [Quittung gewünscht] [keine Quittung]
Lösung UML-02.2: Aktivitätsdiagramm „Rückgabe am Rückgabeautomaten“
Bewertung: Start und Ende 1 P; Aktionen vollständig und sinnvoll benannt 2 P; Entscheidung „Etikett lesbar?“ mit Guards und Fehlerzweig (ausgeben, Hinweis) 2 P; Teilung/Synchronisation für Buchen und Transport 2 P; Schleife über eine Zusammenführung vor „Medium einlegen“ mit Guards 2 P; optionale Quittung mit Entscheidung und Zusammenführung 1 P. Die Zusammenführung nach „Rückgabe anzeigen“ und die folgende Entscheidung dürfen zu einer Raute „Entscheidung und Zusammenführung“ zusammengefasst werden.

Erklärung: Signalwörter: „gleichzeitig“ → Teilung, „sind beide Schritte abgeschlossen“ → Synchronisation, „in beiden Fällen“ → Zusammenführung der beiden Wege, „wiederholt sich ab dem Einlegen“ → Rückführung in eine Zusammenführung vor „Medium einlegen“, „sofern gewünscht“ → Entscheidung mit einem Weg ohne Aktion.

Aufgabe UML-02.3 · 25 Punkte
Leser (App) BiblioNet Fernleihstelle Partnerbibl. Fernleihebestellen Leserkontoprüfen Ablehnunganzeigen [gesperrt] Bestandprüfen [nicht gesperrt] Vormerkunganlegen [im Bestand] Leserinformieren [nicht im Bestand] Fernleih-gebühr buchen Bestellungprüfen Partner-bibliothekauswählen Bestellungabsenden Verleihbarkeitprüfen [nicht verleihbar] nächste Partner-bibliothek wählen [weitere Partner-bibliothek vorhanden] Bestellungstornieren [keine weitere] Gebühr erstatten,Leser benachrichtigen Mediumversenden [verleihbar] Mediumerfassen Push-Nachrichtsenden Medium insAbholregal stellen Mediumabholen
Lösung UML-02.3: Aktivitätsdiagramm „Fernleihe“ mit vier Partitionen
Bewertung (IHK-typisch nach Sachverhalten):
  • Partitionen korrekt genutzt (jede Aktion in der Bahn des Ausführenden) – 2 P
  • Start beim Leser, „Fernleihe bestellen“ – 1 P
  • „Leserkonto prüfen“, Entscheidung [gesperrt]/[nicht gesperrt], Ablehnung, Ende – 3 P
  • „Bestand prüfen“, Entscheidung, Vormerkung anlegen, Leser informieren, Ende – 3 P
  • Teilung: Gebühr buchen parallel zu „Bestellung prüfen“ und „Partnerbibliothek auswählen“, Synchronisation vor dem Absenden – 4 P
  • „Bestellung absenden“, „Verleihbarkeit prüfen“ (Partnerbibliothek), Entscheidung – 2 P
  • Schleife: [weitere Partnerbibliothek] → nächste auswählen → Zusammenführung vor „Bestellung absenden“ – 3 P
  • [keine weitere]: stornieren (Fernleihstelle), Gebühr erstatten und Leser benachrichtigen (BiblioNet), Ende – 2 P
  • „Medium versenden“ (Partnerbibliothek), „Medium erfassen“ (Fernleihstelle) – 2 P
  • Teilung: Push-Nachricht parallel zu „ins Abholregal stellen“ mit Synchronisation – 2 P
  • „Medium abholen“ (Leser) und Endknoten – 1 P
Gleichwertig: Ablehnung als „Ablehnung senden“ bei BiblioNet plus „Ablehnung erhalten“ beim Leser; ein gemeinsamer Endknoten über Zusammenführungen statt mehrerer Endknoten; „Gebühr erstatten“ und „Leser benachrichtigen“ als zwei Aktionen.

Erklärung: Die Schleife ist der schwierigste Teil: Der Text sagt „wähle die nächste Partnerbibliothek aus und sende die Bestellung dorthin“ – deshalb führt der Rückweg vor „Bestellung absenden“ und nicht vor die Teilung (die Gebühr wird nur einmal gebucht). Die Entscheidung „weitere Partnerbibliothek vorhanden?“ trifft die Fernleihstelle und steht deshalb in deren Bahn.

UML-03 · Klassendiagramm

Aufgabe UML-03.1 · 6 Punkte

a) Multiplizitäten (3 P)

  1. Leser – Ausleihe: Ein Leser hat beliebig viele (auch keine) Ausleihen (0..*). Jede Ausleihe gehört zu genau einem Leser (1).
  2. Medium – Exemplar: Ein Medium hat mindestens ein Exemplar (1..*). Jedes Exemplar gehört zu genau einem Medium (1); als Komposition werden die Exemplare mit ihrem Medium gelöscht.
  3. Leser – Leser: Ein Leser kann als Hauptkonto bis zu vier Mitleser haben (0..4 an der Rolle mitleser). Ein Leser hat höchstens ein Hauptkonto (0..1 an der Rolle hauptkonto) – er ist also entweder eigenständig oder Mitleser genau eines Familienkontos.
Bewertung: je Beziehung 1 P, nur wenn beide Richtungen richtig gedeutet sind (sonst 0,5 P).

b) Notationen (3 P)

  1. # = protected: Auf titel dürfen die Klasse Medium und ihre Unterklassen (Buch, Film) zugreifen (in Java zusätzlich Klassen im selben Paket), andere Klassen nicht.
  2. Unterstrichen = statisch (Klassenattribut): Der Wert gehört der Klasse, nicht dem einzelnen Objekt; alle Ausleihen teilen sich denselben Wert 2 (hier eine Konstante).
  3. Kursiv = abstrakt: Von Medium können keine Objekte erzeugt werden, nur von den Unterklassen. getLeihfrist() hat in Medium keine Implementierung und muss in Buch und Film überschrieben werden.
Bewertung: je Notation 1 P.
Aufgabe UML-03.2 · 12 Punkte

a) Klassendiagramm (9 P)

Foerdermodul {abstract} # modulNr : int - aktiv : boolean + Foerdermodul(modulNr : int) + starten() : void + isAktiv() : boolean # setAktiv(aktiv : boolean) : void «interface» Wartbar + warten() : void + getBetriebsstunden() : int Foerderband - geschwindigkeit : double - betriebsstunden : int + Foerderband(modulNr : int, geschwindigkeit : double) + starten() : void + warten() : void + getBetriebsstunden() : int Sortieranlage - anzahlAnlagen : int - standort : String + Sortieranlage(standort : String, band : Foerderband) + sortiere(barcode : String, zielKiste : int) : int + getAnzahlAnlagen() : int Kiste - nummer : int - kapazitaet : int - barcodes : List<String> + Kiste(nummer : int, kapazitaet : int) + istVoll() : boolean + ablegen(barcode : String) : void ~ leeren() : void 0..1 1 band 1 6 kisten
Lösung UML-03.2 a): Klassendiagramm zum Quelltext der Sortieranlage
Bewertung a): Klassen/Interface mit Attributen inkl. Sichtbarkeit und Typ 2,5 P; Methoden und Konstruktoren mit Parametern und Rückgabetyp 2,5 P; abstract und static korrekt gekennzeichnet 1 P; Vererbung und Realisierung 1 P; Komposition und Aggregation mit Multiplizitäten 2 P. Werden band und kisten als Attribute statt als Beziehung eingetragen, gibt es für die Beziehung höchstens die Hälfte der Punkte.

b) Aggregation oder Komposition? (3 P)

Bewertung b): je Beziehung 1,5 P (Art 0,5 P, Begründung am Quelltext 1 P).
Aufgabe UML-03.3 · 22 Punkte

a) Klassendiagramm (16 P)

Standort - name : String - adresse : String Veranstaltung {abstract} # titel : String # beschreibung : String # preis : double Referent - name : String - email : String - honorar : double Raum - bezeichnung : String - kapazitaet : int - barrierefrei : boolean Termin - datum : Date - beginn : Time - ende : Time + berechneAuslastung() : double Lesung - buchtitel : String Workshop - materialkosten : double - mindestalter : int Leser - leserNr : int - name : String Anmeldung - anmeldedatum : Date - status : String 1 1..* 1 1..* 0..* 1 0..* 0..* 1 0..* {ordered} 1 0..*
Lösung UML-03.3 a): Klassendiagramm „Veranstaltungen“
Bewertung a): Klassen mit Attributen und Datentypen: Standort, Veranstaltung (abstrakt), Lesung, Workshop, Termin (mit berechneAuslastung() : double), Referent, Leser, Anmeldung je 1 P (8 P). Beziehungen mit Multiplizitäten: Standort ◆ Raum, Veranstaltung ◆ Termin, Termin – Raum, Veranstaltung ◇ Referent, Vererbung Lesung/Workshop, Leser – Anmeldung, Termin – Anmeldung je 1 P, Kennzeichnung {abstract} 1 P (8 P). Gleichwertig: Anmeldung als Assoziationsklasse zwischen Leser und Termin; Termin ◆ Anmeldung als Komposition; Termin – Raum ungerichtet; status als Aufzählungstyp («enumeration» Anmeldestatus); Datentypen wie LocalDate, LocalTime, Integer, Boolean.

b) Reihenfolge der Anmeldungen (2 P)

Am Assoziationsende bei Anmeldung (Beziehung Termin – Anmeldung) steht die Eigenschaft {ordered}: Die Anmeldungen eines Termins bilden eine geordnete Liste (Reihenfolge des Eingangs), z. B. umgesetzt als List<Anmeldung>.

Bewertung: {ordered} 1 P, richtige Stelle/Bedeutung 1 P.

c) Gewählte Beziehungsarten (4 P)

Bewertung: je Beziehung 2 P (Art 1 P, Begründung 1 P). Eine einfache Assoziation für Veranstaltung – Referent wird mit nachvollziehbarer Begründung ebenfalls akzeptiert.

UML-04 · Zustandsdiagramm

Aufgabe UML-04.1 · 5 Punkte

a) Folgezustand und Aktionen (2 P)

Der Saldo steigt auf 10,50 €. Das Ereignis gebuehrGebucht trifft auf die Transition mit [saldo >= 10] → Folgezustand Gesperrt. Reihenfolge: (Aktiv hat keine exit-Aktion) → Aktion an der Transition „Sperrhinweis senden“ → entry-Aktion von Gesperrt „Ausleihe sperren“.

Bewertung: Folgezustand 1 P, beide Aktionen in richtiger Reihenfolge 1 P.

b) Bestandteile der Beschriftung (2 P)

Bewertung: zwei Bestandteile richtig 1 P, alle drei 2 P.

c) entry und exit (1 P)

entry wird bei jedem Betreten des Zustands Gesperrt ausgeführt (Ausleihe sperren), exit bei jedem Verlassen (Ausleihe freigeben) – unabhängig davon, über welche Transition der Zustand betreten oder verlassen wird.

Aufgabe UML-04.2 · 10 Punkte
Verfügbar aussondern Ausgeliehen ausleihen / Fälligkeit setzen zurückgeben[keine Vormerkung] verlängern [verlängerungen < 2und keine Vormerkung]/ Fälligkeit + Leihfrist Zurückgelegt entry / Leser benachrichtigen zurückgeben[Vormerkungvorhanden] ausleihen [durchvormerkenden Leser] after(7 Tage)[weitere Vormerkung]/ Vormerkung löschen after(7 Tage)[keine weitere Vormerkung]/ Vormerkung löschen Vermisst dritteMahnungErfolglos zurückgeben after(1 Jahr) / ausbuchen
Lösung UML-04.2: Zustandsdiagramm eines Exemplars
Bewertung: Zustände Verfügbar, Ausgeliehen, Zurückgelegt, Vermisst je 0,5 P (2 P); Startzustand und Endzustände (aussondern, ausbuchen) 1 P; ausleihen/zurückgeben mit Bedingungen zwischen Verfügbar, Ausgeliehen und Zurückgelegt 2 P; Selbsttransition „verlängern“ mit Bedingung und Aktion 1,5 P; Zurückgelegt mit entry-Aktion und beiden after(7 Tage)-Transitionen 2 P; Vermisst mit beiden Ausgängen 1,5 P. Ein eigener Zustand „Ausgesondert“ vor dem Endzustand wird ebenfalls akzeptiert.
Aufgabe UML-04.3 · 25 Punkte

a) Zustandsdiagramm (19 P)

Selbsttest do / Sensoren prüfen Störung entry / Förderband stoppen entry / Störmeldung senden [Selbsttest fehlerhaft] störungQuittiert Bereit entry / Klappe entriegeln entry / Hinweis „Medium einlegen“ [Selbsttest ok] ausschalten Kiste voll entry / „Außer Betrieb“ anzeigen kisteGetauscht Prüfung entry / Klappe verriegeln do / RFID-Etikett lesen mediumErkannt Transport do / Medium zur Sortieranlage mediumAbgelegt[Kiste nicht voll] mediumAbgelegt[Kiste voll]/ Personal informieren Auswurf entry / Hinweis anzeigen do / Medium zurückschieben after(5 s) etikettGelesen[fremdes Medium] mediumEntnommen Verbuchung do / Rückgabe buchen etikettGelesen[eigenes Medium] buchungBestätigt after(10 s)/ Rückgabe lokalspeichern
Lösung UML-04.3 a): Zustandsdiagramm des Rückgabeautomaten
Bewertung a):
  • Zustände mit inneren Aktionen: Prüfung (entry, do), Verbuchung (do), Auswurf (entry, do), Transport (do), Kiste voll (entry), Störung (entry) – je 1 P (6 P)
  • Selbsttest → Störung [Selbsttest fehlerhaft] – 1 P
  • Bereit → Prüfung mediumErkannt – 1 P
  • Prüfung → Verbuchung etikettGelesen [eigenes Medium] – 1 P
  • Prüfung → Auswurf mit etikettGelesen [fremdes Medium] und after(5 s) – 2 P
  • Auswurf → Bereit mediumEntnommen – 1 P
  • Verbuchung → Transport mit buchungBestätigt und after(10 s) / Rückgabe lokal speichern – 2 P
  • Transport → Bereit [Kiste nicht voll] und → Kiste voll [Kiste voll] / Personal informieren (Ereignis mediumAbgelegt) – 2 P
  • Kiste voll → Bereit kisteGetauscht – 1 P
  • Störung → Selbsttest störungQuittiert – 1 P
  • Bereit → Endzustand ausschalten – 1 P
Andere Ereignisnamen mit gleicher Bedeutung sind zulässig. Wer die Prüfung des Etiketts mit einer Entscheidung (Raute) nach etikettGelesen modelliert, erhält die Punkte ebenfalls.

b) entry statt Transitionsaktion (2 P)

„Bereit“ wird über viele Transitionen betreten (nach dem Selbsttest, nach dem Auswurf, nach dem Transport, nach dem Kistentausch). Mit entry wird die Klappe bei jedem Betreten entriegelt, ohne die Aktion an jede eingehende Transition schreiben zu müssen. Das Diagramm bleibt übersichtlich, und bei neuen Transitionen nach „Bereit“ kann die Aktion nicht vergessen werden.

c) Not-Aus mit zusammengesetztem Zustand (4 P)

Selbsttest Störung entry / Förderband stoppen [Selbsttest fehlerhaft] störungQuittiert Betrieb [Selbsttest ok] notAus Bereit Prüfung Auswurf Verbuchung Transport (Transitionen wie in a) Kiste voll mediumAbgelegt [Kiste voll] kisteGetauscht
Lösung UML-04.3 c): Zusammengesetzter Zustand „Betrieb“ – die Transition „notAus“ am Rand gilt für alle Unterzustände

Die fünf Zustände werden zu einem zusammengesetzten Zustand „Betrieb“ zusammengefasst; sein innerer Startzustand führt zu „Bereit“. Eine einzige Transition notAus geht vom Rand des zusammengesetzten Zustands nach „Störung“ und gilt damit für jeden Unterzustand. Vorteil: eine Transition statt fünf, übersichtlicher und weniger fehleranfällig; ein später ergänzter Unterzustand erhält das Not-Aus automatisch. Der Pfeil kisteGetauscht endet am Rand von „Betrieb“: Der Automat beginnt dann wieder beim inneren Startzustand, also in „Bereit“.

Bewertung c): zusammengesetzter Zustand mit den fünf Unterzuständen und innerem Startzustand 2 P, Transition notAus vom Rand nach Störung 1 P, Vorteil 1 P. „Kiste voll“ darf auch innerhalb liegen, wenn begründet.

UML-05 · Use-Case-Diagramm

Aufgabe UML-05.1 · 5 Punkte

a) include und extend (2 P)

«include»: Der Basis-Anwendungsfall bindet einen anderen Anwendungsfall immer ein (Pflichtbestandteil, oft von mehreren Fällen gemeinsam genutzt). Pfeil vom Basisfall zum eingebundenen Fall.
«extend»: Ein erweiternder Anwendungsfall wird nur optional, unter einer Bedingung und an einem Erweiterungspunkt, in den Basisfall eingefügt; der Basisfall ist auch ohne ihn vollständig. Pfeil vom erweiternden Fall zum Basisfall.

b) Zuordnung (2 P)

Nr.BeziehungUmsetzung
1include„Zu Veranstaltung anmelden“ → «include» → „Freie Plätze prüfen“
2extend„Auf Warteliste setzen“ → «extend» → „Zu Veranstaltung anmelden“, Condition {Termin ausgebucht}
3Generalisierung von AkteurenLesepate —▷ Leser (Dreieck am Leser)
4Generalisierung von Anwendungsfällen„Veranstaltung per QR-Code finden“ —▷ „Veranstaltung suchen“
Bewertung: a) je Beziehung 1 P (Bedeutung und Richtung). b) je Zeile 0,5 P.

c) Systemgrenze (1 P)

Das Rechteck um die Anwendungsfälle grenzt das betrachtete System (seinen Funktionsumfang) von der Umgebung ab: Was innerhalb liegt, leistet das System; die Akteure stehen außerhalb und nutzen es.

Aufgabe UML-05.2 · 10 Punkte

a) Fehler und Korrekturen (6 P, vier von sechs genügen)

Nr.FehlerKorrektur
1Der «include»-Pfeil zeigt von „Abholcode eingeben“ zu „Medien abholen“.Richtung umkehren: vom Basisfall „Medien abholen“ zum eingebundenen Fall „Abholcode eingeben“.
2Der «extend»-Pfeil zeigt von „Medien abholen“ zu „Abholbeleg drucken“.Richtung umkehren: von „Abholbeleg drucken“ (Erweiterung) zu „Medien abholen“; Bedingung als Notiz (Condition: {Leser wünscht Beleg}).
3„„OK“-Taste drücken“ ist ein Bedienschritt der Oberfläche, kein Anwendungsfall mit eigenem Nutzen.Entfernen (gehört in die Beschreibung von „Abholcode eingeben“).
4Einfache Linie (Assoziation) zwischen den Anwendungsfällen „Fach befüllen“ und „Fach öffnen“ – Assoziationen gibt es nur zwischen Akteur und Anwendungsfall.Durch «include» von „Fach befüllen“ zu „Fach öffnen“ ersetzen (oder entfernen).
5Der Akteur „BiblioNet-Server“ steht innerhalb der Systemgrenze.Als externes System außerhalb der Systemgrenze anordnen.
6Linie zwischen den Akteuren Leser und Thekenpersonal.Entfernen – Akteure werden im Use-Case-Diagramm nicht miteinander verbunden (nur Generalisierung wäre zulässig).
Abholstation Leser Thekenpersonal Medien abholen Abholcode eingeben Abholbeleg drucken Fach befüllen Fach öffnen «include» «extend» «include» BiblioNet-Server Condition:{Leser wünscht Beleg}
Lösung UML-05.2 a): korrigiertes Use-Case-Diagramm „Abholstation“
Bewertung: je Fehler mit Korrektur 1,5 P (Fehler 0,5 P, Korrektur 1 P), höchstens 6 P.

b) Use-Case-Beschreibung „Medien abholen“ (4 P)

FeldInhalt
NameMedien abholen
Akteur(e)Leser (primär), BiblioNet-Server (sekundär)
VorbedingungDas Fach ist belegt, der Leser hat den Abholcode erhalten, die Abholfrist ist nicht abgelaufen.
Standardablauf1. Leser gibt am Bedienterminal den Abholcode ein. 2. Terminal lässt den Code vom BiblioNet-Server prüfen. 3. Code ist gültig: Die Fachsteuerung entriegelt die Tür, die Medien werden auf das Leserkonto verbucht. 4. Leser entnimmt die Medien und schließt die Tür. 5. (optional, extend) Terminal druckt einen Abholbeleg.
Alternative / Ausnahme3a. Code ungültig: Terminal zeigt einen Hinweis, weiter mit Schritt 1.
NachbedingungDie Medien sind auf das Leserkonto verbucht, das Fach ist wieder frei.
Bewertung b): Akteur und Vorbedingung 1 P, Standardablauf 2 P, Ausnahme und Nachbedingung 1 P.
Aufgabe UML-05.3 · 20 Punkte

a) Use-Case-Diagramm (16 P)

LeseLink Besucher Leser Thekenpersonal Fernleih-personal PayFix(Zahlungs-dienstleister) Verbund-katalog Katalogdurchsuchen Per Barcode-Scansuchen Mediumvormerken Leserkontoprüfen Ausleihe verlängern extension points: Kontosperre Gebührenbezahlen Fernleihebestellen Leserkontoanlegen Gebührenerlassen Fernleihebearbeiten «include» «include» «extend» Condition: {Konto wegen offenerGebühren gesperrt}extension point: Kontosperre
Lösung UML-05.3 a): Use-Case-Diagramm der App „LeseLink“
Bewertung a): Systemgrenze mit Namen 1 P; sechs Akteure je 0,5 P (3 P); Generalisierung Leser → Besucher und Fernleihpersonal → Thekenpersonal 2 P; Anwendungsfälle mit korrekten Assoziationen 5 P; zwei include-Beziehungen 2 P; extend mit Richtung, Condition und Extension Point 2 P; Generalisierung „Per Barcode-Scan suchen“ → „Katalog durchsuchen“ 1 P.

b) User Stories (4 P)

Bewertung b): je User Story 1,5 P (Rolle, Funktion, Nutzen), Akzeptanzkriterien 1 P. Andere Stories aus dem Diagramm sind gleichwertig.

UML-06 · Sequenzdiagramm

Aufgabe UML-06.1 · 5 Punkte

a) synchron und asynchron (2 P)

verlaengern(exemplarNr) ist eine synchrone Nachricht (gefüllte Pfeilspitze): Die App wartet, bis der KontoService die Verlängerung bearbeitet hat und das neue Datum bzw. „abgelehnt“ zurückgibt. sendeBestaetigung(leserNr) ist asynchron (offene Spitze): Der KontoService beauftragt den PushDienst und arbeitet sofort weiter, ohne auf eine Antwort zu warten.

b) Fragment alt (1 P)

Von den beiden Bereichen wird genau einer ausgeführt: Ist das Konto nicht gesperrt, wird die Fälligkeit aktualisiert, eine Bestätigung gesendet und das neue Datum zurückgegeben; andernfalls ([else]) wird „abgelehnt“ zurückgegeben.

c) Rechtecke und gestrichelte Pfeile (1 P)

Die Rechtecke sind Aktivierungsbalken (das Objekt führt gerade eine Methode aus); die gestrichelten Pfeile sind Antworten (Rückgabewerte) auf synchrone Nachrichten.

d) Fragmente (1 P)

(1) opt, (2) loop.

Bewertung: a) je Nachricht 1 P; b), c), d) je 1 P (d nur mit beiden Fragmenten).
Aufgabe UML-06.2 · 10 Punkte
:Selbstverbucher server:BiblioNetClient leser:Leser drucker:Drucker ausleihen(leserNr, barcodes) ladeLeser(leserNr) leser istGesperrt() gesperrt alt [gesperrt] [else] zeigeHinweis("Konto gesperrt …") create(leserNr) q:Quittung loop [für jeden code in barcodes] verbuche(leserNr, code) faellig hinzufuegen(code, faellig) drucke(q)
Lösung UML-06.2: Sequenzdiagramm zur Methode ausleihen()
Bewertung: Lebenslinien korrekt benannt 1,5 P; ladeLeser und istGesperrt mit Antworten 2 P; alt mit Bedingungen und Selbstaufruf 2 P; create der Quittung 1 P; loop mit verbuche (Antwort faellig) und hinzufuegen 2,5 P; drucke(q) 1 P.
Aufgabe UML-06.3 · 20 Punkte

a) Sequenzdiagramm (16 P)

Leser :LeseLinkApp :KatalogService :Cache :Datenbank :Verbundkatalog suchen(begriff) suche(begriff) holeTreffer(begriff) treffer opt [treffer = null] sucheTitel(begriff) treffer speichere(begriff, treffer) opt [treffer ist leer] sucheExtern(begriff) externeTreffer trefferliste loop(1,10) [für jeden angezeigten Treffer] verfuegbarkeit(medienNr) zaehleFreieExemplare(medienNr) anzahl status anzeigen(trefferliste) Trefferliste mit Status
Lösung UML-06.3 a): Sequenzdiagramm „Katalogsuche mit Cache“
Bewertung a): Aufrufe Leser → App → KatalogService mit Aktivierungen 2 P; Cache-Abfrage mit Antwort 2 P; opt [treffer = null] mit Datenbankabfrage, Antwort und asynchronem speichere 4 P; opt [treffer ist leer] mit Verbundkatalog und Antwort 2 P; Antwort Trefferliste an die App 1 P; loop(1,10) mit Verfügbarkeitsabfrage, Datenbankabfrage und beiden Antworten 4 P; Selbstaufruf anzeigen 1 P. Die Antwort an den Leser am Ende ist optional.

b) speichere() asynchron (2 P)

Der KatalogService braucht vom Cache keine Antwort, um weiterzuarbeiten – laut Anlage 10 wartet er nicht auf eine Bestätigung. Das Speichern im Cache soll die Antwortzeit für den Leser nicht verlängern; deshalb wird die Nachricht asynchron (offene Pfeilspitze, keine Antwort) modelliert.

c) opt und alt (2 P)

opt hat einen Bereich mit einer Bedingung, der nur ausgeführt wird, wenn sie zutrifft – sonst passiert nichts. alt hat mehrere Bereiche mit Bedingungen, von denen genau einer ausgeführt wird. Für die Schritte 4/5 wurde opt [treffer = null] verwendet, weil bei einem Cache-Treffer keine Nachrichten anfallen. Ein alt mit leerem Bereich [treffer vorhanden] und [else] ist gleichwertig.

UML-07 · Struktogramm / PAP

Aufgabe UML-07.1 · 4 Punkte

a) Rückgabewerte (2 P)

AufrufRückgabewertRechnung
gebuehrGesamt([4, 15, 0, 9], falsch)11,502,00 + 5,00 (7,50 gedeckelt) + 0,00 + 4,50
gebuehrGesamt([12], wahr)0,00Kind – Schleife wird nicht ausgeführt
gebuehrGesamt([10, 11], falsch)10,005,00 (genau 5,00, nicht > 5,00) + 5,00 (5,50 gedeckelt)
gebuehrGesamt([], falsch)0,00leeres Array – kein Schleifendurchlauf

b) Strukturblöcke (1 P)

Sequenz (Folge von Anweisungen), Verzweigung (zweiseitig bzw. einseitig mit leerem Zweig ∅), Zählschleife.

c) Strukturblock für den Medientyp (1 P)

Fallauswahl (Mehrfachverzweigung) über den Medientyp.

Bewertung: a) je Aufruf 0,5 P; b) alle drei Strukturen 1 P; c) 1 P.

Java · Aufgabe_UML_07_1.java (Auszug)

static double gebuehrGesamt(int[] tage, boolean istKind) {
    double summe = 0.00;
    if (istKind) {
        // leerer Zweig
    } else {
        for (int i = 0; i <= tage.length - 1; i++) {
            double g = tage[i] * 0.50;
            if (g > 5.00) {
                g = 5.00;
            }
            summe = summe + g;
        }
    }
    return summe;
}

Ausgabe

gebuehrGesamt([4, 15, 0, 9], falsch)   ->  11,50  (erwartet  11,50) OK
gebuehrGesamt([12], wahr)              ->   0,00  (erwartet   0,00) OK
gebuehrGesamt([10, 11], falsch)        ->  10,00  (erwartet  10,00) OK
gebuehrGesamt([], falsch)              ->   0,00  (erwartet   0,00) OK

Datei: java\03_UML\Aufgabe_UML_07_1.java

Aufgabe UML-07.2 · 8 Punkte

a) Struktogramm (6 P)

faelligkeit(medientyp : string, ausleihTag : integer, geschlossen : boolean[]) : integer medientyp Buch, Hörbuch frist := 28 Film, Spiel frist := 14 Zeitschrift frist := 7 sonst frist := 21 tag := ausleihTag + frist solange geschlossen[tag] = wahr tag := tag + 1 rückgabe tag
Lösung UML-07.2 a): Struktogramm „faelligkeit“ mit Fallauswahl und kopfgesteuerter Schleife
Bewertung a): Fallauswahl mit vier Fällen einschließlich „sonst“ 3 P; Berechnung von tag 1 P; kopfgesteuerte Schleife mit Bedingung und Rumpf 1,5 P; Rückgabe 0,5 P.

b) Warum kopfgesteuert? (2 P)

Ist der berechnete Tag bereits ein Öffnungstag, darf er nicht verändert werden – der Schleifenrumpf darf also gar nicht ausgeführt werden. Eine kopfgesteuerte Schleife prüft die Bedingung vor dem ersten Durchlauf. Eine fußgesteuerte Schleife führt den Rumpf mindestens einmal aus; die Fälligkeit läge dann immer mindestens einen Tag zu spät (Beispiel: Buch, ausgeliehen an Tag 100 → richtig 128, fußgesteuert 129).

Java · Aufgabe_UML_07_2.java (Auszug)

static int faelligkeit(String medientyp, int ausleihTag, boolean[] geschlossen) {
    int frist;
    switch (medientyp) {                        // Fallauswahl
        case "Buch", "Hörbuch" -> frist = 28;
        case "Film", "Spiel" -> frist = 14;
        case "Zeitschrift" -> frist = 7;
        default -> frist = 21;
    }
    int tag = ausleihTag + frist;
    while (geschlossen[tag]) {                  // kopfgesteuert
        tag = tag + 1;
    }
    return tag;
}

Ausgabe (Testdaten: Tage 114, 115 und 121 geschlossen)

Film, ausgeliehen an Tag 100        -> 116 (erwartet 116)
Buch, ausgeliehen an Tag 100        -> 128 (erwartet 128)
Zeitschrift, ausgeliehen an Tag 114 -> 122 (erwartet 122)
Noten, ausgeliehen an Tag 100       -> 122 (erwartet 122)
fußgesteuert, Buch an Tag 100       -> 129 (falsch: 129 statt 128, ein Tag zu spät)

Datei: java\03_UML\Aufgabe_UML_07_2.java

Aufgabe UML-07.3 · 14 Punkte

a) Schreibtischtest des fehlerhaften Struktogramms mit 40517287 (4 P)

igewichtziffer(nr, i)summe
03412
1100
23515
3111
43721
5122
63824
7177
pz = (10 − 7 mod 10) mod 10 = 3ziffer(nr, 7) = 7 → Rückgabe: falsch

Richtig wäre: 4·1 + 0·3 + 5·1 + 1·3 + 7·1 + 2·3 + 8·1 = 33 → pz = (10 − 3) mod 10 = 7 = letzte Ziffer → wahr.

Bewertung: Werte der acht Durchläufe 3 P (je fehlerhafte Zeile −0,5 P), pz und Rückgabewert 1 P.

b) Fehler und Korrekturen (6 P)

Nr.FehlerKorrektur
1Die Zählschleife läuft bis 7 – die Prüfziffer selbst wird mitgezählt.zähle i von 0 bis 6
2summe := 0 steht im Schleifenrumpf – die Summe wird in jedem Durchlauf zurückgesetzt.summe := 0 vor die Schleife setzen.
3Die Gewichte sind vertauscht: Bei i mod 2 = 0 (1., 3., 5., 7. Ziffer) wird mit 3 statt mit 1 gewichtet.ja-Zweig gewicht := 1, nein-Zweig gewicht := 3 (oder Bedingung i mod 2 = 1).
pruefeAusweis(nr : string) : boolean nr.length() <> 8 ja nein rückgabe falsch ∅ summe := 0 zähle i von 0 bis 6 i mod 2 = 0 ja nein gewicht := 1 gewicht := 3 summe := summe + ziffer(nr, i) * gewicht pz := (10 - summe mod 10) mod 10 pz = ziffer(nr, 7) ja nein rückgabe wahr rückgabe falsch
Lösung UML-07.3 b): korrigiertes Struktogramm „pruefeAusweis“
Bewertung b): je Fehler 2 P (Fehler 1 P, Korrektur 1 P).

c) PAP des korrigierten Algorithmus (4 P)

pruefeAusweis(nr) nr.length() <> 8 Rückgabe falsch ja summe := 0 nein i := 0 i <= 6 i mod 2 = 0 ja gewicht := 1 gewicht := 3 ja nein summe := summe + ziffer(nr, i) * gewicht i := i + 1 nein pz := (10 - summe mod 10) mod 10 pz = ziffer(nr, 7) Rückgabe wahr ja Rückgabe falsch nein
Lösung UML-07.3 c): korrigierter Algorithmus als PAP
Bewertung c): Grenzstellen für Beginn und alle Rückgaben 1 P; Längenprüfung als Verzweigung 0,5 P; Initialisierung, Schleifenbedingung, i := i + 1 und Rücksprung 1,5 P; Gewichtung als Verzweigung 0,5 P; Prüfziffer und Vergleich 0,5 P.

Java · Aufgabe_UML_07_3.java (korrigierte Fassung)

static boolean pruefeAusweis(String nr) {
    if (nr.length() != 8) {
        return false;
    }
    int summe = 0;                       // Korrektur 2: vor der Schleife
    int gewicht;
    for (int i = 0; i <= 6; i++) {       // Korrektur 1: nur sieben Ziffern
        if (i % 2 == 0) {
            gewicht = 1;                 // Korrektur 3: Gewichte 1, 3, 1, ...
        } else {
            gewicht = 3;
        }
        summe = summe + ziffer(nr, i) * gewicht;
    }
    int pz = (10 - summe % 10) % 10;
    return pz == ziffer(nr, 7);
}

Ausgabe

Schreibtischtest fehlerhafte Fassung mit 40517287:
  i=0  gewicht=3  ziffer=4  summe=12
  i=1  gewicht=1  ziffer=0  summe=0
  i=2  gewicht=3  ziffer=5  summe=15
  i=3  gewicht=1  ziffer=1  summe=1
  i=4  gewicht=3  ziffer=7  summe=21
  i=5  gewicht=1  ziffer=2  summe=2
  i=6  gewicht=3  ziffer=8  summe=24
  i=7  gewicht=1  ziffer=7  summe=7
  pz=3  ziffer(nr,7)=7
  Rückgabe: false  (erwartet laut Spezifikation: true)

korrigiert: pruefeAusweis("40517287") = true  OK
korrigiert: pruefeAusweis("40517280") = false  OK
korrigiert: pruefeAusweis("12345678") = true  OK
korrigiert: pruefeAusweis("1234567") = false  OK
korrigiert: pruefeAusweis("00000000") = true  OK

Datei: java\03_UML\Aufgabe_UML_07_3.java (enthält die fehlerhafte und die korrigierte Fassung)