cd Blatt 7

Objektorientierter Entwurf mit UML

Diskutiert die Entwicklung von objektorientierten Systemen, welche eigenständige Objekte umfassen, die ihren lokalen Zustand verwalten und manipulieren. Es wird die Bedeutung von Klassen, Objektinteraktionen und der privaten Zustandsdarstellung betont.

  • Grundlagen des Entwurfs

    • Systemgestaltung: Der Entwurf konzentriert sich auf die Strukturierung von Objektklassen und ihre Beziehungen sowie auf die Definition der Systemarchitektur und das Erkennen wichtiger Systemkomponenten.
      Beispiel: Entwicklung spezifischer Klassen für eine Wildnis-Wetterstation.
    • Entwurfsprozess: Ein kreativer, adaptiver Prozess, der Ideenentwicklung, das Vorschlagen und Verfeinern von Lösungen umfasst.
      Beispiel: Iterative Anpassungen im Entwurf bei neuen Herausforderungen.
  • Systemkontext und Interaktionen

    • Beziehungsverständnis: Ein tieferes Verständnis für die Beziehungen der Software zur Umgebung, einschließlich Systemgrenzen und -interaktionen.
      Beispiel: Entscheidungsfindung über Systemfunktionalitäten und strukturelle Aspekte.
  • Entwurf der Architektur

    • Grundlagenarchitektur: Die Architekturgestaltung nutzt die definierten Interaktionen mit der Systemumgebung, um eine solide Struktur und klare Komponentenbeziehungen zu schaffen.
      Beispiel: Integration von Interaktionsmustern in die Architekturplanung.
  • Bestimmung der Objektklassen

    • Ideenentwicklung: Frühe Phase des Entwurfs, in der Schlüsselobjekte des Systems durch Analyse der Anforderungen und Anwendungsfälle bestimmt werden.
      Beispiel: Identifizierung spezifischer Objektklassen für die Wetterstationssoftware.
  • Entwurfsmodelle

    • Modellfunktion: Verwendung von Entwurfsmodellen, um die Beziehungen zwischen Objektklassen und die Systemdynamik darzustellen, was die Umsetzung von Anforderungen in die Implementierung erleichtert.
      Beispiel: Anwendung unterschiedlicher UML-Modelle für strukturelle und dynamische Aspekte des Systems.
  • Schnittstellenspezifikation

    • Schnittstellenbedeutung: Definition klarer Schnittstellen als Grundlage für die parallele Entwicklung von Objekten und Subsystemen.
      Beispiel: Zuverlässige Schnittstellen für eine effiziente Systemintegration.
  • Kurz gefasst: Die Grundlagen des Entwurfs beinhalten die Entwicklung von Objektklassen und deren Beziehungen, sowie die Gestaltung der Systemarchitektur. Der kreative und dynamische Entwurfsprozess nutzt Werkzeuge wie UML und passt sich spezifischen Anwendungsbereichen an. Wichtig sind auch die Definition von Systemkontext und Schnittstellenspezifikationen, um eine funktionale und wartbare Architektur zu schaffen, die alle Anforderungen erfüllt.

Entwurfsmuster im Softwareentwurf

