Werbung

Nach der Analysephase wird das konzeptionelle Modell mit Hilfe von Object Oriented Design (OOD) zu einem objektorientierten Modell weiterentwickelt. Bei OOD werden die technologieunabhängigen Konzepte des Analysemodells auf implementierende Klassen abgebildet, Constraints identifiziert und Schnittstellen entworfen, so dass ein Modell für die Lösungsdomäne entsteht. Kurz und bündig, wird eine detaillierte Beschreibung erstellt, die angibt, wie das System auf konkreten Technologien aufgebaut werden soll

Die Phasen für objektorientiertes Design können wie folgt identifiziert werden –

  • Definition des Kontextes des Systems
  • Entwurf der Systemarchitektur
  • Identifikation der Objekte im System
  • Konstruktion von Entwurfsmodellen
  • Spezifizierung von Objektschnittstellen

Systementwurf

Objekt-orientiertes Systemdesign beinhaltet die Definition des Kontextes eines Systems, gefolgt vom Entwurf der Architektur des Systems.

  • Kontext – Der Kontext eines Systems hat einen statischen und einen dynamischen Teil. Der statische Kontext des Systems wird mit Hilfe eines einfachen Blockdiagramms des gesamten Systems entworfen, das zu einer Hierarchie von Subsystemen erweitert wird. Das Subsystemmodell wird durch UML-Pakete dargestellt. Der dynamische Kontext beschreibt, wie das System mit seiner Umgebung interagiert. Er wird mit Hilfe von Use-Case-Diagrammen modelliert.

  • Systemarchitektur – Die Systemarchitektur wird auf der Grundlage des Systemkontextes in Übereinstimmung mit den Grundsätzen des Architekturentwurfs und dem Domänenwissen entworfen. Typischerweise wird ein System in Schichten aufgeteilt, und jede Schicht wird in Teilsysteme zerlegt.

Objektorientierte Zerlegung

Die Zerlegung bedeutet die Aufteilung eines großen komplexen Systems in eine Hierarchie kleinerer Komponenten mit geringerer Komplexität nach dem Prinzip des „Teile und Herrsche“. Jede Hauptkomponente des Systems wird als Subsystem bezeichnet. Die objektorientierte Dekomposition identifiziert einzelne autonome Objekte in einem System und die Kommunikation zwischen diesen Objekten.

Die Vorteile der Dekomposition sind –

  • Die einzelnen Komponenten sind von geringerer Komplexität und damit verständlicher und überschaubarer.

  • Sie ermöglicht die Aufteilung von Arbeitskräften mit speziellen Fähigkeiten.

  • Sie ermöglicht es, Teilsysteme zu ersetzen oder zu ändern, ohne andere Teilsysteme zu beeinträchtigen.

Identifizierung der Gleichzeitigkeit

Gleichzeitigkeit ermöglicht es, dass mehr als ein Objekt gleichzeitig Ereignisse empfängt und mehr als eine Aktivität gleichzeitig ausgeführt wird. Gleichzeitigkeit wird im dynamischen Modell identifiziert und dargestellt.

Um Gleichzeitigkeit zu ermöglichen, wird jedem gleichzeitigen Element ein eigener Kontrollfaden zugewiesen. Befindet sich die Gleichzeitigkeit auf Objektebene, so werden zwei konkurrierenden Objekten zwei verschiedene Threads der Kontrolle zugewiesen. Wenn zwei Operationen eines einzelnen Objekts gleichzeitig ablaufen, wird dieses Objekt auf verschiedene Threads aufgeteilt.

Gleichzeitigkeit ist mit den Problemen der Datenintegrität, der Blockierung und des Aushungerns verbunden. Es muss also eine klare Strategie entwickelt werden, wenn Gleichzeitigkeit erforderlich ist. Außerdem muss die Gleichzeitigkeit bereits in der Entwurfsphase identifiziert werden und kann nicht erst in der Implementierungsphase berücksichtigt werden.

