\documentclass{bschlangaul-aufgabe}
\bLadePakete{uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 2},
  Thematik = {Roboter in einer Montagehalle},
  Referenz = 66116-2019-F.T1-TA2-A2,
  RelativerPfad = Examen/66116/2019/03/Thema-1/Teilaufgabe-2/Aufgabe-2.tex,
  ZitatSchluessel = examen:66116:2019:03,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Klassendiagramm},
  EinzelpruefungsNr = 66116,
  Jahr = 2019,
  Monat = 03,
  ThemaNr = 1,
  TeilaufgabeNr = 2,
  AufgabeNr = 2,
}

Hintergrundinformationen für die Aufgaben 2-5: Modellierung und
Implementierung eines Programms
\index{Klassendiagramm}
\footcite{examen:66116:2019:03}

\begin{mdframed}[backgroundcolor=white]
\footnotesize
Ein autonomer Roboter in einer Montagehalle bekommt einen Auftrag, eine
Menge von Objekten aus dem Lager (Material, z. B. Schrauben oder
Werkzeug, z. B. Bohrer) zu holen und anschließend an seinen
Ausgangspunkt zu bringen. Der Roboter hat einen Namen, der ihn eindeutig
identifiziert, kennt seine aktuelle Position (x- und y-Koordinate) und
hat als weitere Eigenschaft den Auftrag, der aus einer Liste von
Auftragspositionen besteht, die er holen soll. Der Roboter besitzt
folgende Fähigkeiten (Methoden):

\begin{enumerate}
\item Er kann sich zu einer angegebenen Position bewegen.

\item Er hat eine Methode, um einen Auftrag abzuarbeiten, d.h. alle
Auftragspositionen zu holen.
\end{enumerate}

Alle Objekte im Lager haben jeweils einen Namen, einen Standort mit
Angabe einer Position (s. oben) und speichern außerdem die jeweils noch
vorhandene Stückzahl. Es gibt zwei Typen von Objekten: Werkzeuge mit
einer Methode, mit der ein einzelnes Werkzeug ausgeliehen werden kann,
und Materialien mit einer Methode, mit der sie verbraucht werden, wobei
eine gewünschte Stückzahl angegeben wird. Diese vorgegebenen Methoden
aktualisieren die Stückzahlen der Werkzeuge (Reduktion um 1) bzw.
Materialien (Reduktion um verbrauchte Stückzahl), wobei hier
vereinfachend angenommen wird, dass die Stückzahlen der Werkzeuge und
Materialien immer ausreichend groß sind, um die geforderten Mengen
bedienen zu können (d.h. Sie können diese beiden Methoden nutzen, ohne
deren Implementierung angeben zu müssen).

Ein Auftrag (z. B. \emph{„Hole Bohrer Typ B1, 100 $\times$ Schrauben M6,
10 $\times$ Schrauben M10 und 2 $\times$ Blech B72“}) besteht aus einer
Menge von Auftragspositionen. Eine Auftragsposition besteht aus dem Typ
des zu holenden Objekts (Werkzeug oder Material, soll als Enumeration
modelliert werden), einem Verweis auf das zu holende Objekt und der zu
holenden Stückzahl (Quantität; bei Werkzeugen wird diese ignoriert, da
sie immer 1 ist). Der Roboter soll über die Auftragsposition außerdem
die Position bestimmen, zu der er fahren muss, um das Objekt zu holen.

Der Roboter arbeitet die Auftragspositionen in der Reihenfolge ab, indem
er sich von seinem aktuellen Standpunkt immer zur am nächsten liegenden
Auftragsposition bewegt, um dort das nächste Objekt zu holen. Wir gehen
der Einfachheit halber davon aus, dass die Montagehalle gut aufgeräumt
ist und der Roboter sich quasi entlang der Luftlinie bewegen kann, d.h.
die Entfernung zwischen zwei Positionen entspricht der euklidischen
Distanz (Wurzel aus der Summe der Quadrate der Differenzen der x- und
y-Koordinaten der Positionen). Der Roboter soll zur Kontrolle als
weitere Eigenschaft „Ergebnis“ die Liste der eingesammelten Objekte zu
einem Auftrag in der Reihenfolge speichern, in der er sie geholt hat,
z.B. (M6 M10 B72 B1).
\end{mdframed}

Geben Sie ein UML-Klassendiagramm zu der Aufgabenstellung an. Hinweis:
Bei den Aufgaben 4 und 5 wird Konsistenz des Aktivitätsdiagramms bzw.
des Codes mit dem Klassendiagramm verlangt.

\begin{bAntwort}
\begin{tikzpicture}
\umlclass{Roboter}{
  name : String
}{
  geheZuStandort(standort: Standort)\\
  arbeiteAuftragAb()
}

\umlclass[below=1cm of Roboter]{Auftrag}{}{}

\umlclass[below=1cm of Auftrag]{Auftragsposition}{
  anzahl : Integer
}{}

\umlenum[above left=1cm of Auftragsposition]{ObjektTyp}{
  WERKZEUG\\
  MATERIAL
}{}

\umlclass[right=2cm of Roboter]{Standort}{
  x : double\\
  y : double\\
}{}

\umlassoc[arg2=typ]{Auftragsposition}{ObjektTyp}

\umlaggreg[arg2=positionen]{Auftrag}{Auftragsposition}

\umlclass[below=2cm of Standort]{LagerObjekt}{
  name : String\\
  anzahl: Integer\\
}{}
\umlclass[below left=1cm and -1cm of LagerObjekt]{Werkzeug}{}{
  leiheAus(anzahl: Integer)\\
}
\umlclass[below right=1cm and -1cm of LagerObjekt]{Material}{}{
  verbrauche(anzahl: Integer)\\
}

\umlinherit{Werkzeug}{LagerObjekt}
\umlinherit{Material}{LagerObjekt}

\umlassoc[arg2=position,pos2=0.7]{Roboter}{Standort}
\umlassoc[arg2=position,pos2=0.7]{LagerObjekt}{Standort}

\umlassoc[arg2=auftrag,pos2=0.7]{Roboter}{Auftrag}

\umlassoc[arg2=lagerObjekt,pos2=0.6]{LagerObjekt}{Auftragsposition}

\umlaggreg[arg1=ergebnis,pos1=0.8]{Roboter}{LagerObjekt}
\end{tikzpicture}
\end{bAntwort}

\end{document}