Entwurfsmuster sind grundlegende Bausteine im objektorientierten Softwareentwurf, abgeleitet aus allgemeinen Lösungsansätzen für wiederkehrende Probleme. Sie bieten eine strukturierte Herangehensweise, um Erfahrungen und bewährte Praktiken effektiv zu nutzen und zu teilen.

  • Kernkonzepte von Entwurfsmustern

    • Musterstruktur: Jedes Muster besteht aus einem Namen, einer Problem- und Lösungsbeschreibung sowie den Konsequenzen der Anwendung.
      Beispiel: Das "Beobachter"-Muster für verschiedene Objektzustandsdarstellungen.
    • Anwendbarkeit: Muster sind anwendbar in spezifischen Kontexten und bieten eine flexible Lösungsschablone.
      Beispiel: Einsatz des "Fassade"-Musters zur Vereinfachung von Schnittstellen.
  • Kategorien von Entwurfsmustern

    • Erzeugungsmuster (Creational Patterns): Konzentrieren sich auf die Objekterzeugung und -initialisierung. Sie kapseln das Wissen über welche Klassen das System verwendet.
      Beispiel: Das "Singleton"-Muster, das sicherstellt, dass eine Klasse nur ein einziges Exemplar hat und dieses global zugänglich ist.
      1. + Verhindert Mehrfachinstanzen und spart Ressourcen.
      2. + Einfacher globaler Zugriff.
      3. - Kann zu Problemen in Mehrfaden-Umgebungen führen.
      4. - Erschwert das Testen.
    • Strukturmuster (Structural Patterns): Betreffen die Zusammensetzung von Klassen oder Objekten.
      Beispiel: Das "Adapter"-Muster, das die Schnittstelle einer Klasse in eine andere erwartete Schnittstelle umwandelt, damit unvereinbare Klassen zusammenarbeiten können.
      1. + Fördert die Wiederverwendung bestehender Code-Basen.
      2. + Erleichtert die Kommunikation zwischen Systemen.
      3. - Kann das Gesamtsystem komplexer machen.
      4. - Overhead durch zusätzliche Wrapper-Klassen.
    • Verhaltensmuster (Behavioral Patterns): Behandeln effektive Kommunikation und die Zuweisung von Verantwortlichkeiten zwischen Objekten.
      Beispiel: Das "Beobachter"-Muster, das eine Eins-zu-viele-Abhängigkeit zwischen Objekten definiert, sodass, wenn ein Objekt seinen Zustand ändert, alle abhängigen Objekte automatisch benachrichtigt und aktualisiert werden.
      1. + Ermöglicht dynamische Beziehungen zwischen Objekten.
      2. + Reduziert Kopplung zwischen Klassen.
      3. - Kann zu ineffizienter Benachrichtigungslogik führen.
      4. - Schwierigkeiten bei der Verwaltung von Abonnements in dynamischen Systemen.
  • Bedeutung im Entwurfsprozess

    • Wissensübertragung: Muster erleichtern die Weitergabe von Erfahrungen und optimierten Lösungen.
      Beispiel: Anwendung des "Iterator"-Musters für eine einheitliche Zugriffsmethode auf Elemente.
  • Kurz gesagt: Entwurfsmuster im Softwareentwurf sind eine Sammlung bewährter Lösungsansätze für häufig auftretende Probleme. Sie dienen als eine Art Vorlage, die in verschiedenen Kontexten angepasst werden kann, und umfassen Elemente wie Problembeschreibung, Lösungsmuster und Konsequenzen der Anwendung. Diese Muster helfen dabei, das Design effizienter und wiederverwendbarer zu gestalten und bieten ein gemeinsames Vokabular zur Diskussion und zum Austausch von Entwurfsstrategien.

Implementierungsaspekte im Softwareentwurf

Implementierungsaspekte im Softwareentwurf fokussieren auf die effiziente Umsetzung von Softwarelösungen, unter Berücksichtigung der Wiederverwendung, Konfigurationsverwaltung und Host-Ziel-Entwicklung.

  • Implementierungsaspekte

    • Software Engineering: Umfasst sämtliche Phasen der Softwareentwicklung, einschließlich der Wartung und Verwaltung installierter Systeme.
      Beispiel: Umsetzung der Software von der Anforderungserhebung bis zur Implementierung.
  • Wiederverwendung

    • Effizienz: Wiederverwendung existierender Code-Basis reduziert Entwicklungskosten und Zeit.
      Beispiel: Einsatz von Softwarebibliotheken und Frameworks.
  • Konfigurationsverwaltung

    • Änderungsmanagement: Kontrolle und Verwaltung von Softwareversionen, Integration und Fehlerbehebung.
      Beispiel: Einsatz von Versionskontrollsystemen und Issue-Tracking-Tools.
  • Host-Ziel Entwicklung

    • Plattformmanagement: Entwicklung auf einer Plattform (Host) und Ausführung auf einer anderen (Ziel).
      Beispiel: Entwicklung von Embedded Software mit separaten Test- und Produktionsumgebungen.

Open-Source-Lizenzierung

