\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 1},
  Thematik = {Dateisystem: Implementierung durch Kompositum},
  Referenz = 66116-2019-H.T2-TA1-A1,
  RelativerPfad = Examen/66116/2019/09/Thema-2/Teilaufgabe-1/Aufgabe-1.tex,
  ZitatSchluessel = examen:66116:2019:09,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Entwurfsmuster, Kompositum (Composite), Klassendiagramm, Implementierung in Java, Rekursion},
  EinzelpruefungsNr = 66116,
  Jahr = 2019,
  Monat = 09,
  ThemaNr = 2,
  TeilaufgabeNr = 1,
  AufgabeNr = 1,
}

Hierarchische Dateisysteme bestehen aus den FileSystemElements Ordner,
Dateien und Verweise. Ein Ordner kann seinerseits Ordner, Dateien und
Verweise beinhalten; jedem Ordner ist bekannt, welche Elemente
(children) er enthält. Mit Ausnahme des Root-Ordners auf der obersten
Hierarchieebene ist jeder Ordner, jede Datei und jeder Verweis Element
eines Elternordners. Jedem Element ist bekannt, was sein Elternordner
ist (parent). Ein Verweis verweist auf einen Verweis, eine Datei oder
einen Ordner (link). Wenn ein Ordner gelöscht wird, werden alle seine
Bestandteile ggf. rekursiv ebenfalls gelöscht. Sie dürfen die Lösungen
für Aufgabenteil b) und c) in einem gemeinsamen Code kombinieren.
\index{Entwurfsmuster}\index{Kompositum (Composite)}
\footcite{examen:66116:2019:09}

\begin{enumerate}

%%
% a)
%%

\item Modellieren Sie diesen Sachverhalt mit einem
UML-Klassendiagramm. Benennen Sie die Rollen von Assoziationen und geben
Sie alle Kardinalitäten an. Ihre Lösung soll mindestens eine sinnvolle
Spezialisierungsbeziehung enthalten.\index{Klassendiagramm}

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}
\umlclass[x=0,y=3,type=abstract]{Element}
{}
{+ delete()}

\umlclass[x=-3]{Link}
{}
{+ delete()}

\umlclass[x=0]{File}
{}
{+ delete()}

\umlclass[x=3]{Directory}
{}
{+ delete()}

\umlVHVinherit{Directory}{Element}
\umlVHVinherit{File}{Element}
\umlVHVinherit{Link}{Element}
\umlHVHaggreg[%
  anchor1=east,arm1=1.5cm,arg1=parent,mult1=1,pos1=0.4,
  arg2=children,mult2=0..*,pos2=2.85,]{Directory}{Element}

\umlHVHuniassoc[%
  arm1=-1cm,anchor1=west,mult1=1,
  anchor2=west,arg2=linkedElement,pos2=2.7,mult2=1]{Link}{Element}
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% b)
%%

\item Implementieren Sie das Klassendiagramm als Java- oder
C++-Programm. Jedes Element des Dateisystems soll mindestens über ein
Attribut \bJavaCode{name} verfügen. Übergeben Sie den Elternordner
jedes Elements als Parameter an den Konstruktor; der Elternordner des
Root-Ordners kann dabei als \bJavaCode{null} implementiert werden.
Dokumentieren Sie Ihren Code.
\index{Implementierung in Java}

\begin{bAntwort}

\bFussnoteLink{TU Darmstadt: Dr. Michael Eichberg - Case Study Using
the Composite and Proxy Design
Patterns}{https://www.stg.tu-darmstadt.de/media/st/teaching/courses/ws2009/material_eise/20100120c_casestudydesigningtheapiforaccessingafilesystemcompositeandproxypattern.pdf}

\bJavaExamen{66116}{2019}{09}{file_system/Element}
\bJavaExamen{66116}{2019}{09}{file_system/Directory}
\bJavaExamen{66116}{2019}{09}{file_system/File}
\bJavaExamen{66116}{2019}{09}{file_system/Link}
\end{bAntwort}

%%
% c)
%%

