Klassen und Objekte werden in der Informatik sehr häufig benötigt. Um Klassen übersichtlich darstellen zu können, werden Klassen- und Objektdiagramme verwendet. Diese habt ihr bereits gesehen, nun werden wir uns mit der Thematik etwas tiefgehender beschäftigen.
Für das Beispiel unten betrachten wir uns nochmal die animierten Blubber-Blasen aus Lektion 1, insbesondere die darin verwendete Klasse Blubbels
.
Betrachten wir zuerst den Quellcode der Klasse Blubbel
:
class Blubbel { private float x; private float y; private float r; public Blubbel(float x, float r) { ... } public void display() { ... } public void aufsteigen(float v) { ... } }
Wichtig ist außerdem (insbesondere für Konstruktoren und Methoden), dass deren komplette Signatur angegeben wird, also Methodenname, alle Parameter und der Rückgabewert.
Da die Klasse einen "Bauplan" für die späteren Objekte darstellt, werden hier noch keine Werte vergeben.
Betrachten wir nun das laufende Programm. Wir sehen, dass zu jedem Zeitpunkt immer genau vier Blubbel
auf dem Bildschirm angezeigt werden:
Erstelle das Klassen- und Objektdiagramm zur Ufo-Attacke mit draw.io.
Das Darstellen von einzelnen Klassen ist bereits hilfreich bei der Erstellung neuer Programme. Noch hilfreicher werden Klassendiagramme, wenn man die Beziehungen zwischen verschiedenen Klassen darstellt, wie das folgende Beispiel verdeutlicht:
Wichtig: Beachte die unterschiedlichen Pfeilspitzen!
Erstelle ein Klassendiagramm zur Aufgabe Autofahrt. Ergänze die Modellierung so, dass Bäume, Häuser und das Auto zu einer Autofahrt
gehören.
Eine Getränkedose ist ein Behälter, der mit einer bestimmten Menge Flüssigkeit gefüllt werden kann. Eine Dose wird bei der Erzeugung befüllt. Danach kann sie vom Konsumenten geöffnet, ausgetrunken und weggeworfen werden. Modelliert eine Klasse Dose
in UML-Notation.
Modelliert eine Klasse Datum
in UML-Notation, mit der Datumsangaben mit Datum und Uhrzeit (bis Sekunden) gespeichert werden können.
a) Modelliert die Klassen Kunde und Konto in UML-Notation. Gegeben ist folgender Pflichtenheftauszug:
- ein Kunde besitzt einen Namen, ein Geburtsdatum und einen Wohnort.
- zu seinem Konto gehören Kontonummer und Kontostand.
b) Gebt für folgende Beschreibung die Objekte an.
- Der Kunde Norbert Meier verfügt über ein Konto mit der Nummer 0815 mit einem Guthaben von 4000,00 €.
Im folgenden wollen wir uns mit ein paar Käfern beschäftigen. Um diese zunächst nicht allzu kompliziert zu gestalten, nehmen wir hier lediglich Kreise. Die Käfer, mit denen wir uns hier beschäftigen, sind recht spezielle Geschöpfe. Im Laufe ihres Lebens wachsen sie bis zu einer bestimmten maximalen Größe heran und werden dann wieder kleiner, bis zu einer minimalen Größe, werden wieder größer usw. Die Geschwindigkeit, mit der die Käfer dies tun, ist zufällig. Alle nötigen Attribute, Konstruktoren und Funktionen seht ihr unten im Klassendiagramm. Implementiert die Klasse und testet euren Code anhand eines Testkäfers.
Bisher haben wir Klassen- und Objektdiagramme vor allem ohne Codebezug betrachtet. Um dies zu ändern folgt nun eine Übung, in der ihr Code in ein Klassendiagramm überführen sollt. Nehmt dafür folgenden Beispiel-Sketch und überführt ihn in ein Klassendiagramm und ein Objektdiagramm.
class Car { float x; float y; color c; Car(float carx, float cary, color carcolor) { x = carx; y = cary; c = carcolor; } void drive(int speed) { x = x + speed; fill(c); rect(x, y, 40, 10); } } Car car1; Car car2; void setup() { size(500, 400); car1 = new Car(20, 100, #0AA8F5); car2 = new Car(20, 150, #F5470C); } void draw() { background(255); car1.drive(1); car2.drive(2); }
class Bug { float x; float y; float size; float maxSize; float minSize; float grow; Bug(float tx, float ty, float tsz) { x = tx; y = ty; size = tsz; maxSize = 20; minSize = 10; grow = random(0.2, 0.8); } void display() { noStroke(); fill(255); ellipse(x, y, size, size); } void update() { size = size + grow; if(size > maxSize) { size = maxSize; grow = -grow; } if(size < minSize) { size = minSize; grow = -grow; } } } Bug bug1 = new Bug(100, 100, 15); void setup() { size(400, 400); } void draw() { background(150, 0, 0); bug1.update(); bug1.display(); }
Swarm s; void setup() { size(400, 400); smooth(); noStroke(); fill(255); s = new Swarm(); } void draw() { background(0); s.move(); s.display(); } class Swarm{ Bug queen; Bug worker1; Bug worker2; Bug worker3; float qVelocityX; float qVelocityY; float radius; float angle = 0; Swarm(){ float xQ = 0.9*random(width) + 0.1*width; float yQ = 0.9*random(height) + 0.1*height; float sizeQ = random(15, 30); this.queen = new Bug(xQ, yQ, sizeQ); this.qVelocityX = random(3); this.qVelocityY = random(3); this.radius = random(30, 60); // position workers in cirular path around queen this.worker1 = new Bug(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius, this.queen.getSize()*0.5 ); angle += 400; this.worker2 = new Bug(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius, this.queen.getSize()*0.5 ); angle += 400; this.worker3 = new Bug(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius, this.queen.getSize()*0.5 ); } //Queen moves over canvas, workers patrol around her public void move(){ // Move Queen slowly over canvas, let her switch direction every time she comes close to border if(this.queen.getX() < 0.1*width || this.queen.getX() > 0.9*width){ this.qVelocityX *= -1; } if(this.queen.getY() < 0.1*height || this.queen.getY() > 0.9*height){ this.qVelocityY *= -1; } this.queen.move(qVelocityX, qVelocityY); // position workers around queen this.worker1.setPosition(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius); angle += 400; this.worker2.setPosition(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius); angle += 400; this.worker3.setPosition(this.queen.getX() + cos(angle)*this.radius, this.queen.getY() + sin(angle)*this.radius); angle += 0.1; } void display(){ this.queen.display(); this.worker1.display(); this.worker2.display(); this.worker3.display(); } } class Bug { float x; float y; float size; Bug(float x, float y, float size) { this.x = x; this.y = y; this.size = size; } float getX(){ return this.x; } float getY(){ return this.y; } float getSize(){ return this.size; } void setPosition(float x, float y){ this.x = x; this.y = y; } public void move(float vX, float vY){ this.x += vX; this.y += vY; } public void display(){ ellipse(this.x, this.y, this.size, this.size); } }