Open-Source-Lizenzierung definiert, wie Software frei geteilt, modifiziert und genutzt werden kann, unter bestimmten Bedingungen, die durch verschiedene Lizenzmodelle vorgegeben sind, um die Freiheit der Software und die Rechte der Entwickler zu schützen.

  • Grundprinzipien

    • Frei verfügbarer Quellcode: Open-Source bedeutet Zugang zum Quellcode, jedoch mit bestimmten Nutzungseinschränkungen gemäß der Lizenz.
      Beispiel: GPL-lizenzierte Software muss ebenfalls als Open-Source veröffentlicht werden.
  • Lizenzmodelle

    • GPL und LGPL: GPL erfordert, dass abgeleitete Werke ebenfalls Open-Source sind, während LGPL flexiblere Einsatzmöglichkeiten bietet.
      Beispiel: Nutzung von LGPL-Komponenten in sonst proprietärer Software.
    • BSD und MIT-Lizenz: Ermöglichen die Integration in proprietäre Software ohne die Pflicht, den Quellcode offenzulegen.
      Beispiel: Einbetten von BSD-lizenziertem Code in kommerzielle Produkte.
  • Empfohlene Vorgehensweisen

    • Dokumentation und Lizenzmanagement: Erstellen Sie ein System zur Dokumentation der genutzten Open-Source-Komponenten und ihrer Lizenzbedingungen.
      Ziel: Transparenz und Rechtskonformität.
    • Lizenzbewusstsein: Informieren und schulen Sie Ihr Team bezüglich der verschiedenen Lizenzmodelle und deren Auswirkungen.
      Ziel: Bewusster und verantwortungsvoller Einsatz von Open-Source-Software.
    • Entwicklungsbegleitung: Beobachten Sie die Entwicklung und Zukunftspläne der genutzten Open-Source-Projekte.
      Ziel: Langfristige Planungssicherheit und Einsatzstabilität.
    • Audit- und Compliance-Systeme: Implementieren Sie Systeme zur Überwachung und Sicherstellung der Lizenzkonformität.
      Ziel: Vermeidung rechtlicher Risiken.
    • Engagement in der Open-Source-Gemeinschaft: Engagieren Sie sich aktiv in der Open-Source-Gemeinde, um die Entwicklung zu unterstützen.
      Ziel: Beitrag zum Ökosystem und Förderung der Nachhaltigkeit.
  • Kurz gesagt: Open-Source-Lizenzierung bietet einen Rahmen, innerhalb dessen Softwareentwickler und -nutzer frei mit dem Quellcode arbeiten können. Dabei müssen sie die rechtlichen Bedingungen beachten, die je nach Lizenzmodell unterschiedliche Verpflichtungen und Freiheiten mit sich bringen. Diese Regelungen fördern die Verbreitung und Weiterentwicklung von Open-Source-Software, während sie gleichzeitig die Urheberrechte schützen.

Zusammenfassung

  • Objektorientierter Entwurf und UML

    Betont die Wichtigkeit von Klassen, Objektinteraktionen und der Systemarchitektur, unterstützt durch UML als Werkzeug für die Visualisierung und Strukturierung.

  • Entwurfsmuster

    Bietet wiederverwendbare Lösungen für gängige Softwareentwurfsprobleme, fördert effizientes Design und ein gemeinsames Vokabular zur Diskussion von Entwurfsstrategien.

  • Implementierungsaspekte

    Umfasst Wiederverwendung von Code, Konfigurationsverwaltung und Host-Ziel Entwicklung, um effiziente und wartbare Softwarelösungen zu schaffen.

  • Open-Source-Lizenzierung

    Erklärt die Bedeutung von Lizenzmodellen wie GPL, LGPL, BSD und MIT für die Nutzung und Weitergabe von Software, unterstreicht die Notwendigkeit der Lizenzkonformität.

  • Zusammenfassend decken diese Aspekte grundlegende Prinzipien des modernen Softwareentwurfs ab, von der Konzeption bis zur Lizenzierung, und betonen die Bedeutung einer durchdachten Planung, Entwurfsmuster und rechtlicher Überlegungen für die Entwicklung nachhaltiger Softwarelösungen.

