1 Client-Server-Architekturen

Bei Client-Server-Architekturen gibt es zwei grundlegende Varianten: „Thick Clients“ und „Thin Clients“. Letztere führen keine eigenen Berechnungen durch und besitzen keine Funktionalität, außer vom Server gesendete Daten anzuzeigen und Benutzereingaben zurückzusenden. Erstere enthalten dagegen eigene Funktionalität und greifen nur für bestimmte Dinge auf den Server zu.

Kurzübersicht „Thick“ vs „Thin“

  • Thick Client:
    • Voll funktionsfähiger Computer, der eine Verbindung zu einem Server herstellt
    • Verfügt über ein eigenes Betriebssystem, eigene Software, eigene Verarbeitungsfunktionen und eigenen Speicherplatz, sodass er auch im Offline-Betrieb ohne Probleme weiterarbeiten kann
    • Jedes Gerät, das völlig unabhängig von einem entfernten Server funktionieren kann, ist ein Thick Client
      • Beispiel:
        • Desktop-PCs, Laptops mit Windows oder macOS
  • Thin Client:
    • In der Regel ein Computer mit begrenzten Verarbeitungsfunktionen und nur dem Nötigsten an Soft-/Hardware
    • Speziell für den Betrieb in einer Netzwerkumgebung optimiert
    • Verfügt über nur sehr begrenzten lokalen Speicherplatz und ein optimiertes Betriebssystem
    • Im Gegensatz zu einem Thick Client benötigt ein Thin Client Zugriff auf den Remote-Server, um ordnungsgemäß zu funktionieren
      • Beispiel:
        • Als Gateway zum Netzwerk fungieren und dem Endnutzer Informationen anzeigen

Welche Vor- und Nachteile ergeben sich durch „Thick“ bzw. „Thin“ Clients?

Thin ClientThick Client
KostenKostengünstigerKostspieliger
StromverbrauchGeringerHöher
Lokale RessourcenBegrenztVollständig
Funktioniert offline?Nein (oder sehr begrenzt)Ja
Individuelle Anpassung durch EndnutzerBegrenztVollständig
Anforderungen an die IT-RessourcenGeringerHöher
MobilitätHöherGeringer
SicherheitSicherer (zentrale Verwaltung erleichtert Sicherheitsmaßnahmen)Weniger sicher (mehr lokale Angriffsflächen)

Für welche Art von Software eignet sich die jeweilige Architektur? Nennen Sie Beispiele!

  • Thin Clients

    • Cloud-basierte Anwendungen
      • Da kaum Rechenleistung auf den PCs benötigt wird, kann man hier einen Thin Client benutzen, da die Cloud den Rest behandelt.
    • Zentralisierte Datenverwaltung
      • Thin Clients sind auch dort gut geeignet, wo Datenschutz und -sicherheit wichtig sind, wie in Finanzsituationen.
    • Virtual Desktops
      • Ähnlich zu Cloud-basierten Anwendungen.
  • Thick Clients

    • Ressourcenintensive Anwendungen
      • Da Thick Clients bessere Rechenleistung als Thin Clients haben, sind sie besser geeignet für Anwendungen wie Videobearbeitung, Grafikdesign oder Spiele.
    • Entwicklungsumgebungen
      • Entwickler profitieren von Thick Clients durch die Nutzung leistungsfähiger lokaler Entwicklungsumgebungen und Tools.
    • Offline-Arbeit
      • Thick Clients sind ideal für Nutzer, die unabhängig von einer Netzwerkverbindung arbeiten müssen, z. B. in ländlichen Gebieten mit unzuverlässiger Internetanbindung.

2 Architekturen im Alltag

a) Nennen Sie Beispiele für Software, der Sie im Alltag begegnen, die einer Pipes-and-Filters-Architektur folgt!

  • Compiler:
    Compiler wie GCC oder Clang folgen der Pipes-and-Filters-Architektur, indem sie Quellcode durch mehrere Verarbeitungsschritte wie lexikalische Analyse, Parsing und Code-Generierung leiten.

  • Build-Systeme:
    Build-Systeme wie Make oder Maven nutzen Pipes-and-Filters, um Quellcode zu kompilieren, Abhängigkeiten zu verwalten und Softwarepakete zu erstellen.

  • Bildbearbeitungsprogramme:
    Bildbearbeitungsprogramme wie Photoshop oder GIMP verwenden eine Folge von Filtern, um komplexe Bildbearbeitungsaufgaben auf Bilddaten anzuwenden.

  • Audio- und Videobearbeitungsprogramme:
    Audio- und Videobearbeitungsprogramme nutzen oft eine Pipes-and-Filters-Architektur, um verschiedene Effekte und Bearbeitungen sequenziell auf Medienstreams anzuwenden.

  • Datenbanken:
    Datenbanksysteme setzen auf eine Abfolge von Operationen (Filtern), um Abfragen zu bearbeiten und Daten sicher und effizient zu speichern und abzurufen.