Identifizierung von Mustern

Beim Entwurf von Anwendungen werden einige allgemein akzeptierte Lösungen für bestimmte Problemkategorien übernommen. Dies sind die Entwurfsmuster. Ein Muster kann als ein dokumentierter Satz von Bausteinen definiert werden, die bei bestimmten Arten von Problemen der Anwendungsentwicklung verwendet werden können.

Einige häufig verwendete Entwurfsmuster sind –

  • Fassadenmuster
  • Model-View-Trennungsmuster
  • Observermuster
  • Model-View-Controller-Muster
  • Publish-Subscribe-Muster
  • Proxy-Muster

Ereigniskontrolle

Beim Systementwurf, müssen die Ereignisse, die in den Objekten des Systems auftreten können, identifiziert und angemessen behandelt werden.

Ein Ereignis ist eine Spezifikation eines signifikanten Ereignisses, das einen Ort in Zeit und Raum hat.

Es gibt vier Arten von Ereignissen, die modelliert werden können, nämlich –

  • Signalereignis – Ein benanntes Objekt, das von einem Objekt ausgelöst und von einem anderen Objekt aufgefangen wird.

  • Aufrufereignis – Ein synchrones Ereignis, das den Versand einer Operation darstellt.

  • Zeitereignis – Ein Ereignis, das den Ablauf der Zeit repräsentiert.

  • Änderungsereignis – Ein Ereignis, das eine Zustandsänderung repräsentiert.

Behandlung von Randbedingungen

Die Systementwurfsphase muss die Initialisierung und die Beendigung des Systems als Ganzes sowie jedes Teilsystems behandeln. Die verschiedenen Aspekte, die dokumentiert werden, sind folgende: –

  • Das Starten des Systems, d.h. der Übergang des Systems vom nicht-initialisierten Zustand zum stabilen Zustand.

  • Das Beenden des Systems, d.h.,

  • Die anfängliche Konfiguration des Systems und die Rekonfiguration des Systems bei Bedarf.

  • Die Vorhersage von Fehlern oder unerwünschter Beendigung des Systems.

Randbedingungen werden mit Hilfe von Boundary Use Cases modelliert.

Objektdesign

Nachdem die Hierarchie der Subsysteme entwickelt wurde, werden die Objekte im System identifiziert und ihre Details entworfen. Hier legt der Designer die während des Systementwurfs gewählte Strategie im Detail dar. Der Schwerpunkt verlagert sich von den Konzepten des Anwendungsbereichs zu den Konzepten des Computers. Die während der Analyse identifizierten Objekte werden für die Implementierung herausgearbeitet, mit dem Ziel, die Ausführungszeit, den Speicherverbrauch und die Gesamtkosten zu minimieren.

Der Objektentwurf umfasst die folgenden Phasen –

  • Objektidentifikation
  • Objektdarstellung, d.h., Konstruktion von Entwurfsmodellen
  • Klassifizierung von Operationen
  • Entwurf von Algorithmen
  • Entwurf von Beziehungen
  • Implementierung der Steuerung für externe Interaktionen
  • Paketierung von Klassen und Assoziationen in Module

Objektidentifikation

Der erste Schritt des Objektentwurfs ist die Objektidentifikation. Die in den objektorientierten Analysephasen identifizierten Objekte werden in Klassen gruppiert und so verfeinert, daß sie für die tatsächliche Implementierung geeignet sind.

Die Funktionen dieser Phase sind –

  • Identifizierung und Verfeinerung der Klassen in jedem Teilsystem oder Paket

  • Definition der Verbindungen und Assoziationen zwischen den Klassen

  • Design der hierarchischen Assoziationen zwischen den Klassen, d.h., Generalisierung/Spezialisierung und Vererbung

  • Entwerfen von Aggregationen

Objektdarstellung

Wenn die Klassen identifiziert sind, müssen sie mit Hilfe von Objektmodellierungstechniken dargestellt werden. In dieser Phase werden im Wesentlichen UML-Diagramme erstellt.

