\documentclass{bschlangaul-aufgabe}
\bLadePakete{uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Systementwurf},
  Thematik = {Flugbuchung},
  Referenz = 66112-2006-H.T1-A5,
  RelativerPfad = Examen/66112/2006/09/Thema-1/Aufgabe-5.tex,
  ZitatSchluessel = examen:66112:2006:09,
  BearbeitungsStand = TeX-Fehler,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Vererbung, Klassendiagramm, Objektdiagramm, Sequenzdiagramm, Kommunikationsdiagramm},
  EinzelpruefungsNr = 66112,
  Jahr = 2006,
  Monat = 09,
  ThemaNr = 1,
  AufgabeNr = 5,
}

\begin{enumerate}

%%
% a)
%%

\item Erklären Sie den Begriff Vererbung \index{Vererbung} und benennen
Sie die damit verbundenen Vorteile!\footcite{examen:66112:2006:09}

\begin{bAntwort}
Vererbung (generalization) beschreibt eine Beziehung zwischen einer
allgemeinen Klasse (Basisklasse) und einer spezialisierten Klasse. Die
spezialisierte Klasse ist vollständig konsistent mit der Basisklasse,
enthält aber zusätzliche Informationen (Attribute, Operationen,
Assoziationen). Die allgemeine Klasse wird auch als Oberklasse (super
class), die spezialisierte als Unterklasse (sub class) bezeichnet.
(vgl. Balzert 1999, S 51)

\bPseudoUeberschrift{Vorteile}

\begin{description}
\item[Verfeinerung der Oberklasse]

Eine abgeleitete Klasse kann durch neue Bestandteile, wie weitere
Attribute, Methoden und Beziehungen, verfeinert werden. Auf diese Weise
können neue Typen von Objekten auf der Basis bereits vorhandener
Objekt-Definitionen festgelegt werden. Weiter können Methoden der
Basisklasse verändert werden. Dies wird erreicht, indem die Unterklasse
eine neue Methode erhält, die den gleichen Namen wie die der Oberklasse
und geänderte Inhalte hat. Dieser Vorgang heißt Redefinieren oder
Überschreiben.

\item[Redundanz bei der Definition von Klassen vermieden]

Durch die Vererbung entsteht eine Klassen-Hierarchie bzw. eine
Vererbungsstruktur. Vererbung ist über mehrere Abstraktionsstufen
möglich. Man erhält so schnell neue Klassen, ohne den gemeinsamen Code
neu schreiben zu müssen. Dies hat den Vorteil, dass Redundanz bei der
Definition von Klassen vermieden wird.

\item[Konsistenz des Programmcodes leichter sichergestellt]

Änderungen in der Oberklasse werden sofort für alle abgeleiteten Klassen
gültig. Auf diese Weise kann die Konsistenz des Programmcodes leichter
sichergestellt werden.

\item[Code mit geringerem Aufwand entwickelt]

Vererbung trägt dazu bei, dass der Code mit geringerem Aufwand
entwickelt und gewartet werden kann.
\footcite[Seite 11]{brinda}
\end{description}
\end{bAntwort}

%%
% b)
%%

\item Erstellen Sie zu der folgenden Beschreibung eines Systems zur
Buchung von Flügen ein Klassendiagramm
\index{Klassendiagramm}, das neben Attributen und
Assoziationen mit Kardinalitäten auch Methoden zur Tarifberechnung
enthält! Setzen Sie dabei das Konzept der Vererbung sinnvoll ein!

\begin{itemize}
\item Die Fluggesellschaft bietet verschiedene Flugrouten an, die durch
den jeweiligen Startflughafen und Zielflughafen charakterisiert werden.

\item Jeder Flug besitzt eine Flugnummer, eine Abflugzeit, eine geplante
Ankunftszeit und ist genau einer Flugroute zugeordnet. Flugrouten sollen
auch gespeichert werden, falls noch keine zugehörigen Flüge existieren.

\item Flugbuchungen beziehen sich auf einzelne Plätze im Flugzeug.
Sowohl in der Economy Class als auch in der Business Class gibt es
Nichtraucher- und Raucherplätze. Zu jeder Buchung wird das Datum
vermerkt.

