Software Engineering Klassendiagramme Einführung Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1
Aufgabe Erstellen Sie eine Klasse Person in Java. Jede Person verfügt über Vorname und Nachname Es gibt einen Konstruktor mit Vor- und Nachname als Parameter Außerdem gibt es eine Methode getname( ), die einen String aus Vor- und Nachname (getrennt durch ein Leerzeichen) zurückgibt. 2
Java: Klasse public class Person { private String vorname; private String nachname; public Person(String vorname, String nachname){ this.vorname = vorname; this.nachname = nachname; public String getname(){ return vorname + " " + nachname; 3
Klasse im UML- Klassendiagramm Name der Klasse Attribute Operationen (Methoden) 4
Darstellung von Attributen Name des Attributs Sichtbarkeit ( - steht für private ) Datentyp Auch Angabe eines Default-Wertes möglich, z. B. - alter: int = 20 5
Sichtbarkeiten in UML - private + public # protected Zugriff nur innerhalb der Klasse Zugriff von überall Zugriff nur aus der Klasse und ihren Unterklassen ~ package Zugriff nur innerhalb desselben Package 6
Datentypen in UML UML sieht keine bestimmten Datentypen vor Wenn das Diagramm in einer bestimmten Programmiersprache umgesetzt wird, verwendet man die Datentypen dieser Sprache Ansonsten: Allgemeine Datentypen verwenden, die es in jeder Sprache gibt (String, Integer, Datum, ) Datentypen weglassen, wenn Sie in dem Diagramm nicht von Bedeutung sind (z. B. in der Analyse) 7
Darstellung von Operationen (Methoden) Stereotyp <<Create>> zur Kennzeichnung einer Methode als Konstruktor (optional) Name der Methode Parameterliste Sichtbarkeit Name der Operation Rückgabe- Datentyp (wird weg gelassen, wenn void ) 8
Parameterliste Name des Parameters Datentyp des Parameters Übergaberichtung: in der Wert wird an die Methode übergeben 9
Übergaberichtungen bei Parametern Die UML sieht folgendes vor: in out Der Parameter dient ausschließlich zur Übergabe eines Wertes an die Methode Der Parameter dient ausschließlich dazu, einen Wert von der Methode entgegenzunehmen in/out Der Parameter übergibt einen Wert, und die Methode übergibt darin einen Wert zurück Meist durch die Programmiersprache vorgegeben z. B. in Java: Bei elementaren Datentypen ist die Richtung immer in (call by value) Bei Objekten und Arrays ist die Richtung immer in/out (call by reference) Die Übergaberichtung kann daher meist weg gelassen werden 10
Darstellungsmöglichkeiten (1) Details können je nach Darstellungszweck hinzugefügt oder weg gelassen werden Sichtbarkeit der Klasse (meist weggelassen) Sichtbarkeiten, Stereotypen (create u. ä.) und Methoden-signaturen weggelassen 11
Darstellungsmöglichkeiten (2) Datentypen weggelassen Nur Methoden dargestellt Nur Attribute dargestellt Nur die Klasse dargestellt 12
Welche Details sollte man darstellen? In der Analyse spielen die Implementierungsdetails keine Rolle Daher: Meist keine Sichtbarkeiten, Datentypen, Signaturen Im Entwurf und als Dokumentation des Codes sind diese Details häufig interessant Doch auch hier lässt man in Übersichtsdiagrammen oft Details weg, damit es übersichtlich bleibt Ggf. kann man ein Übersichtsdiagramm ohne Details erstellen und für einzelne Teile zusätzlich noch Detaildiagramme 13
Klasse und Objekte Klasse Objekte 16
Klassen und Objekte im Modell und im Programm Im Modell: Klasse Im Programm: Klassendefinition im Programmcode Objekte public class Person { // Objekte werden zur Laufzeit durch Aufruf des Konstruktors erstellt: Person p1 = new Person( George, Orwell ); 17
Darstellung von Objekten Objektbezeichnung Klasse, zu der das Objekt gehört Wichtig: Objektbezeichnung und Klassenname werden bei Objekten immer unterstrichen Attribut (wie in der Klasse definiert) Attributwert Datentyp (meist weg gelassen, da schon in der Klasse definiert) Normalerweise werden nur Klassen, keine Objekte modelliert Objekte werden ggf. exemplarisch zur Illustration bestimmter Sachverhalte dargestellt 18
Darstellungsmöglichkeiten Attribute weglassen, wenn nicht benötigt Objektbezeichnung weglassen, wenn nur ausgedrückt werden soll, dass es sich um ein Objekt der Klasse Person handelt. Wichtig zur Unterscheidung von einer Klasse: Doppelpunkt vor dem Klassennamen und unterstreichen. Klassennamen weglassen, wenn z. B. die Klasse noch nicht feststeht. 19
Fügen Sie eine Java-Klasse Buch hinzu Jedes Buch verfügt über einen Titel und eine Seitenzahl. Außerdem über ein Objekt der Klasse Person als Autor Es gibt einen Konstruktor mit Titel, Seitenzahl und Autor als Parameter Außerdem gibt es eine Methode print( ), die den Titel, die Seitenzahl und den über die Methode getname() ermittelten Namen des Autors ausgibt. Erweitern Sie die main-methode der Klasse Test Es sollen zusätzlich drei Bücher angelegt werden, von denen zwei denselben Autor haben. Anschließend wird für jedes Buch die Methode print() aufgerufen. public class Person { private String vorname; private String nachname; public Person(String vorname, String nachname this.vorname = vorname; this.nachname = nachname; public String getname(){ return vorname + " " + nachname; public class Test { public static void main(string[] args) { Person p1 = new Person("George", "Orwe Person p2 = new Person("Douglas", "Ada System.out.println(p1.getName()); System.out.println(p2.getName()); 20
Lösung public class Buch { private String titel; private int seitenzahl; private Person autor; public Buch(String titel, int seitenzahl, Person autor){ this.titel = titel; this.seitenzahl = seitenzahl; this.autor = autor; public void print(){ System.out.println(titel + ", " + seitenzahl + " S., Autor: " + autor.getname()); 21
Klassen mit Assoziation Rolle der beteiligten Klasse Assoziation Navigierbarkeit: Man kann vom Buch zur Person gelangen, umgekehrt nicht Multiplizität: Jedem Buch ist genau eine Person als Autor zugeordnet 23
Verbundene Objekte Klassen: Objekte: 24
Implementierung der Assoziation Sichtbarkeit, kann ebenfalls an der Rolle modelliert werden public class Buch { private String titel; private int seitenzahl; private Person autor; Verbundene Klasse als Typ verwendet Rollenname an der Assoziation als Attributname 25
Assoziation vs. Attribut Es wird immer dann eine Assoziation modelliert, wenn die als Typ verwendete Klasse ebenfalls im Modell auftaucht Attribute mit elementaren Datentypen (String, int, ) werden als gewöhnliche Attribute modelliert Wenn eine nicht modellierte Klasse, z. B. eine Systemklasse aus einer Java-Bibliothek, als Typ verwendet wird, wird ebenfalls ein gewöhnliches Attribut verwendet (z. B. java.util.date) Wichtig: Die Angaben werden immer am gegenüberliegenden Ende der Assoziation eingetragen: Gewöhnliche Attribute Assoziation autor ist ein Attribut der Klasse Buch Die Rolle autor wird auf der Seite der Klasse Person eingetragen public class Buch { private String titel; private int seitenzahl; private Person autor; 26
Navigationsrichtung public class Person { private String vorname; private String nachname; public class Buch { private String titel; private int seitenzahl; private Person autor; Über das Attribut autor kann man im Buch leicht auf das zugeordnete Personenobjekt zugreifen, also zu ihm navigieren, z. B. über eine entsprechende Methode: public Person getautor(){ return autor; In der Klasse Person ist kein Attribut vorhanden, über das man direkt auf die zugeordneten Bücher zugreifen könnte, daher gibt es keine Navigierbarkeit in die Gegenrichtung 27
Navigierbarkeit Ohne Pfeil: Keine Angabe über Navigierbarkeit auf dieser Seite Explizit keine Navigierbarkeit in diese Richtung 28
Multiplizität Zu jedem Buch gibt es immer genau eine Person als Autor. Falls es auch Bücher ohne Autor gibt, also der Wert null für das Attribut autor erlaubt ist, ist die Multiplizität 0 oder 1: Natürlich sollte es jetzt auch einen Konstruktor ohne Autor geben. 29
Was ist mit der Gegenrichtung? Wie viele Bücher kann eine Person geschrieben haben? Zu wie vielen Rechnungen gehört eine Zahlung? 30
Was ist mit der Gegenrichtung? Wie viele Bücher kann eine Person geschrieben haben? Beliebig viele! * steht für beliebig viele (null oder mehr) Zu wie vielen Rechnungen gehört eine Zahlung? Wir nehmen einmal an: eine. 31
Konsequenzen für die Implementierung (1) Die Assoziation ist nur eine Richtung navigierbar Man wird nicht daran gehindert, dieselbe Person bei mehreren Büchern in das Attribut autor einzutragen (hier: über den Konstruktor) 32
Konsequenzen für die Implementierung (2) Im anderen Beispiel wird man allerdings auch nicht daran gehindert, dieselbe Zahlung bei mehreren Rechnungen einzutragen Das würde die Mulitplizität 1 verletzen (eine Zahlung gehört immer zu genau einer Rechnung) Lösungsmöglichkeit: In der Klasse Rechnung wird dem Attribut zahlung immer eine neu angelegte Zahlung zugeordnet: private Zahlung zahlung; public void erfassezahlung( String zahlungsdatum, String zahlungsweise, String auftraggeber){ zahlung = new Zahlung(zahlungsdatum, zahlungsweise, auftraggeber); Anmerkung: War der Rechnung vorher schon eine Zahlung zugeordnet, so gehört diese anschließend keiner Rechnung mehr an, streng genommen wäre die Multiplizität also 0..1. Wenn allerdings keine Referenz mehr auf die Zahlung existiert, kann kein Zugriff mehr darauf erfolgen und sie kann als gelöscht betrachtet werden (sie wird sowieso irgendwann vom Garbage Collector gelöscht). 33
Angabe von Multiplizitäten und Navigationsrichtungen Angabe der Multiplizitäten an den nicht navigierbaren Enden: Nur eintragen, wenn sie von Bedeutung ist Wenn die genaue Implementierung nicht von Bedeutung ist insbesondere in der Analyse lässt man die Navigationsrichtungen weg und trägt nur die Multiplizitäten ein Dann trägt man auch nur die Rollen ein, die für das Verständnis wichtig sind: 34
Namensangaben an Assoziationen Falls es hilfreich ist, kann ein Name an einer Assoziation angegeben werden: Name Ggf. kann auch noch eine Leserichtung des Namens eingetragen werden: Leserichtung damit klar ist, dass hier der Hersteller an den Händler liefert, und nicht umgekehrt 35