Es gibt zwei Arten von Entwurfsmodellen, die erstellt werden müssen –

  • Statische Modelle – Zur Beschreibung der statischen Struktur eines Systems werden Klassendiagramme und Objektdiagramme verwendet.

  • Dynamische Modelle – Zur Beschreibung der dynamischen Struktur eines Systems und zur Darstellung der Interaktion zwischen Klassen unter Verwendung von Interaktionsdiagrammen und Zustandsdiagrammen.

Klassifizierung von Operationen

In diesem Schritt werden die an Objekten durchzuführenden Operationen definiert, indem die drei in der OOA-Phase entwickelten Modelle, nämlich das Objektmodell, das dynamische Modell und das funktionale Modell, kombiniert werden. Eine Operation gibt an, was zu tun ist, aber nicht, wie es zu tun ist.

In Bezug auf Operationen werden folgende Aufgaben durchgeführt: –

  • Das Zustandsübergangsdiagramm jedes Objekts im System wird entwickelt.

  • Operationen werden für die von den Objekten empfangenen Ereignisse definiert.

  • Fälle, in denen ein Ereignis andere Ereignisse in gleichen oder verschiedenen Objekten auslöst, werden identifiziert.

  • Die Unteroperationen innerhalb der Aktionen werden identifiziert.

  • Die Hauptaktionen werden zu Datenflußdiagrammen erweitert.

Algorithmusentwurf

Die Operationen in den Objekten werden durch Algorithmen definiert. Ein Algorithmus ist ein schrittweises Verfahren, das das in einer Operation festgelegte Problem löst. Algorithmen konzentrieren sich auf die Art und Weise, wie die Aufgabe zu lösen ist.

Es kann mehr als einen Algorithmus für eine bestimmte Operation geben. Sobald die alternativen Algorithmen identifiziert sind, wird der optimale Algorithmus für den gegebenen Problembereich ausgewählt. Die Metriken für die Auswahl des optimalen Algorithmus sind –

  • Rechenkomplexität – Die Komplexität bestimmt die Effizienz eines Algorithmus in Bezug auf die Rechenzeit und den Speicherbedarf.

  • Flexibilität – Die Flexibilität bestimmt, ob der gewählte Algorithmus in geeigneter Weise implementiert werden kann, ohne dass er in verschiedenen Umgebungen seine Angemessenheit verliert.

  • Verständlichkeit – Dies bestimmt, ob der gewählte Algorithmus leicht zu verstehen und zu implementieren ist.

Entwurf von Beziehungen

Die Strategie zur Implementierung der Beziehungen muss während der Objektentwurfsphase festgelegt werden. Die wichtigsten Beziehungen, die angesprochen werden, umfassen Assoziationen, Aggregationen und Vererbungen.

Der Designer sollte in Bezug auf Assoziationen Folgendes tun: –

  • Entscheiden, ob eine Assoziation unidirektional oder bidirektional ist.

  • Analysieren Sie den Pfad der Assoziationen und aktualisieren Sie sie gegebenenfalls.

  • Implementieren Sie die Assoziationen als eigenständiges Objekt im Falle von Many-to-Many-Beziehungen oder als Link zu einem anderen Objekt im Falle von One-to-One- oder One-to-Many-Beziehungen.

In Bezug auf Vererbungen sollte der Designer folgendes tun –

  • Anpassen der Klassen und ihrer Assoziationen.

  • Identifizieren Sie abstrakte Klassen.

  • Vorkehrungen treffen, damit Verhaltensweisen bei Bedarf gemeinsam genutzt werden.

Implementierung der Kontrolle

Der Objektdesigner kann Verfeinerungen in die Strategie des Zustandsdiagramm-Modells einbauen. Beim Systementwurf wird eine grundlegende Strategie für die Realisierung des dynamischen Modells festgelegt. Während des Objektentwurfs wird diese Strategie für eine geeignete Implementierung verfeinert.

