Sie sind auf Seite 1von 11

Ludwig-Maximilians-Universit t Munchen a Institut fur Informatik

Beispielklausur 2 zu Softwaretechnik
Prof.-Dr. R. Hennicker

Aufgabe 1 (a) Was versteht man unter einer Template Operation? (2 Punkte) (b) Geben Sie ein Beispiel f r eine Template Operation an! (3 Punkte) u

(5 Punkte)

Aufgabe 2

(5 Punkte)

In dem auf Arbeitsblatt 1 angegebenen Sequenzdiagramm benden sich vier (syntaktische oder semantische) Fehler. Markieren Sie die fehlerhaften Stellen und beschreiben Sie (auf Arbeitsblatt 1), was falsch gemacht wurde! Aufgabe 3 Gegeben sei das folgende statische Modell f r ein einfaches Flugreservierungs-System. u
Flugreservierung
flugnr: String datum: Date

(12 Punkte)

0..1 fluege

Flug

Die beiden folgenden Sequenzdiagramme beschreiben m gliche Szenarien bei der Buchung eines Flugs. o (Die Szenarien k nnen beliebig wiederholt werden.) o

Benutzer

:Flugreservierung flugBuchen(flugnr, datum) plaetzeFrei()

:Flug

Benutzer

:Flugreservierung flugBuchen(flugnr, datum) plaetzeFrei()

:Flug

"ja" Meldung "noch Pltze frei" Meldung "ausgebucht"

"nein"

flugReservieren() reservieren()

ticketDrucken() Meldung "Ticket gedruckt"

(a) Entwickeln Sie, gem der in der Vorlesung angegebenen Methode ein Zustandsdiagramm (mit zwei a stabilen und zwei Aktivit tszust nden), das das Verhalten eines Objekts der Klasse Flugreservierung a a zeigt. (4 Punkte)

(b) F r jeden der beiden Aktivit tszust nde ist ein Aktivit tsdiagramm anzugeben. (5 Punkte) u a a a (c) Welche Operationen m ssen in einem Objektentwurf zu den Klassen Flugreservierung und Flug u hinzugenommen werden? (3 Punkte) Aufgabe 4 (13 Punkte)

Eine Aktiensimulation soll folgende Funktionalit t erf llen: Die Benutzerschnittstelle der Simulation hat a u zwei Eingabefelder nameField und kursField, in die ein Aktienname und der aktuelle Kurs der Aktie eingetragen werden k nnen. Bei Bet tigen des Knopfes bestaetigungsButton werden die beiden Felder eingeo a lesen. Falls der aktuelle Kurs der Aktie um mehr als die H lfte unter dem bisherigen Kurs liegt, erscheint a in einem Ausgabefeld namens disasterField die Meldung Disaster. In jedem Fall wird der Kurswert der Aktie auf den aktuellen Wert ge ndert. Die Simulation wird durch Bet tigen des Knopfes stopButton a a beendet. Auf den Arbeitsbl ttern 2 und 3 sind zwei (noch zu vervollst ndigende) Subsysteme f r die Bea a u nutzerschnittstelle und den Anwendungskern des Systems angegeben. Folgende Aufgaben sind zu l sen: o (a) Geben Sie eine 2-Schichten Architektur f r das Aktiensimulations-System an. Es sind alle notwenu digen Import-Abh ngigkeiten einzuzeichnen sowie eine Klasse AktienSimulation mit der Methode a main(args: String[]) und deren Code anzugeben. Pakete der Java API brauchen nicht ber cksichtigt u zu werden. (2 Punkte) (b) Erg nzen Sie im Subsystem aktiengui (auf Arbeitsblatt 2) den Code der Operation actionPerformed a an der mit (A) gekennzeichneten Stelle. (Zur Umwandlung von Strings in Double-Werte kann die Java-Methode Double.parseDouble verwendet werden.) (3 Punkte) Die Meldung eines Disasters vom Anwendungskern an die Benutzerschnittstelle soll mittels indirekter Kommunikation durch Beobachter erfolgen. (c) F gen Sie in beiden Subsystemen die dazu ben tigten Klassen bzw. Interfaces einschlielich Vererbungsu o und Realisierungsbeziehungen ein. Folgende Operationen sind dabei an den richtigen Stellen einzutragen und gegebenenfalls durch Angabe des Codes zu implementieren: setChanged(), update(o: Observable, arg: Object), notifyObservers(), addObserver(o: Observer). (4 Punkte) (d) Erg nzen Sie den Code des Konstruktors der Klasse AktienFrame an der mit (B) gekennzeichneten a Stelle, so dass die indirekte Kommunikation wirksam wird. (1 Punkt) (e) F gen Sie den Code der Operation meldeDisaster der Klasse Aktienmanager an der mit (C) gekennu zeichneten Stelle ein. (1 Punkte) (f) F gen Sie den Code der Operation changeKurs der Klasse Aktie an der mit (D) gekennzeichneten u Stelle ein. (2 Punkte)

Arbeitsblatt 1

Benutzer opA1()

a:A

b:B

class C

new() opC1() opA2() myOp() opB()

opC2() opA2() myOp()

<<subsystem>> aktiengui

<<interface>> ActionListener +actionPerformed(event: ActionEvent)


