UML

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

UML
Hey,

Eine kurze Frage zu UML, wie erkenne ich in einem Java Code die Multiplizitäten?


Daran, obs ein Array ist (0…*), ein Array mit fester Länge n (n…n), ein einzelnes Objekt (0…1) oder ein einzelnes Attribut eines primitiven Datentyps (1…1).

1 „Gefällt mir“

ups logisch irgendwie :wink: Manchmal kommt man auf das einfachste nicht. Vorallem wusst ichs beim bearbeiten der Übungsaufgabe während des Semestern noch.

Dankeschön!


Hallo…

ich habe die UML Aufgabe aus der Klausur letzten Semesters versucht zu machen, unten mal mein (vermutlich falsches) Ergebnis.

Ich würd mich über eine Korrektur freuen.

public interface A {
	public static int aa = 4711;
	public double ab = 0.815;

	public void ac();
}

abstract class B implements A {
	private static void ba() {
	}

	public abstract String bb(int x);
}

class C extends B {
	public A ca;
	private D cb;

	@Override
	public void ac() {
	}

	@Override
	public String bb(int x){bb(””); return ””; }

	private boolean bb(String y) {
		cb.ac();
		return true;
	}
}

class D extends B {
	private C[] da;

	public void ac() {
	}

	public String bb(int x) {
		db(0, 0);
		return da.toString();
	}

	private void db(long a, int b) {
	}
}

Attachment:
UMLh.PNG: https://fsi.cs.fau.de/unb-attachments/post_103687/UMLh.PNG


ich hab nochmal ne frage, wie muss ich denn in der Klausur vom 6.08.2009 die Beziehungen aus dem UML Diagramm in Java-Code transferieren?

zb ist da ne Klasse Schaf, von der 3 Pfeile ausgehen. 2 mal zu nem Interface und einmal zu na abtrakten Klasse.

muss ich dann schrieben

class Schaf implements SchlachtVieh, MilchErzeugend, WolleGebend?

Und wie unterscheide ich wann ich implements und wann extends nehme?


In Java kann jede Subklasse nur eine Superklasse erweitern. Mehrfachvererbung gibt es nicht.
Dagegen kann eine Klasse beliebig viele Interfaces implementieren.
Nicht erlaubt:

class Sub extends Super1, Super2

Erlaubt:

class Sub extends Super implements Interface1, Interface2

danke.


jemand ne Idee?


Wenn du den Code lesbarer machst, indem du ordentlich einrückst und überflüssige Leerzeichen entfernst, dann wird vielleicht die Motivation größer sich durch den Code durchzulesen und ihn mit dem UML-Diagramm zu vergleichen.


Wie stelle ich in UML Restriktionen dar?

z.B.:
Mitarbeiter mit:
Untergebener
Chef

Public class Mitarbeiter{
Mitarbeiter chef;
Mitarbeiter Untergebener[];
}

würde das die 1 : 0…* Beziehung richtig darstellen?
(Ein Chef hat viele untergebene, aber ein Untergebener hat nur einen chef.)
Stimmt das so?


Ich hab meinen Post jetzt nochmal formatiert. Ist es so jetzt besser?

Ich weiß leider nie nach was man einrückt bzw. nicht einrück.


In den Folien sind die Kodierregeln erklärt alternativ in Eclipse einfach mal strg shift f drücken


dann hab ichs jetzt nochmal umformatiert…


Habs mal überflogen:

Was soll der Stern? Abstrakte Klassen oder Methoden werden im UML Diagramm kursiv dargestellt (Alternativ unter den Klassennamen {abstract})

ba() in B muss laut dem Code static sein, Unterstreichung fehlt somit bei dir.
In C verwendest du den Attributnamen v für String obwohl der y sein müsste

Wenn die Referenz nicht von primitiven Datentypen ist, dann schreibt man sie in der Regel nicht in die Klassenkästen, sondern als Rollennamen an Assoziationen (also wenn das nicht int, double usw. ist sondern wie hier A und B). Die Assoziationen fehlen bei dir komplett.

Muliplizitäten schreibt man an die eben erwähnten Assoziationen. Vererbungspfeile werden NICHT mit Mulitiplizitäten versehen.
Das heißt du brauchts für jedes Attribut von einem nicht primitiven Typ eine Kante zu der entsprechenden Klasse.

Du musst nur Methoden in die Klassen schreiben, die auch im Code in der Klasse stehen. Also wenn da steht A extends B dann schreibst du in A NUR die Methoden, die auch in A stehen und nicht nochmal diejenigen, die von B geerbt werden (es sei denn, die Methoden werden überschrieben und tauchen somit im Code auf)

Du musst dir immer vor Augen halten, dass man aus dem UML Diagramm den Code rekonstruieren können soll.
Das heißt wenn du Methoden ins UML Diagramm in irgendwelche Klassen schreibst, dann geht man davon aus, dass die Klasse so eine Methode auch besitzt und implementiert sie. Das muss man aber nicht machen, wenn die Methode nur von der Oberklasse geerbt wird, da die Implementierung ja dann übernommen werden soll.
Bei den Multiplizitäten gilt ähnliches. Wenn man die an die Veerbungspfeile schreibt, weiß man nicht welches Attribut genau jetzt ein Array ist und welches ein normales Attribut (es kann ja mehrere vom gleichen Typ geben) ist. Deswegen bekommt jedes Attribut (sofern nicht primitiv) eine eigene Assoziation spendiert.

Hoffe ich hab nicht viel vergessen


Dankeschön. Das hilft mir schonmal.

Ich werde versuchen das sweit Umzusetzen oder zumindest soweit wie ich denke es verstanden zu haben und stelle s dann nochmal hier rein.


Schau dir zu den Assoziationen mal die Threads hier im Forum zu eurer UML Übungaufgabe an, da wurde die Frage auch häufiger gestellt


zu 1: Der Stern war das abstract, das stand so über der Klausur man solle es so machen (vermutlich wiel man nicht rekursiv schrieben kann , aber das ist mir erst später gekommen :wink: )

zu 2: das bezieht sich auf das im oberen Teil der Kästen oder?

Dankeschön :slight_smile:


Wenn du mit “das im oberen Teil der Kästen” die Attribute der Klassen C und D meinst dann ja.

Also
+ca: A
-cb: B
-da: C[]

Nehmen wir mal als Beispiel das +ca : A

Das würdest du weglassen und stattdessen eine Assoziation (also einfach eine Linie oder Komposition oder Aggregation) zwischen den Klassen C und A aufspannen (C weil wird uns in Klasse C befinden, A weil unser Attribut vom Typ A ist).
Ans Ende dieser Kante schreibt man jetzt +ca (Also an das Ende, das an den Klassenkasten A angrenzt) und ergänzt die Multiplizitäten an beiden Enden.


okay danke. dann hab ich das so richtig interpretiert, aber was schreib ich denn auf die andere Seite für multiplizitäten?