Die Ansätze für die Implementierung des dynamischen Modells sind –

  • Zustand als Ort innerhalb eines Programms darstellen – Dies ist der traditionelle prozedurgesteuerte Ansatz, bei dem der Ort der Steuerung den Programmzustand definiert. Ein endlicher Zustandsautomat kann als Programm implementiert werden. Eine Transition bildet eine Eingabeanweisung, der Hauptkontrollpfad bildet die Befehlsfolge, die Verzweigungen bilden die Bedingungen und die Rückwärtspfade bilden die Schleifen oder Iterationen.

  • Zustandsautomaten-Engine – Bei diesem Ansatz wird ein Zustandsautomat direkt durch eine Zustandsautomaten-Engine-Klasse dargestellt. Diese Klasse führt den Zustandsautomaten durch eine Reihe von Übergängen und Aktionen aus, die von der Anwendung bereitgestellt werden.

  • Steuerung als konkurrierende Tasks – Bei diesem Ansatz wird ein Objekt als Task in der Programmiersprache oder dem Betriebssystem implementiert. Hier wird ein Ereignis als ein Inter-Task-Aufruf implementiert. Dadurch wird die inhärente Gleichzeitigkeit realer Objekte bewahrt.

Paketierung von Klassen

In jedem großen Projekt ist eine sorgfältige Aufteilung einer Implementierung in Module oder Pakete wichtig. Während des Objektdesigns werden Klassen und Objekte in Pakete gruppiert, um es mehreren Gruppen zu ermöglichen, gemeinsam an einem Projekt zu arbeiten.

Die verschiedenen Aspekte der Paketierung sind –

  • Verstecken interner Informationen vor der Außenwelt – Es ermöglicht, eine Klasse als „Black Box“ zu betrachten und erlaubt es, die Klassenimplementierung zu ändern, ohne dass die Clients der Klasse den Code ändern müssen.

  • Kohärenz der Elemente – Ein Element, wie z.B. eine Klasse, eine Operation oder ein Modul, ist kohärent, wenn es nach einem konsistenten Plan organisiert ist und alle seine Teile intrinsisch miteinander verbunden sind, so dass sie einem gemeinsamen Ziel dienen.

  • Konstruktion von physischen Modulen – Die folgenden Richtlinien helfen bei der Konstruktion von physischen Modulen –

    • Klassen in einem Modul sollten ähnliche Dinge oder Komponenten in demselben zusammengesetzten Objekt darstellen.

    • Klassen, die eng miteinander verbunden sind, sollten sich im selben Modul befinden.

    • Unverbundene oder schwach verbundene Klassen sollten in separaten Modulen untergebracht werden.

    • Module sollten eine gute Kohäsion aufweisen, d.h.,

    • Ein Modul sollte eine geringe Kopplung mit anderen Modulen aufweisen, d.h. die Interaktion oder gegenseitige Abhängigkeit zwischen Modulen sollte minimal sein.

Entwurfsoptimierung

Das Analysemodell erfasst die logischen Informationen über das System, während das Entwurfsmodell Details hinzufügt, um einen effizienten Informationszugang zu unterstützen. Bevor ein Entwurf implementiert wird, sollte er optimiert werden, um die Implementierung effizienter zu gestalten. Ziel der Optimierung ist es, die Kosten in Bezug auf Zeit, Platz und andere Metriken zu minimieren.

Die Optimierung des Entwurfs sollte jedoch nicht übertrieben sein, da die einfache Implementierung, die Wartbarkeit und die Erweiterbarkeit ebenfalls wichtige Aspekte sind. Es wird oft festgestellt, dass ein perfekt optimiertes Design zwar effizienter, aber weniger lesbar und wiederverwendbar ist. Der Designer muss also ein Gleichgewicht zwischen diesen beiden Aspekten finden.

