Aufgabe Vorschlag A - 1 - Klassendiagramme und Objektdiag… · Abitur Hessen Praktische Informatik LK 2021

Thema: Klassendiagramme und Objektdiagramme · Aus der Prüfung LK (2021)

Aufgabenstellung

Lieferservice eines Restaurants

Für den Lieferservice eines Restaurants sollen ein Softwaresystem und eine Datenbank entwickelt werden. Zu einer eingegangenen Bestellung wird ein Lieferauftrag erzeugt, der von einer Fahrerin oder einem Fahrer (im Folgenden Fahrer genannt) mit einem Fahrzeug ausgeführt wird. Lieferungen bis zu 10km Entfernung werden mit einem E-Motorroller ausgefahren, dieser kann mit einem Führerschein der Klassen 'A' oder 'B' gefahren werden. Lieferungen über 10km werden mit einem Kleinwagen ausgefahren, für den ein Führerschein der Klasse 'B' notwendig ist. Der Fahrer mit der längsten Wartezeit erhält den Lieferauftrag. Jeder Fahrer hat eine RFID 1 -Kennung, mittels eines RFID-Chips erhält er Zugang zum Fahrzeug. Im Lieferauftrag werden der Startzeitpunkt der Lieferung sowie die Zeitpunkte der Auslieferung und der Rückkehr zum Restaurant festgehalten.

1 RFID (engl. Radio-frequency identification) ermöglicht das berührungslose Identifizieren von Objekten.

Material 1: UML-Klassendiagramm Lieferservice

Hinweis: Auf alle Attribute kann mittels get- und set-Methoden zugegriffen werden.

Material 2: Klassendokumentationen

Klasse List

List<T>()

erzeugt eine generische Liste mit Elementen des Typs T

add(obj: T)

hängt das Objekt obj vom Typ T am Ende der Liste an.

add(index: int, obj: T)

fügt das Objekt obj vom Typ T an der Position index in die Liste ein.

contains(obj: T): boolean

liefert true, wenn das Objekt obj in der Liste enthalten ist, andernfalls false.

get(index: int): T

liefert das Listenelement an der Position index zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.

remove(index: int): T

entfernt das Listenelement an der Position index. Liefert das entfernte Element zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.

remove(obj: T): boolean

entfernt das Objekt obj aus der Liste. Falls obj mehrmals in der Liste enthalten ist, wird nur das erste Vorkommen entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, andernfalls ist er false.

size(): int

liefert die Anzahl der Elemente in der Liste zurück.

Klasse DateTime

DateTime()

erzeugt ein DateTime-Objekt mit dem aktuellen Systemdatum und der aktuellen Systemzeit.

DateTime(date: String, time: String)

erzeugt ein DateTime-Objekt aus einer Zeichenkette im Format "dd.mm.yyyy" und einer Zeichenkette im Format "hh:mm".

millisUntil(other: DateTime): long

liefert die Anzahl der Millisekunden zwischen diesem DateTime-Objekt und other; liegt other zeitlich nach diesem DateTime-Objekt ist das Ergebnis eine positive Zahl, liegt other zeitlich vor diesem Date-Time-Objekt ist das Ergebnis eine negative Zahl.

toString(): String

liefert eine String-Repräsentanz dieses DateTime-Objekts im Format "dd.mm.yyyy hh:mm".

Klasse Serial

port: Name des Ports (z.B. „COM1“)

baud: Baudrate (z.B. 2400 oder 9600)

dataBits: Anzahl der Datenbits, 7 oder 8

stopBits: Anzahl der Stoppbits, 1 oder 2

parity: Parität, 0 für no, 1 für odd, 2 für even parity

Serial(...)

der Konstruktor initialisiert die serielle Schnittstelle, ohne sie zu öffnen.

open(): boolean

öffnet die serielle Schnittstelle; liefert true, wenn die Schnittstelle verwendbar ist.

close()

schließt die serielle Schnittstelle; die Schnittstelle ist dann solange nicht mehr verwendbar, bis sie wieder geöffnet wird.

dataAvailable(): int

liefert die Anzahl der Bytes, die von der seriellen Schnittstelle gelesen werden können.

read(): int

liest ein Byte (0..255) von der serielle Schnittstelle, bzw. −1, wenn die Schnittstelle nicht geöffnet ist. Die Methode blockiert, bis ein Byte verfügbar ist.

write(value: int)

schreibt ein Byte auf die serielle Schnittstelle; ist die Schnittstelle nicht geöffnet geschieht nichts.

Klasse String

String(data: char[])

erzeugt ein String-Objekt aus den Zeichen des Feldes data

equals(str: String): boolean

liefert true, wenn beide Strings gleich sind, andernfalls false.

isEmpty(): boolean

liefert true, wenn der String leer ist, d. h. die Länge 0 hat, andernfalls ist der Rückgabewert false.