\item Zu jedem Passagier müssen die Adressinformationen erfasst werden.

\item Die Berechnung des Tarifs soll vom System unterstützt werden.
Jeder Flug besitzt einen Grundpreis. Für Plätze der Business Class wird
ein Aufschlag verrechnet. Auf diesen ermittelten Zwischenpreis sind zwei
Arten von Rabatten möglich:

\begin{itemize}
\item Jugendliche Privatkunden unter 25 Jahren erhalten einen Nachlass
auf den Flugpreis.

\item Geschäftsreisende erhalten Vergünstigungen in Abhängigkeit ihrer
gesammelten Flugmeilen.
\end{itemize}
\end{itemize}

\begin{bAntwort}
\begin{tikzpicture}
\umlclass{Fluggesellschaft}{}{}
\umlclass[right=2cm of Fluggesellschaft]{Flugroute}{
  + startFlughafen: String\\
  + zielFlughafen: String
}{}
\umlassoc[mult1=1,mult2=0..*,name=bietetAn]{Fluggesellschaft}{Flugroute}

\bUmlLeserichtung{bietetAn}

\umlclass[below=1.5cm of Flugroute]{Flug}{
  - flugnummer: int\\
  - abflugzeit: int\\
  - ankunftszeit: int\\
}{
}
\umlassoc[mult1=0..*,mult2=1,arg2=route]{Flug}{Flugroute}

\umlclass[left=1cm of Flug]{Flugbuchung}{
  - grundpreis: double\\
  - datum: Date
}{
  + berechneTarif(): double
}

\umlclass[below=1cm of Flug]{Sitzplatz}{
  - raucherplatz: boolean\\
  - businessclass: boolean
}{}

\umlcompo[mult1=1,mult2=20..*]{Flug}{Sitzplatz}

\umlclass[below=1cm of Flugbuchung]{Passagier}{
  + adresse: String
}{
  \textit{+ berechneRabatt(): double}
}

\umlclass[below left=1cm and -1.5cm of Passagier]{Privatkunde}{- alter: int}{+ berechneRabatt(): double}
\umlclass[below right=1cm and -1.5cm of Passagier]{Geschäftskunde}{
  - flugmeilen: double
}
{+ berechneRabatt(): double}

\umlassoc{Passagier}{Sitzplatz}
\umlassoc{Flugbuchung}{Passagier}
\umlassoc{Flugbuchung}{Flug}

\umlVHVinherit[arm2=-1.2cm]{Privatkunde}{Passagier}
\umlVHVinherit[arm2=-1.2cm]{Geschäftskunde}{Passagier}

\end{tikzpicture}
\end{bAntwort}

%%
% c)
%%

\item Erstellen Sie ein exemplarisches Objektdiagramm! Es soll
mindestens einen Flug enthalten, in dem sowohl ein privater Kunde als
auch ein Geschäftskunde einen Platz gebucht haben! Wählen Sie geeignete
Attributwerte!
\index{Objektdiagramm}

%%
% d)
%%

\item Beschreiben Sie den Vorgang „Tarifberechnung“ wahlweise als
Sequenzdiagramm oder Kommunikationsdiagramm!
\index{Sequenzdiagramm}
\index{Kommunikationsdiagramm}

\begin{bAntwort}
\begin{tikzpicture}[scale=0.6,transform shape]
\begin{umlseqdiag}
\umlobject[class=Flugbuchung]{buchung}
\umlactor[class=Passagier]{passagier}
\umlactor[class=Privatkunde]{privat}
\umlactor[class=Geschäftskunde]{geschäft}

\begin{umlcall}[op=berechneTarif(),return=double]{buchung}{passagier}

\begin{umlfragment}[type=alt,label=privat,inner xsep=6]
\begin{umlcall}[op=berechneRabatt(),return=double]{passagier}{privat}
\end{umlcall}

\umlfpart[geschäft]

\begin{umlcall}[op=berechneRabatt(),return=double]{passagier}{geschäft}
\end{umlcall}
\end{umlfragment}

\end{umlcall}

\end{umlseqdiag}
\end{tikzpicture}
\end{bAntwort}

\end{enumerate}
\end{document}