Die verschiedenen Dinge, die für die Entwurfsoptimierung getan werden können, sind –

  • Redundante Assoziationen hinzufügen
  • Nicht verwendbare Assoziationen weglassen
  • Optimierung von Algorithmen
  • Abgeleitete Attribute speichern, um die Neuberechnung komplexer Ausdrücke zu vermeiden

Hinzufügen von redundanten Assoziationen

Während der Entwurfsoptimierung, wird geprüft, ob die Ableitung neuer Assoziationen die Zugriffskosten verringern kann. Auch wenn diese redundanten Assoziationen keine zusätzlichen Informationen enthalten, können sie die Effizienz des Gesamtmodells erhöhen.

Auslassung von nicht verwendbaren Assoziationen

Das Vorhandensein zu vieler Assoziationen kann ein System unentzifferbar machen und somit die Gesamteffizienz des Systems verringern. Daher werden bei der Optimierung alle nicht verwendbaren Assoziationen entfernt.

Optimierung von Algorithmen

In objektorientierten Systemen erfolgt die Optimierung der Datenstruktur und der Algorithmen in einer kooperativen Weise. Sobald der Klassenentwurf steht, müssen die Operationen und die Algorithmen optimiert werden.

Die Optimierung von Algorithmen erfolgt durch –

  • Umstellung der Reihenfolge der Rechenaufgaben
  • Umkehrung der Ausführungsreihenfolge von Schleifen gegenüber der im Funktionsmodell festgelegten
  • Entfernen von toten Pfaden innerhalb des Algorithmus

Speichern und Abspeichern von abgeleiteten Attributen

Abgeleitete Attribute sind solche, deren Werte in Abhängigkeit von anderen Attributen (Basisattributen) berechnet werden. Die Werte abgeleiteter Attribute müssen jedes Mal neu berechnet werden, wenn sie benötigt werden, was sehr zeitaufwendig ist. Um dies zu vermeiden, können die Werte berechnet und in ihrer berechneten Form gespeichert werden.

Dies kann jedoch zu Aktualisierungsanomalien führen, d.h. zu einer Änderung der Werte der Basisattribute ohne entsprechende Änderung der Werte der abgeleiteten Attribute. Um dies zu vermeiden, werden folgende Schritte unternommen:

  • Bei jeder Aktualisierung des Wertes des Basisattributs wird auch das abgeleitete Attribut neu berechnet.

  • Alle abgeleiteten Attribute werden neu berechnet und regelmäßig in einer Gruppe und nicht nach jeder Aktualisierung aktualisiert.

Entwurfsdokumentation

Dokumentation ist ein wesentlicher Bestandteil jedes Softwareentwicklungsprozesses, der die Vorgehensweise bei der Erstellung der Software festhält. Die Designentscheidungen müssen für jedes nicht-triviale Softwaresystem dokumentiert werden, um das Design an andere weiterzugeben.

Anwendungsbereiche

Obwohl ein Nebenprodukt, ist eine gute Dokumentation unerlässlich,

  • Bei der Gestaltung von Software, die von mehreren Entwicklern entwickelt wird
  • Bei iterativen Softwareentwicklungsstrategien
  • Bei der Entwicklung von Folgeversionen eines Softwareprojekts
  • Bei der Evaluierung einer Software
  • Bei der Ermittlung von Bedingungen und Testbereichen
  • Bei der Wartung der Software.

Inhalt

Eine nützliche Dokumentation sollte im Wesentlichen folgende Inhalte enthalten –

  • Systemarchitektur auf hoher Ebene – Prozessdiagramme und Moduldiagramme

  • Schlüsselabstraktionen und Mechanismen – Klassendiagramme und Objektdiagramme.

  • Szenarien, die das Verhalten der Hauptaspekte veranschaulichen – Verhaltensdiagramme

Merkmale

Die Merkmale einer guten Dokumentation sind –

  • Klar und gleichzeitig eindeutig, konsistent und vollständig

  • Rückführbar auf die Anforderungsspezifikationen des Systems

  • Gut strukturiert

  • Diagrammatisch statt deskriptiv

Anmerkungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.