startsWith(str: String): boolean

liefert true, wenn der String mit str beginnt, andernfalls false.

Material 3: Vorlage für Sequenzdiagramm

Material 4: UML-Klassendiagramm für die Zugangskontrolle der Fahrzeuge

Hinweise:

Dieses Klassendiagramm zeigt die Software der Fahrzeuge.

Mithilfe der Klasse FunkModul werden Kommandos vom Fahrzeug zur Lieferservice-Verwaltung (Material 1) gesendet und entsprechende Antworten empfangen.

Auf alle Attribute kann mittels get- und set-Methoden zugegriffen werden.

RS232-Protokoll zum Lesen der RFID-Kennung eines Fahrers

Übertragungsparameter: 9600 Baud, 8 Datenbits, 1 Stoppbit, kein Paritätsbit

Steuerzeichen: Start of Text - STX (0x02) und End of Text - ETX (0x03)

6 Datenbytes mit der RFID-Kennung des Fahrers

Prüfzeichen: alle Datenbytes bitweise mit dem XOR-Operator verknüpft

Datenrahmen:

STX

6 Datenbytes (ASCII-Format)

Prüfzeichen

ETX

Beispiel:

Start

Daten

Prüfz.

Ende

Position

0

1

2

3

4

5

6

7

8

Zeichen

STX

'1'

'2'

'1'

'2'

'1'

'2'

'3'

ETX

Zeichencode

0x02

0x31

0x32

0x31

0x32

0x31

0x32

0x33

0x03

Material 5: Struktogramm der run()-Methode der Klasse Controller

Hinweise:

Das Struktogramm zeigt das Entriegeln eines Fahrzeugs zu Beginn einer Fahrt, nur dieser Teil der Methode ist zu implementieren.

Kommandona me, Fahrzeugnummer und RFID-Kennung des Fahrers werden mit einer Leerstelle als Trennzeichen aneinandergehängt und an die Lieferservice-Verwaltung gesendet.

Beispiel: UNLOCK 1147 121212.

Wenn ein Fahrzeug nach 60 Sekunden wieder verriegelt wird, kann niemand in einem Wagen eingesperrt werden. Von innen lässt sich ein Fahrzeug immer öffnen.

Material 6: Auszug aus der Speisen- und Getränkekarte

Pizzen

Classic Preis (in €)

Groß Preis (in €)

Pizza Margherita

(Tomatensauce, Mozzarella, Basilikum)

6,90

8,50

Pizza Hawaii

(Tomatensauce, Ananas, Schinken, Käse)

7,90

9,50

Pizza Salami

(Salami, Käse)

6,50

7,90

Pasta

Preis (in €)

Pasta Arradiata

(cremige Tomatensauce, Knoblauch, Steakpfeffer, Pepperoni)

7,00

Pasta Alba

(Sahnesauce mit Schinken und frischen Champignons)

8,00

Getränke

Vol.

Preis (in €)

Pfand

Mineralwasser

0,5 l

2,00

kein Pfand

Limonade

0,5 l

2,00

25 ct

Limonade

1 l

3,00

25 ct

Das in Material 1 dargestellte Klassendiagramm zeigt die Klassen zum Bestell- und Lieferprozess von Produkten, wobei die Bestellung nur die Bestelldaten und den Gesamtpreis enthält. Informationen über die bestellten Produkte und die Kunden fehlen noch. In Material 6 ist ein Auszug aus der Speisen- und Getränkekarte des Restaurants dargestellt.

Das UML-Klassendiagramm soll entsprechend erweitert werden:

Der Lieferservice liefert Pizza, Pasta und Getränke.

Kunden werden mit ihrem Namen, ihrer Telefonnummer und ihrer Adresse als Lieferadresse erfasst.

Eine Kundin oder ein Kunde kann mehrere Bestellungen aufgeben, eine Bestellung kommt von genau einer Kundin oder einem Kunden.

In einer Bestellung können unterschiedliche Produkte bestellt werden, die jeweils mit einer Anzahl versehen sind. Beispielsweise kann eine Bestellung zwei große Pizza Margherita, eine Lasagne und drei 0,5l-Flaschen Mineralwasser als Bestellpositionen umfassen. Jedes Produkt hat eine Produktnummer.

1.5.1

Vererbung, Aggregation und Komposition sind Konzepte der Objektorientierung.

Erläutern Sie diese Konzepte mit ihrer Notation in UML-Klassendiagrammen sowie ihrem Nutzen für die objektorientierte Modellierung und geben Sie jeweils ein Beispiel aus dem Kontext des Lieferservice an. (6 BE)

1.5.2

Entwickeln Sie das erweiterte UML-Klassendiagramm und zeichnen Sie die Änderungen vorhandener Klassen sowie neue Klassen mit Attributen (Sichtbarkeit und Datentypen), Methoden (Sichtbarkeit, Parameter und Rückgabetypen) und Assoziationen (Navigierbarkeit, Multiplizitäten und Rollen).