b) Nennen Sie Beispiele für Software, der Sie im Alltag begegnen, die einer Schichtenarchitektur folgt!

  • Betriebssysteme:
    Betriebssysteme wie Windows oder Linux sind ein klassisches Beispiel für Schichtenarchitektur, wobei jede Schicht spezifische Funktionen wie Hardware-Abstraktion, Prozessmanagement und Nutzerschnittstellen bereitstellt.

  • Netzwerkprotokolle:
    Das OSI-Modell für Netzwerkprotokolle ist in Schichten aufgebaut, wobei jede Schicht spezialisierte Aufgaben wie Routing, Datenübertragung und Anwendungsdienste übernimmt.

  • Webanwendungen:
    Viele Webanwendungen folgen einer Schichtenarchitektur, die Präsentation, Geschäftslogik und Datenzugriff in separate Schichten aufteilt, um die Wartung und Skalierbarkeit zu verbessern.

  • Datenbanken:
    Moderne Datenbankmanagementsysteme nutzen eine Schichtenarchitektur, um Datenabfrage, Transaktionsmanagement und Speicherzugriff separat zu handhaben.

c) Nennen Sie Beispiele für Software, der Sie im Alltag begegnen, die einer Repository-Architektur folgt!

  • Versionsverwaltungssysteme (z. B. Git):
    Versionsverwaltungssysteme wie Git nutzen ein Repository, um den Code und dessen Historie zentral zu speichern, sodass Entwickler effizient zusammenarbeiten und Änderungen nachverfolgen können.

  • IDE (z. B. Einstellungen in VSCode):
    In integrierten Entwicklungsumgebungen (IDEs) wie VSCode werden Einstellungen und Erweiterungen in einem zentralen Repository gespeichert, wodurch eine konsistente Arbeitsumgebung für Projekte und Benutzer geschaffen wird.

  • Datenbanken:
    Datenbanken implementieren oft eine Repository-Architektur, um Daten zentral zu speichern und zu verwalten, wobei sie über standardisierte Schnittstellen für den Datenzugriff und die Datenmanipulation verfügen.


U Pipes and Filters

Sehen Sie sich den Code in Listing 2 (pipes_and_filters.py) an. Die Python-Implementierung soll Ihnen dabei primär als Referenz dienen. Wenn Sie sich mit anderen Programmiersprachen besser auskennen, können Sie die Aufgabe auch in einer anderen Programmiersprache lösen. Sie können z. B. ChatGPT nutzen, um den Code in eine andere Programmiersprache zu überführen.

a) Erweitern Sie das Programm um eine weitere Filter-Klasse PrintFilter, die die Daten auf der Konsole ausgibt.

b) Erweitern Sie das Programm um eine weitere Filter-Klasse ElimFilter, die alle Vorkommen von WHERE-Klauseln entfernt.

Hinweis: Nutzen Sie den PrintFilter, um sich die Liste von Tokens ausgeben zu lassen.


3 Model-View-Controller

Beantworten Sie kurz und bündig folgende Fragen:

  • Skizzieren Sie die Struktur des MVC-Architekturmusters.
    • Geben Sie den zeitlichen Ablauf der Kommunikation zwischen den Komponenten an. Als Startpunkt können Sie von einer Interaktion des Benutzers mit der Benutzeroberfläche ausgehen.
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning}
 
\begin{document}
\begin{tikzpicture}[
    node distance=6cm and
    3cm, % Abstand zwischen Knoten
    every node/.style={draw, rectangle, text width=4cm, align=center, rounded corners, fill=gray!},
    arrow/.style={-{Stealth}, thick}
]
 
% Nodes
\node (model) {Model \\ \footnotesize Definiert Datenstruktur \\ z.B. aktualisiert Anwendung, um Element hinzuzufügen};
\node (view) [below left=of model] {View \\ \footnotesize Definiert Anzeige (UI) \\ z.B. Benutzer klickt auf 'Hinzufügen'};
\node (controller) [below right=of model] {Controller \\ \footnotesize Enthält Steuerungslogik \\ z.B. erhält Eingaben und aktualisiert das Model};
 
% Arrows
\draw[arrow] (view) -- node[midway, left] {Benutzereingabe} (controller);
\draw[arrow] (controller) -- node[midway, below] {Anweisungen} (model);
\draw[arrow] (model) -- node[midway, right] {Datenänderung} (view);
 