*

JFrame

am = amg; (B)

Arbeitsblatt 2

//Konstruktion der GUI braucht //nicht angegeben zu werden


1 bestaetigungsButton 1 stopButton

+AktienFrame JButton button = (JButton)e.getSource(); +AktienFrame(amg: Aktienmanager) (A)

JButton

JTextField

1 nameField 1 kursField 1 disasterField

+actionPerformed(e: ActionEvent)

+setText(s: String) +getText():String

am

Aktienmanager +Aktienmanager() +changeKurs(n: String, k: Real) ...

<<subsystem>> aktien

Aktie a = new Aktie("tu", 100, this); addAktie(a); Aktie b = new Aktie("vw", 200, this); addAktie(b);

+Aktienmanager

Arbeitsblatt 3

+Aktienmanager() +changeKurs(n: String, k: Real) Aktie a = selectAktie(n); a.changeKurs(k); +meldeDisaster() +addAktie(a: Aktie) +selectAktie(name: String):Aktie 1 am (C)

* Aktie name: String kurs: Real name = n; kurs = k; am = amg; +Aktie(n: String, k: Real, amg: Aktienmanager) +changeKurs(k: Real) (D)

Aufgabe 1
a) Eine Template Operation ist eine (nicht abstrakte) Operation, deren Implementierung eine oder mehrere abstrakte Operationen aufruft. (Diese abstrakten Operationen werden in Subklassen implementiert.)

b) Beispiel: Boot {abstract} geschwindigkeit druckeInfo() druckeDetails() {abstract} print geschwindigkeit; druckeDetails();

druckeInfo ist eine Template Operation

Aufgabe 2

1
Benutzer opA1() new() opC1() opA2() a:A b:B

2
class C

myOp() opB()

opC2() opA2()

3
myOp()

1: Das Objekt (mit dieser Rolle) existiert erst bei seiner Erzeugung 2: C ist kein Objekt (bzw. keine Rolle) 3: Parallele Ausfhrung ist bei dem synchronen Aufruf von opC2() nicht mglich. 4: Die Aktivierung kann hier noch nicht beendet sein sondern muss auf die Beendigung von opB() warten.

Aufgabe 3 a

flugBuchen(flugnr, datum) Bereit [check = "voll"] check = flugBuchenActivity()

[check = "ok"]

flugReservieren() flugReservierenActivity() FlugReservierbar

Aufgabe 3 b
flugBuchenActivity

check = fluege[flugnr, datum].plaetzeFrei()

[check = "ja"]

[check = "nein"]

Meldung "noch Pltze frei"

Meldung "ausgebucht"

return "ok"

return "voll"

flugReservierenActivity

fluege[flugnr, datum].reservieren()

ticketDrucken()

Meldung "Ticket gedruckt"

Aufgabe 3 c
Flug

Flugreservierung

flugnr: String datum: Date

0..1 fluege

flugBuchen(fnr: Integer, dat: Date) flugReservieren() ticketDrucken() flugBuchenActivity(): String flugReservierenActivity()

plaetzeFrei(): String reservieren()

Aufgabe 4 a

<<import>>

<<subsystem>> aktiengui

AktienSimulation <<import>> +main(args: String[])

<<import>> <<subsystem>> aktien Aktienmanager amg = new Aktienmanager(); AktienFrame frame = new AktienFrame(amg); frame.show();

Aufgabe 4 (b, c, d)

<<subsystem>> aktiengui

<<interface>> ActionListener JFrame +update(o: Observable, arg: Object) <<interface>> Observer

+actionPerformed(event: ActionEvent)

am = amg; (B) am.addObserver(this); //Konstruktion der GUI braucht //nicht angegeben zu werden +AktienFrame JButton button = (JButton)e.getSource(); +AktienFrame(amg: Aktienmanager) +actionPerformed(e: ActionEvent) +update(o: Observable, arg: Object) (A)

JButton

bestaetigungsButton 1

stopButton

JTextField

+setText(s: String) +getText():String

nameField 1 kursField 1 disasterField

if (button == stopButton) System.exit(0); else if (button == bestaetigungsButton) { String n = nameField.getText(); Double k = Double.parseDouble(kursField.getText()); disasterField.setText(""); am.changeKurs(n, k); }

1 Aktienmanager +Aktienmanager() +changeKurs(n: String, k: Real) ...

am disasterField.setText("Disaster");

Aufgabe 4 (c, e, f)

<<subsystem>> aktien

Observable +addObserver(o: Observer) +notifyObservers(arg: Object) #setChanged()

Aktie a = new Aktie("tu", 100, this); addAktie(a); Aktie b = new Aktie("vw", 200, this); addAktie(b); +Aktienmanager

+Aktienmanager() +changeKurs(n: String, k: Real) +meldeDisaster() +addAktie(a: Aktie) +selectAktie(name: String):Aktie 1 am (C) setChanged(); notifyObservers();

Aktie a = selectAktie(n); a.changeKurs(k);

* Aktie name: String kurs: Real +Aktie(n: String, k: Real, amg: Aktienmanager) +changeKurs(k: Real) (D) if (k < kurs/2) am.meldeDisaster(); kurs = k;

name = n; kurs = k; am = amg;