Hinweise: Vererbung, Aggregation und Komposition sind sinnvoll einzusetzen. Get- und set-Methoden müssen nicht dargestellt werden. (10 BE)

Aufgabenstellung: Aufgabe Vorschlag A - 1 - Klassendiagramme und Objektdiag… · Abitur Hessen Praktische Informatik LK 2021

Lösung

Nach den offiziellen Korrekturhinweisen

1.5.1 Erläutern Sie die Konzepte Vererbung, Aggregation und Komposition mit ihrer Notation in UML-Klassendiagrammen sowie ihrem Nutzen für die objektorientierte Modellierung und geben Sie jeweils ein Beispiel aus dem Kontext des Lieferservice an.

Lösung: Vererbung: - Definition / Nutzen: Neue Klassen werden auf Basis vorhandener Klassen definiert (Superklasse/Subklasse). Gemeinsame Attribute und Methoden liegen in der Superklasse, wodurch Implementierungsaufwand gespart und Fehler reduziert werden. - Notation: Pfeil mit geschlossener, nicht ausgefüllter Dreiecksspitze zur Superklasse. - Beispiel: Die Superklasse Produkt vererbt an Pizza, Pasta und Getränk. Aggregation und Komposition: - Definition / Nutzen: Modellierung einer 'Ganzes-Teile'- bzw. 'besteht aus'-Beziehung. Betonen die Bindung zwischen Objekten und geben Implementierungshinweise. - Komposition: Existenzabhängig (Lebensdauer der Teile ist an das Ganze geknüpft; wird das Ganze gelöscht, werden auch die Teile gelöscht). Notation: ausgefüllte Raute am Ganzen. Beispiel: Eine Bestellung besteht aus Bestellpositionen. - Aggregation: Existenzunabhängig (Teile können ohne das Ganze existieren). Notation: nicht ausgefüllte Raute am Ganzen. Beispiel: Eine Abteilung besteht aus Mitarbeitern (oder Kunde/Adresse).

1.5.2 Entwickeln Sie das erweiterte UML-Klassendiagramm und zeichnen Sie die Änderungen vorhandener Klassen sowie neue Klassen mit Attributen (Sichtbarkeit und Datentypen), Methoden (Sichtbarkeit, Parameter und Rückgabetypen) und Assoziationen (Navigierbarkeit, Multiplizitäten und Rollen).

Lösung: Erweitertes Klassendiagramm gemäß Musterlösung: - Klasse `Bestellung`: - Attribute: `- bestellnr : int`, `- autowert : int = 0`, `- bestellEingang : DateTime` - Methoden: `+ Bestellung(besteller : Kunde)`, `+ erstellePosition(p : Produkt, menge : int)`, `+ berechneGesamtpreis() : double` - Assoziation zu `Kunde`: gerichtete Assoziation mit Rolle `- besteller` und Multiplizität `1` - Komposition zu `Bestellposition`: ausgefüllte Raute bei `Bestellung`, Rolle `- bestellpositionen`, Multiplizität `1..*` - Klasse `Kunde`: - Attribute: `- name : String`, `- telefon : String` - Methode: `+ Kunde(name : String, telefon : String, ladresse : Adresse)` - Gerichtete Assoziation zu `Adresse`: Rolle `- lieferadresse`, Multiplizität `1` - Klasse `Bestellposition`: - Attribute: `- posnr : int`, `- menge : int` - Methode: `+ Bestellposition(posnr : int, p : Produkt, m : int)` - Gerichtete Assoziation zu `Produkt`: Rolle `- produkt`, Multiplizität `1` - Abstrakte Klasse `Produkt` (`<<abstract>>`): - Attribute: `- produktnr : int`, `- autowert : int = 0`, `# bezeichnung : String`, `# einzelpreis : double` - Methode: `+ Produkt(bez : String, ep : double)` - Subklassen von `Produkt` (Generalisierung/Vererbung mit Dreieckspfeil auf `Produkt`): - `Pasta`: Attribut `- beschreibung : String`, Konstruktor `+ Pasta(bez : String, ep : double, beschr : String)` - `Getränk`: Attribute `- volumen : double`, `- pfand : double`, Konstruktor `+ Getränk(bez : String, ep : double, vol : double, pfand : double)` - `Pizza`: Attribute `- groesse : char`, `- beschreibung : String`, Konstruktor `+ Pizza(bez : String, ep : double, gr : char, beschr : String)`

Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium

Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.

‹ Aufgabe Vorschlag C - 1.3 · LK 2022 · Aufgabe Vorschlag B - 1 - Klassendiagramme und Objektdiag… · LK 2021 ›

Mehr Aufgaben zu Klassendiagramme und Objektdiagramme