\item Ordnen Sie eine Methode \bJavaCode{delete}, die Dateien, Ordner
und Verweise rekursiv löscht, einer oder mehreren geeigneten Klassen zu
und implementieren Sie sie. Zeigen Sie die Löschung jedes Elements durch
eine Textausgabe von \bJavaCode{name} an. \bJavaCode{toString()}
müssen Sie dabei nicht implementieren. Gehen Sie davon aus, dass
Verweis- und Ordnerstrukturen azyklisch sind und dass jedes Element des
Dateisystems höchstens einmal existiert. Wenn ein Verweis gelöscht wird,
wird sowohl der Verweis als auch das verwiesene Element bzw. transitiv
die Kette der verwiesenen Elemente gelöscht. Bedenken Sie, dass die
Löschung eines Elements immer auch Konsequenzen für den dieses Element
beinhaltenden Ordner hat. Es gibt keinen Punktabzug, wenn Sie die
Löschung des Root-Ordners nicht zulassen.
\index{Rekursion}

\begin{bAntwort}
Siehe Antwort zu Aufgabe b)
\end{bAntwort}

%%
% d)
%%

\item Was kann im Fall von \bJavaCode{delete} passieren,
wenn die Linkstruktur zyklisch ist oder die Ordnerstruktur zyklisch ist?
Kann es zu diesen Problemen auch dann führen, wenn weder die
Linkstruktur zyklisch ist, noch die Ordnerstruktur zyklisch ist? Wie
kann man im Programm das Problem lösen, falls man Zyklizitäten zulassen
möchte?

\begin{bAntwort}
Falls die Link- oder Ordnerstruktur zyklisch ist, kann es aufgrund der
Rekursion zu einer Endlosschleife kommen. Diese Problem tritt bei
azyklischen Strukturen nicht auf, weil der rekursive Löschvorgang beim
letzten Element abgebrochen wird (Abbruchbedingung).

Das Problem kann zum Beispiel durch ein neues Attribut
\bJavaCode{gelöscht} in der Klasse \bJavaCode{Link} oder
\bJavaCode{Directory} gelöst werden. Dieses Attribut wird auf
\bJavaCode{true} gesetzt, bevor es in die Rekursion einsteigt. Rufen
sich die Klassen wegen der Zyklizität selbst wieder auf, kommt es durch
entsprechende IF-Bedingungen zum Abbruch.

Außerdem ist ein Zähler denkbar, der sich bei jeder Rekursion hochsetzt
und ab einem gewissen Grenzwert zum Abbruch führt.
\end{bAntwort}

%%
% e)
%%

\item Was ist ein Design Pattern? Nennen Sie drei Beispiele und
erläutern Sie sie kurz. Welches Design Pattern bietet sich für die
Behandlung von hierarchischen Teil-Ganzes-Beziehungen an, wie sie im
Beispiel des Dateisystems vorliegen?

\begin{bAntwort}
Design Pattern sind wiederkehrende, geprüfte, bewährte Lösungsschablonen
für typische Probleme.

\bPseudoUeberschrift{Drei Beispiele}

\begin{description}
\item[Einzelstück (Singleton)]
Stellt sicher, dass nur \emph{genau eine Instanz einer Klasse} erzeugt
wird.
\footcite[Seite 38]{eilebrecht}

\item[Beobachter (Observer)]
Das Observer-Muster ermöglicht einem oder mehreren Objekten, automatisch
auf die \emph{Zustandsänderung} eines bestimmten Objekts \emph{zu
reagieren}, um den eigenen Zustand anzupassen.
\footcite[Seite 70]{eilebrecht}

\item[Stellvertreter (Proxy)]
Ein Proxy stellt einen Platzhalter für eine andere Komponente (Objekt)
dar und kontrolliert den Zugang zum echten Objekt.
\footcite[Seite 89]{eilebrecht}
\end{description}

Für hierarchischen Teil-Ganzes-Beziehungen eigent sich das Kompositum
(Composite). Es ermöglicht die Gleichbehandlung von Einzelelementen und
Elementgruppierungen in einer verschachtelten Struktur (\zB Baum),
sodass aus Sicht des Clients keine explizite Unterscheidung notwendig
ist.
\end{bAntwort}
\end{enumerate}

\begin{bAdditum}
% \bJavaTestDatei[firstline=3]{examen/examen_66116_2019_09/file_system/FileSystemTest}

\end{bAdditum}

\end{document}
