kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung

19.2 Objektorientierter Programmentwurf mit UML

Bei diesem Ansatz teilt man das Problem in die relevanten Objekte auf. In diesem Fall wären das das Werkstück und die Rechtecke, in denen das Werkstück aufgeteilt ist. Ferner kann man sich in dieser abstrahierten Sichtweise die Rechtecke als aus vier Eckpunkten bestehend vorstellen. Letztere könnten durch Objekte vom Typ Vektor definiert werden, wenn man sie als Ortsvektoren auffasst.

Man hat hier ein eingängiges Beispiel für ein Aggregat vor sich: Das Werkstück-Objekt enthält fünf Rechteckobjekte und diese jeweils vier Vektor-Objekte.

Während ein Rechteck immer vier Vektoren enthält, kann man sich vorstellen, dass ein Werkstück allgemein auch mehr oder weniger als fünf Rechtecke enthalten kann. Dem wollen wir in dem Programm Rechnung tragen, indem wir für Werkstück-Objekte die Registrierung von bis zu 100 Rechteckobjekten ermöglichen.

Zur Darstellung des objektorientierten Programmentwurfs für die Schwerpunktberechnung verwenden wir das Klassendiagramm.

Bei diesem werden die Klassen eines Programms, wie zuvor erläutert, mit ihren Attribut- und Methodennamen in Kästen dargestellt:

UML Klassendiagramm für das Schwerpunktprogramm

Bild 19.2-2: UML Klassendiagramm für das Schwerpunktprogramm

Wiederholung: Jede der dargestellten Klassen besitzt Konstruktoren. Eine Klasse ist ein Bauplan für Objekte. Konstruktormethoden führen diesen Bauplan aus und liefern ein Objekt der Klasse, eine so genannte Instanz, zurück. Konstruktoren sind daran zu erkennen, dass sie den gleichen Namen haben, wie die Klasse zu der sie gehören. Eine Klasse kann mehrere Konstruktoren mit unterschiedlichen Übergabeparametern besitzen, die unterschiedliche Modifikationen einer Objektart erzeugen. Die Konstruktormethoden tauchen dementsprechend in dem UML-Klassendiagramm mit den gleichen Namen auf, wie die zugehörige Klasse. Ausserdem sind sie unterstrichen. Der Unterstrich besagt, dass es sich um eine so genannte statische Methode handelt, also eine, die nicht zu den konstruierten Objekten gehört, sondern zu der diese konstruierenden Klasse.

Gehen wir jetzt die Klassen des Programms einmal hierarchisch absteigend durch:

Die Klasse Werkstueck

Die Grundidee ist die, dass in einem Objekt vom Typ Werkstueck bis zu 100 Rechtecke gespeichert werden können und dass jedes Werkstück-Objekt in der Lage ist seinen Gesamtschwerpunkt auszugeben. Dementsprechend gibt es in der Klasse "Werkstueck" ein Attribut "re", das ein Array vom Typ Rechteck darstellt, in dem 100 Elemente Platz haben. Ferner gibt es in der Klasse Werkstück die Methode "getSchwerpunkt()", die aus den registrierten Rechteck-Objekten den Gesamtschwerpunkt des Werkstücks errechnen und an die aufrufende Instanz zurückliefern soll. Die Methode "addRechteck()" übernimmt die Aufgabe, ein Rechteck nach dem anderen einem Werkstückobjekt hinzuzufügen. Für interne Zwecke wird die aktuelle Anzahl der registrierten Rechtecke mit Hilfe des Attributs "anzahl" heraufgezählt.

Die Klasse Rechteck

beinhaltet vier Ortsvektoren, die die Koordinaten der Ecken enthalten. Aus diesen kann der Schwerpunkt und die Fläche des jeweiligen Rechtecks berechnet werden. Diese Funktionalität gehört in elementarer Weise zu den Rechteck-Objekten und ist deshalb über die zu Rechteck-Objekten gehörenden Methoden getSchwerpunkt() und getFlaeche() realisiert. Beide Methoden werden sinnvollerweise von der Methode getSchwerpunkt() in den Objekten der Klasse Werkstueck benutzt, um mit Hilfe der in Werkstueck gespeicherten Rechteck-Objekte den Gesamtschwerpunkt des Werkstuecks zu berechnen.