\end{tikzpicture}
\end{document}
graph TD
    A[Benutzer] --> B[View\nDefiniert Anzeige UI\nz.B. Benutzer klickt auf 'Hinzufügen']
    B --> C[Controller\nSteuert die Logik\nz.B. erhält Eingaben und aktualisiert das Model]
    C --> D[Model\nDefiniert Datenstruktur\nz.B. aktualisiert Anwendung um Element hinzuzufügen]
    D --> B[View erhält Aktualisierungen\nz.B. Liste aktualisiert sich, um Element anzuzeigen]
sequenceDiagram
    participant Benutzer
    participant View
    participant Controller
    participant Model

    Benutzer->>View: Interagiert mit Benutzeroberfläche
    View->>Controller: Leitet Benutzereingaben weiter
    Controller->>Model: Aktualisiert Daten/Logik
    Model->>Model: Verarbeitet die Änderung
    Model->>View: Benachrichtigt über Änderungen
    View->>Benutzer: Aktualisiert Darstellung
  • Welche Vorteile ergeben sich durch den Einsatz der MVC-Architektur? Warum?
    • Trennung von Anliegen:
      • MVC ermöglicht eine klare Trennung zwischen Daten (Model), Benutzeroberfläche (View) und Steuerungslogik (Controller). Dies erleichtert die Wartung und Änderung einzelner Teile der Anwendung ohne Beeinträchtigung der anderen.
    • Wiederverwendbarkeit und Modularität:
      • Da die Komponenten in MVC getrennt sind, können sie unabhängig voneinander entwickelt und wiederverwendet werden. Dies fördert die Modularität und Wiederverwendbarkeit des Codes.
    • Parallelentwicklung:
      • Mit MVC können Entwickler gleichzeitig an verschiedenen Komponenten arbeiten. Zum Beispiel können einige Entwickler am Model arbeiten, während andere an der View oder am Controller arbeiten.
    • Einfache Anpassung an neue Technologien:
      • Da die View-Komponente in MVC getrennt ist, kann die Benutzeroberfläche leicht an neue Technologien angepasst werden, ohne die Geschäftslogik oder Datenzugriffskomponenten zu beeinflussen.

P Model-View-Controller (Implementierung)

Bei P Aufgaben handelt es sich um optionale Praxisaufgaben. Diese Aufgaben sollen Ihnen die Vorlesungsinhalte durch Projekte näherbringen und sind nicht Teil der Prüfung.

Gewünscht ist eine grafische Oberfläche, die es ermöglicht, eine Distanzangabe in mindestens zwei verschiedenen Einheiten (z. B. Kilometer und Meilen) darzustellen und zu ändern. Wird dabei eine Ansicht geändert, so sollen die jeweils anderen automatisch entsprechend aktualisiert werden.

Aufgabenstellung

Setzen Sie folgende Aufgaben unter Einhaltung des MVC-Patterns um. Verwenden Sie das Observer-Pattern für die Kommunikation zwischen den Komponenten. Achten Sie darauf, dass der Kern des Programms völlig unabhängig von der GUI ist. Der Kern des Programms sollte vollständig unabhängig von der GUI sein, sodass keine Änderungen am Kern erforderlich sind, wenn die GUI ausgetauscht oder mehrere GUIs gleichzeitig verwendet werden.

  1. Identifizieren Sie geeignete Klassen und modellieren Sie ein UML-Klassendiagramm.
  2. Implementieren Sie die Applikation in Java.
    Für die grafischen Oberflächen empfiehlt sich das Java Swing Framework.

K Architektur

a) Beschreiben Sie den Kommunikationsablauf zwischen den Komponenten im MVC-Muster, nachdem ein Nutzer Daten in der View geändert hat.

  • Ablauf: Die View nimmt Benutzereingaben auf und sendet sie an den Controller. Der Controller aktualisiert das Model, und das Model informiert die View über die Änderungen zur Anzeigeaktualisierung.

b) In einem Unix-ähnlichen System gibt es eine Reihe an Programmen und Tools, die alle eine ganz bestimmte Aufgabe erfüllen. Mit dem besonderen |-Operator können die Ausgaben von einem Programm an ein anderes in Textform weitergeleitet werden.

i) Wie nennt sich diese Architektur?

  • Die Architektur wird als Pipes-und-Filters-Architektur bezeichnet.

ii) Nennen Sie einen Vorteil dieser Architektur in diesem Kontext.

  • Ein Vorteil ist die Modularität, die eine einfache Wiederverwendung und Kombination von Programmen ermöglicht.

iii) Nennen Sie einen Nachteil dieser Architektur in diesem Kontext.

  • Potenzielle Ineffizienz durch das Verarbeiten großer Datenmengen in Textform.

c) Beschriften Sie die folgende Skizze so, dass sie die konzeptionelle Sicht der Client-Server-Architektur darstellt:

[ ] <---> [ ] <---> [ ]
graph LR
Client <--> Server
Server <--> Internet