1 Entwurfsmuster

  1. Beantworten Sie kurz und bündig folgende Fragen!

    • Welche Vorteile ergeben sich durch den Einsatz eines Entwurfsmusters?
      • Wiederverwendung von erprobten Lösungen
      • Qualität (Verständlichkeit, Wartbarkeit)
      • Kostenerspanis
    • Entwurfsmuster werden in drei Kategorien unterteilt. Nennen Sie die Kategorien sowie jeweils ein passendes Entwurfsmuster
      • Creational:  Singleton - stellt sicher, dass eine Klasse nur ein Exemplar hat und bietet einen globalen Zugriffspunkt darauf.
      • Structural:  Adapter - ermöglicht das Zusammenarbeiten von Klassen mit inkompatiblen Schnittstellen, indem es die Schnittstelle einer Klasse in eine andere Schnittstelle übersetzt.
      • Behavioural:  Observer - definiert eine Abhängigkeit zwischen Objekten, sodass, wenn ein Objekt seinen Zustand ändert, alle abhängigen Objekte darüber benachrichtigt und automatisch aktualisiert werden.
    • Manche Entwurfsmuster werden oftmals miteinander kombiniert und arbeiten zusammen. Geben Sie hierfür zwei Beispiele an und erklären diese kurz.
      • Behavioural + Structural:  Visitor + Composite
        • Ermöglicht, verschiedene Operationen auf einer Objektstruktur durchzuführen, ohne die Objekte selbst zu ändern. Besonders nützlich, wenn man mit vielen Arten von Objekten arbeitet und je nach Objekttyp unterschiedliche Aktionen ausführen möchte.
      • Behavioural:  Iterator + Composite
        • Vereinfacht den Zugriff und die Durchquerung von komplexen Strukturen. Mit dem Iterator kann man durch alle Elemente einer Struktur gehen, wie durch eine einfache Liste, was die Arbeit mit zusammengesetzten Strukturen wie Bäumen erleichtert.

2 Entwurf von Klassenhierarchien

  1. Wir betrachten in dieser Aufgabe Terme über die Rechenarten op ∈ {+, −, ·, / } , die rekursiv definiert sind:
    • jedes Literal ist ein Term, z.B. „4“
    • ist t ein Term, so ist „(t)“ ein (geklammerter) Term.
    • sind t1, t2 Terme, so ist „t1 op t2“ ebenso ein Term.
    • → Beispiele für gültige Terme sind also „4 + 8“, „4 · 8“ oder „4 + (4 · 8)“.

    a) Modellieren Sie eine Klassenstruktur in UML, mit Hilfe derer eine rekursive Struktur von Termen erstellt werden kann. Sehen Sie mindestens einzelne Klassen für die Addition und Multiplikation vor, sowie weitere Klassen für geklammerte Terme und Literale, welche ganze Zahlen repräsentieren. Welches Entwurfsmuster eignet sich hier am Besten?

    b) Zeichnen Sie das UML-Klassendiagramm.

U Decorator

  1. Modellieren Sie folgenden Sakchverhalt als UML-Klassendiagramm. Gehen Sie dabei davon aus, dass für die Implementierung Java zu benutzen wäre. Sie müssen jedoch keine Implementierung erstellen, sondern nur das UML-Klassendiagramm. Sie werden feststellen, dass ein naiver Ansatz problematisch ist. Besser ist es, auf ein passendes Entwurfsmuster zurückzugreifen. Welches Entwurfsmuster wäre hierfür geeignet
    • einfache Fenster ohne Zusatzfunktionalität
    • Fenster, die eine Titelleiste haben
    • • Fenster, die eine Statusleiste haben
    • Fenster, die horizontal und vertikal „scrollbar“sind
    • alle daraus konstruierbaren „Featurekombinationen“, wie z.B. ein Fenster mit Titelleiste das horizontal und vertikal „scrollbar“ist

    a) Modellieren Sie eine Klassenstruktur in UML, mit Hilfe derer eine rekursive Struktur von Termen erstellt werden kann. Sehen Sie mindestens einzelne Klassen für die Addition und Multiplikation vor, sowie weitere Klassen für geklammerte Terme und Literale, welche ganze Zahlen repräsentieren. Welches Entwurfsmuster eignet sich hier am Besten?

    b) Zeichnen Sie das UML-Klassendiagramm.

U Visitor Pattern

  1. In dieser Aufgabe sollen Sie das Visitor-Pattern anwenden. Wir möchten dabei einen Visitor für die Klassenstruktur aus Aufgabe 2 implementieren.

    Es soll möglich sein, Terme auf der Konsole auszugeben oder deren Wert zu berechnen.


    a) Erweitern Sie das Klassendiagramm aus Aufgabe ?? um die Klasse Visitor
    Visitor UML
    b) Fertigen Sie eine Implementierung für diese Klassenstruktur an, welche die oben genannten Terme anlegt und über die Visitor-Klassen ausgibt bzw. den Wert berechnet. (Lösung siehe moodle)

K Entwurfsmuster

  1. a) Stellen Sie das Beobachter Entwurfsmuster (Observer-Pattern) in einem UML Klassendiagramm dar (inkl. wichtige Methoden aber ohne deren Inhalt, sowie ohne Multiplizitäten und Rollennamen). Abstrakte Klassen können Sie ggf. mit (abstract) unter dem Klassennamen markieren.