Die Klasse Vektor

Die Klasse Vektor dient zur Erzeugung von Vektoren im R2 im mathematischen Sinne. Ein Objekt dieses Typs enthält dementsprechend seine x- und y-Kompinente als Attribute. Da bei der Berechnung des Gesamtschwerpunktes die durch die Fläche gewichtete Aufsummation der Ortsvektoren der Teilschwerpunkte notwendig ist, gibt es in der Klasse Vektor noch die Methode plusVektor(), die zu den Komponenten des Vektorobjekts die eines anderen Vektors hinzuzählt und die Methode malSkalar(), mit der es möglich ist, die Komponenten eines Vektor-Objekts mit einem Faktor zu multiplizieren. Schliesslich ist es hilfreich für die Flächenberechnung eine Methode zu haben, die Differenzvektoren zwischen Ortsvektoren bestimmen kann, wozu die Methode minusVektor() dient.

Gerade die letzte Methode minusVektor() wurde nicht von vorne herein in den UML-Entwurf aufgenommmen, sondern die Idee dazu hat sich erst beim Codieren des Programms gefunden. Man kann nicht erwarten, alle Möglichkeiten und Probleme schon beim Programmentwurf zu überblicken, um dann den Entwurf 1:1 umsetzen zu können (Top-down-Methode). In der Regel braucht es mehrere Zyklen bei denen man zwischen Entwurf und testweise codierten Teilprogrammen hin und her wechselt, bis man zu einer befriedigenden Lösung kommt (Extreme-Programming-Methode).

Assoziationen

Statt innere Objekte als Attribute im Klassendiagramm auftauchen zu lassen, wie das bei dem Werkstueck-Diagramm mit re erfolgte und beim Rechteck-Diagramm mit ort1,ort2,ort3,ort4, besteht in UML auch die Möglichkeit solche Aggregationen und Kompositionen (Oberbegriff Assoziationen) mit Pfeilen zwischen den Diagrammen darzustellen:

Komposition und Aggregation

Bild 19.2-3: UML Komposition und Aggregation

Die ausgefüllte Raute gibt an, dass es sich bei der Verbindung um eine Komposition handelt und dass das der Raute naheliegende Element das übergeordnete ist. Da die vier Ortsvektoren direkt beim Erzeugen eines Rechteck-Objekts entstehen gehören sie zur "Komposition" des Rechteck-Objekts dazu.

Der Pfeil gibt bei der Verbindung an, welche Objekte einer Klasse welche andere kennen. Das Rechteck-Objekt kennt seine Ortsvektor-Objekte. Diese jedoch kennen nicht das Rechteck-Objekt in dem sie registriert sind.

Die Anzahlen über der Verbindung gibt an, wieviele Objekte es jeweils in der Assoziation geben kann. Bei der Komposition gibt es zu jedem Rechteck-Objekt genau vier Vektor-Objekte. Dagegen muss ein Vektor-Objekt nicht unbedingt mit einem Rechteck-Objekt verbunden sein (0..1).

Die nicht ausgefüllte Raute bezeichnet eine Aggregation (auch schwache Komposition genannt). Da beim Erzeugen eines Werkstueck-Objekts noch keine zugehörigen Rechteck-Objekte existieren und auch keins bis hundert hinzugefügt werden können, die zunächst unabhängig von dem Werkstueck-Objekt existieren können, handelt es sich bei der Verbindung zwischen Werkstueck-Objekt und mehreren Rechteck-Objekten um eine Aggregation.

Verbindungen ohne leere oder ausgefüllte Raute, sind allgemeine Assoziation.

Kardinalität

Die Angabe der gegenseitigen Bekanntheit (Pfeilspitzen oder nicht) und die Megenangaben zusammen werden auch als Kardinalität oder Multiplizität einer Assoziation bezeichnet.

Weitere Beispiele zur Angabe für die Anzahl der Assoziationen zwischen zwei Objekten gibt es im Klassendiagramm folgende Möglichkeiten:

UML Assoziations-Anzahl

Bild 19.2-3: UML Assoziations-Anzahl