1 Klassendiagramm 3.6.3 Relationen ............................................................................................... 1 Assoziationen ........................................................................................................................................ 2 Rolle .................................................................................................................................................. 2 Sichtbarkeit der Assoziation .............................................................................................................. 4 Kardinalität ........................................................................................................................................ 4 Navigation ......................................................................................................................................... 5 Qualifizierte Assoziationen ............................................................................................................... 6 Aggregation ....................................................................................................................................... 6 Komposition ...................................................................................................................................... 7 Abhängigkeit ......................................................................................................................................... 8 Notation ............................................................................................................................................. 8 Verfeinerung ...................................................................................................................................... 8 Generalisierung...................................................................................................................................... 9 Definition........................................................................................................................................... 9 Diskriminator ..................................................................................................................................... 9 Notation ............................................................................................................................................. 9 3.6.4 Klassenarten ......................................................................................... 10 Metaklasse ........................................................................................................................................... 10 Abstrakte Klasse .................................................................................................................................. 11 Parametrisierbare Klasse ..................................................................................................................... 11 Schnittstelle ......................................................................................................................................... 12 Vorkommen? ................................................................................................................................... 12 Was ist ein Interface? ...................................................................................................................... 12 Notation ........................................................................................................................................... 12 Was zeigt ein Interface? .................................................................................................................. 14 Schnittstellen in Java ........................................................................................................................... 14 Definition einer Schnittstelle ........................................................................................................... 15 Implementieren einer Schnittstelle .................................................................................................. 16 Stereotypen .......................................................................................................................................... 17 3.6.5 Praktische Hinweise ............................................................................. 18 3.6.3 Relationen Das Klassendiagramm besitzt außer Klassen auch Relationen. Arten der Beziehungen: Assoziation ( ____ ): Sie repräsentiert strukturelle Beziehungen unter Objekten. Abhängigkeit ( ) : ist eine benutzt-Relation. Sie zeigt an, dass eine Änderung der Spezifikation in der einen Klasse (Event), eine Änderung in der anderen (Window) nach sich zieht. Window open() close() move() display() handleEvent() Generalisierung: 579861275-v5 Event 2 OOD sie verbindet die allgemeinere Klasse mit der spezielleren. Realisierung: sie verbindet eine Klasse mit einer Schnittstelle. Assoziationen Assoziationen sind Beziehungen zwischen verschiedenen Objekten einer oder mehrerer Klassen. Sie können Rollennamen haben, die beschreiben, welche Rolle jedes beteiligte Objekt spielt. Des weiteren können sie Multiplizitäts-angaben haben, die besagen, wie viele Objekte auf einer Seite mit wie vielen Objekten auf der anderen Seite verbunden sind. Relationen werden mit Assoziationen hergestellt. Eine Assoziation beschreibt eine Gruppe von Verknüpfungen mit einer gemeinsamen Struktur und Semantik. Eine Person Arbeitet-für eine Firma ist ein Beispiel für eine Assoziation. Alle Verknüpfungen einer Assoziation verbinden Objekte der gleichen Klassen. Assoziationen haben in einer Problembeschreibung oft die Form von Verben. Assoziationen sind inhärent bidirektional. Binäre Assoziationen verbinden zwei Klassensymbole mittels einer Linie. Die Linie kann eine Reihe von Zusätzen enthalten, um ihre Eigenschaften zu definieren. Eine binäre Assoziation ist ein Beziehung zwischen genau zwei Klassen, einschließlich der reflexiven Assoziation, wo eine Klasse in Beziehung zu sich selbst steht. Eine Assoziation ist also eine strukturelle Beziehung, die spezifiziert, dass Objekte miteinander verbunden sind. Bibliothek 1..* 1..* Buch Jedes Buch gehört zu einer Bibliothek. Zu jedem Buch können Sie die Bibliothek finden und von einer gegebenen Bibliothek können Sie alle ihre Bücher finden. Es gibt Zusätze für Assoziationen: einen Namen (besitzt), eine Rolle an jedem Ende einer Assoziation (z.B. Zeile), Sichtbarkeit, eine Kardinalitätsangabe an jedem Ende einer Assoziation (z.B. 0..1), Navigation, Qualifizierung und eine Aggregation. Rolle 3 Klassendiagramm Jede Assoziation hat zwei Rollen, jede Rolle ist eine Richtung der Assoziation. Eine Rolle kann explizit benannt werden. Wenn kein Name für eine Rolle angegeben ist, so ist der Rollenname die Zielklasse. Wenn eine Klasse an einer Assoziation teilnimmt, so spielt sie in der betreffenden Beziehung eine Rolle. Eine Rolle ist einfach die Seite, die die Klasse am einen Ende der Assoziation am anderen Ende der Assoziation zukehrt. Assoziation Person Unternehmen n:IArbeitnehmer g:IArbeitgeber Rollennamen Abb.: Rolle Eine Klasse kann viele Schnittstellen realisieren. Ein Objekt einer Klasse muss diese Schnittstellen unterstützen. Ein Objekt kann in einem gegebenen Kontext nun nur eine oder einige jeweils relevanten Schnittstellen offen legen. In diesem Fall repräsentiert jede Schnittstelle eine Rolle, die das Objekt spielt. Eine Rolle bezeichnet ein Verhalten einer Einheit, die an einem bestimmten Zusammenhang beteiligt ist. Beispiel: <<interface>> Arbeitnehmer getKarriere() getLohn() getPraemie() Person Unternehm en n:IArbeitnehmer Ein weiteres Beispiel ist folgendes: Mitarbeiter:IArbeitnehmer Person 1..* 1 Assoziation Vorgesetzter:IManger 579861275-v5 4 OOD Schnittstellenspezifikation Sichtbarkeit der Assoziation BenutzerGruppe 0.. * 0..* Benutzer +user 1 +owner 1..* -key Paßwort Ausgehend von einem Benutzergruppen-Objekt können wir zu einem Benutzer-Objekt navigieren, wir können aber nicht das Passwort des Benutzers sehen. Durch Sichtbarkeitskriterien am Ende einer Assoziation, die wir dem Rollennamen voranstellen, können wir dies angeben. Wenn nichts angegeben wurde, ist die Sichtbarkeit der Rolle public. Private Sichtbarkeit zeigt an, dass auf Objekte von außerhalb dieser Assoziation nicht zugegriffen werden kann. Lit.: UML 1.4, S. 3-75 Booch, Grady; Rumbaugh, James; Jacobson, Ivar: The Unified Modeling Language Use Guide. Ready: Addison Wesley Longman, Inc., 1999, S. 181 ff. Kardinalität Jede Rolle hat eine Kardinalität (multiplicity), die angibt wie viele Objekte an der gegebenen Beziehung partizipieren können. Allgemein gesprochen, die Multiplizität gibt die untere und obere Grenzen für die Teilnahme des Objekts an der Beziehung an. Der Stern (*) repräsentiert den Bereich von 0 bis unendlich. Die Multiplizität kann aus einer Untermenge nicht negativer Zahlen bestehen, einer einzigen Zahl, z.B. 11 für 11 Spieler einer Mannschaft, oder aus einer Menge unzusammenhängender Intervalle. So ist die Zahl der Türen eines PKWs 2, 4 oder 5. Die Kardinalitäten werden bei UML wie folgt angegeben: 1 B A Ein A ist immer mit einem B assoziiert. A 1..* B Ein A ist immer mit einem oder mehreren Bs assoziiert A 0..1 B 5 Klassendiagramm Ein A ist mit einem oder keinem B assoziiert. 0..* A B Ein A ist mit keinem, einem oder mehreren Bs assoziiert. Navigation Im Bibliotheksbeispiel ist es möglich von der Bibliothek zu ihren Büchern zu gelangen und von einem Buch zu den Bibliotheken, in denen die Bücher stehen. Wenn nichts besonderes spezifiziert ist, ist eine Assoziation bidirektional. Es gibt jedoch Umstände, die es wünschen lassen, nur in eine Richtung zu navigieren. Beispiel: 1 1.. * Benutzer Passwort Werden die Aufgaben eines Betriebssystems modelliert, so ergibt sich diese Assoziation zwischen Benutzer- und Passwort-Objekt. In der Abbildung ist eine Assoziation dargestellt, die nur in eine Richtung navigierbar ist. Dargestellt wird die Navigation durch eine offene Pfeilspitze. Die Pfeilrichtung gibt die zugelassene Navigationsrichtung an. Eigentlich sind alle Assoziationen unidirektional, d.h. gerichtete Assoziationen. Bidirektionale Assoziationen sind genaugenommen zwei entgegengesetzt gerichtete Assoziationen. 0..1 A 2..4 B 2..4 A 0..1 B Abb.: Bidirektionale Assoziationen = zwei gerichtete Assoziationen 579861275-v5 6 OOD Qualifizierte Assoziationen Verzeichnis 1 Verzeichnis Dateiname 1..* 1 Datei 1 Datei Qualifikation verbessert die semantische Genauigkeit und macht Navigationspfade leicht nachvollziehbar. Eine qualifizierte Assoziation verbindet zwei Klassen und eine Qualifikationsangabe. Die Qualifikationsangabe ist ein besonderes Attribut, das die effektive Multipliziät einer Assoziation herabsetzt. Qualifiziert werden können 1:m und m:m Assoziationen. Die Qualifikationsangabe unterscheidet die Menge von Objekten auf der m-Seite einer Assoziation. Aggregation Wir haben gesehen, dass eine Assoziation eine strukturelle Beziehung ist, die spezifiziert, dass Objekte einer Klasse mit Objekten einer andere Klasse verbunden sind. Es bedeutet auch, dass von einem Objekt zum anderen und umgekehrt navigiert werden kann. Eine Assoziation zwischen zwei Klassen repräsentiert eine strukturelle Beziehung zwischen Gleichen, das soll heißen, beide Klassen sind konzeptionell auf der gleichen Ebene. Manchmal will man jedoch eine Teile-Ganze-Beziehung modellieren, wo eine Klasse das Ganze und andere Teile davon repräsentieren. Eine spezielle Art der Assoziation ist die Aggregation. Aggregation bezeichnet die "Teil-Ganze-" oder "ist-Teil-von"-Relation, in der Objekte - die die Komponenten einer Sache repräsentieren - mit einem Objekt assoziiert sind, das die Komponentengruppe repräsentiert. Eigenschaft Die wichtigste Eigenschaft einer Aggregation ist die Transitivität. Eine Aggregation ist darüber hinaus antisymmetrisch. In einer Aggregationsbeziehung zwischen zwei Klassen muss genau ein Ende der Beziehung das Aggregat sein und das andere für die Einzelteile stehen. 7 Klassendiagramm Notation Unternehmen Das Ganze 1 Aggregation 0..* Mitarbeiter Teil Die unausgefüllte Raute unterscheidet zwischen dem Ganzen und den Teilen davon - mehr nicht. Sie ändert nicht die Bedeutung der Navigation über die Assoziation, noch besagt sie etwas über die Lebenszeit des Ganzen oder der Teile. Komposition In manchen Fällen beschreiben Aggregation Beziehungen, in denen die Teile vom Ganzen abhängig sind. Das heißt, wenn das Aggregat, also das Ganze, gelöscht wird, werden alle Einzelteile ebenfalls gelöscht. Wird ein Teil gelöscht, bleibt das Aggregat erhalten. Diese strenge Form heißt Komposition. Beispiel: Window Ganzes 1 Komposition 0...* Frame Teil Abb.: Komposition In einer Kompositions-Beziehung kann ein Objekt zu einer bestimmten Zeit nur Bestandteil eines Ganzen sein. Zusätzlich ist in einer KompositionsBeziehung das Ganze für die Zustände der Teile verantwortlich. Das bedeutet, es muss die Erzeugung und Zerstörung seiner Teile managen. Erzeugt man etwa einen Frame in einem Window-System, so muss man ihn seinem übergeordneten Window hinzufügen. Ebenso muss beim Zerstören des Window, das Window-Objekt seine Frame-Teile zerstören. 579861275-v5 8 OOD Abhängigkeit Eine Abhängigkeit ist eine Beziehung zwischen zwei Modellelementen, die zeigt, dass eine Änderung in dem einen - unabhängigen - Element eine Änderung in dem anderen - abhängigen - Element nach sich ziehen kann. Notation Dargestellt wird eine Abhängigkeit durch einen gestrichelten Pfeil, wobei der Pfeil vom abhängigen auf das unabhängige Element zeigt. abhängig Beispiel (1) unabhängig SchnittstelleA <<use>> Nutzer_1 SchnittstellenAnbieter <<use>> SchnittstelleB Nutzer_2 Beispiel (2) FilmAufnahme name abspielenAuf(c : Kanal) start( ) stop( ) zurücksetzen( ) Kanal Abb.: Abhängigkeiten Die Beispiele sind im Wesentlichen Benutzt-Beziehungen. Eine Abhängigkeit kann einen Namen haben. Dies ist jedoch selten der Fall, außer in Modellen mit vielen Abhängigkeiten, auf die verwiesen oder zwischen denen unterschieden werden soll. Verbreiteter ist die Verwendung von Stereotypen ( z.B. <<use>>, <<refine>>) , um verschiedene Nuancen von Abhängigkeiten zu unterscheiden. Verfeinerung 9 Klassendiagramm Verfeinerungsbeziehungen sind Beziehungen zwischen gleichartigen Elementen unterschiedlichen Detaillierungsgrades. Verfeinerungsbeziehungen bestehen z.B. zwischen zwei unterschiedlich granulierten Elementen. Tarifierung_1 <<refine>> Tarifierung_2 Performance optimiert, Berechnung läuft jetzt auf lokal replizierten Daten. Abb.: Verfeinerung Generalisierung Definition Generalisierung ist die taxonomische Beziehung zwischen einem allgemeinen und einem speziellen Element. Die Sicht vom allgemeineren zum speziellen ist die Spezialisierung. Bei der Generalisierung bzw. Spezialisierung werden Eigenschaften hierarchisch gegliedert. Die Eigenschaften der Oberklasse werden an die entsprechenden Unterklassen weitergegeben, d.h. vererbt. Eine Unterklasse verfügt daher über die in ihr spezifizierten Eigenschaften sowie über die Eigenschaften ihrer Oberklasse(n). Diskriminator Die Unterscheidung in Ober- und Unterklassen erfolgt häufig aufgrund eines Diskriminators. Der Diskriminator bezeichnet den für die hierarchische Strukturierung der Eigenschafen maßgeblichen Aspekt. Das Unterscheidungsmerkmal ist eine Modellierungsentscheidung. Es ist hilfreich den Diskriminator während des Modellierens explizit zu vergegenwärtigen und ihn auch in die Modellbildung aufzunehmen, da die Wahl des Diskriminators dann eine dokumentierte Entwurfsentscheidung ist. Notation Die Vererbungsbeziehung wird mit einem nicht ausgefülltem Pfeil dargestellt, wobei der Pfeil von der Unterklasse zur Oberklasse zeigt. 579861275-v5 10 OOD Oberklasse Diskriminator_2 Diskriminantor_2 Unterklasse_1 Unterklasse_4 Diskriminator_1 Unterklasse_2 Unterklasse_3 Oberklasse Diskriminator_2 Diskriminantor_2 c Unterklasse_1 Unterklasse_4 Diskrminator_1 Unterklasse_2 Unterklasse_3 Abb.: Generalisierung 3.6.4 Klassenarten Metaklasse Metaklassen sind Klassifizierungen, deren Instanzen Klassen sind. In Smalltalk, wie auch in CLOS, sind auch Klassen nur Objekte, d.h. es können auch an Klassen Nachrichten gesendet werden. In C++ und Java können Klassen jedoch nicht wie Objekte behandelt werden. Die Klasse für Klassenobjekte werden Metaklasse genannt und in UML wie folgt gekennzeichnet: <<metaclass>> KundeClass 11 Klassendiagramm Abstrakte Klasse Von einer abstrakten Klasse werden niemals Objekte erzeugt. Sie bildet die Basis für weitere Unterklassen, die Exemplare haben können. Eine abstrakte Klasse ist immer ein Oberklasse. Eine abstrakte Klasse, die keine Unterklasse hat ist sinnlos. Parametrisierbare Klasse Bei einer parametrisierbaren Klasse wird keine konkrete Klasse definiert, sondern lediglich eine Schablone (engl. Template) zur Erzeugung von Klassen. Parametrisierbare Klassen sind in streng typgebundenen Sprachen ein Mittel, um wiederverwendbaren Code zu schreiben. Beispiel: Warteschlange Eine parametrisierte Klasse stellt eine Klassenfamilie dar, deren Struktur und Verhalten unabhängig von ihrem formalen Klassenparametern definiert sind. Die formalen Parameter müssen durch aktuelle ersetzt werden, um eine konkrete Klasse in dieser Familie zu bilden. Eine konkrete Klasse ist eine Klasse, die Instanzen haben kann. Eine instantiierte Klasse definiert eine neue Klasse, die sich von allen anderen konkreten Klassen derselben Familie durch den aktuellen Parameter unterscheidet. Wie sieht dies nun in der Notation aus? Warteschlange i : Element Stereotyp <<bind>> Patient anfuegen( ) entnehmen( ) < Wartezimmer <<bind>> PKW Klasse Objekte Stau parametrisierbare Klasse Das gestrichelte Rechteck enthält eine Parameterliste und darf nicht leer sein. „i“ ist der formale Parameter und „Element“ der Implementierungstyp. 579861275-v5 12 OOD Schnittstelle Vorkommen? Schnittstellen kommen in Klassen- und Komponentendiagrammen vor. Was ist ein Interface? Im UML werden Interfaces genutzt um Nahtstellen in einem System zu modellieren. Ein Interface ist eine Sammlung von Operationen, um einen Dienst einer Klasse oder einer Komponente zu spezifizieren. In großen Systemen können Interface benutzt werden, um die Außenansicht eines Package oder Subsystems zu zeigen. Schnittstellen haben keine Implementierung, ihnen fehlen Attribute, Zustände, Assoziationen, sie haben nur Operationen. Eine Schnittstelle kann durch viele Klassen oder Komponenten realisiert werden. Eine Klasse oder Komponente kann viele Schnittstellen realisieren (Booch et al. 99, S. 170). Notation Ein Interface ist ein Klassifizierer und kann daher als Rechteck mit den drei Unterteilungen gekennzeichnet werden. Es enthält das Stereotyp <<interface>>. Jedes Interface muss einen Namen haben. Ein Namen ist ein Textstring. Beispiele In der Praxis sind Schnittstellennamen kurze Substantive oder substantivierte Begriffe aus dem Vokabular des modellierten Systems. Um Schnittstellen von Klassen zu unterscheiden, kann man den Buchstaben I für interface vor jeden Schnittstellennamen setzen. Eine Liste der Operationen, die durch das Interface unterstützt werden, können im Operationsteil untergebracht werden. Der Attribut-Teil kann unterdrückt werden, da er immer leer ist (Vers. 1.4, S. 3-53). Beispiel: InputStream {abstract} Generalisierung DataInputStream <<interface>> IDataInput <<use>> OrderReader Realization Relationship Klassendiagramm 13 Abb.: Interface und abstrakte Klasse (nach Fowler97, S. 87) Eine kompaktere Notation ist die sog. Lollipop-Notation: IDataInput <<use>> OrderReader DataInputStream Realization (einfache Form) Abb.: Lollipop-Notation Die Linie zwischen Interface und Klasse gibt an, dass die Klasse alle Operationen des Interface-Typ liefert. Die gelieferten Operationen werden nicht angezeigt. Wenn es für das Verständnis des jeweiligen Modells notwendig ist, kann man die Schnittstelle als stereotypisierte Klasse darstellen. Im entsprechenden Abschnitt des Klassensymbols werden dann die Operationen angegeben. Von Operationen kann nur der Name angegeben werden oder ihre ganze Signatur. Eine Klasse, die die Operationen des Interfaces nutzt wird mit einer gestrichelten Linie mit offenem Pfeil gezeichnet. Die Realisierungsbeziehung wird mit einem gestricheltem, nicht ausgefülltem Dreieckspfeil dargestellt. 579861275-v5 14 OOD <<use>> SortierteStringListe ISortierbar String isEqual(String) : Boolean isGreater(String) : Boolean length() : Integer SortierteStringListe <<use>> <<interface>> Sortierbar isEqual(String) : Boolean isGreater(String) : Boolean String isEqual(String) : Boolean isGreater(String) : Boolean length() : Integer Realisierung ist von Abhängigkeits-, Generalisierungs- und Assoziationsbeziehungen hinreichend verschieden, um sie als eigene Beziehungsart zu behandeln. Semantisch ist die Realisierung so etwas wie eine Kreuzung zwischen Abhängigkeit und Generalisierung und die Notation ist eine Kombination der Notation für Abhängigkeit und Generalisierung. Was zeigt ein Interface? Zunächst einen Satz von Operationen, die einen Dienst spezifizieren. Ein tieferer Blick zeigt uns die Signatur dieser Operationen mit ihren properties. Für ein besseres Verständnis der Operationen können Vor- und Nachbedingungen für jede Operation angegeben werden. Des weiteren kann ein Zustandsdiagramm dem Interface zugeordnet werden, sowie ein Kollaborationsdiagramm. Schnittstellen in Java Beim Entwickeln geht man über verschiedene Stufen der Abstraktion. Zunächst einmal interessiert man sich dafür welche Klassen benötigt werden und welche Klassen miteinander Beziehungen haben. Dann interessiert man sich dafür welche Schnittstellen eine Klasse hat und schließlich kümmert man sich um die Implementierung der Methode. 15 Klassendiagramm Bei Java gibt es keine Mehrfachvererbung von Klassen. Die möglichen Schwierigkeiten beim Umgang mit mehrfacher Vererbung und die Einsicht, dass das Erben nichttrivialer Methoden aus mehr als einer Klasse in der Praxis selten zu realisieren ist, haben die Designer veranlasst, dieses Feature nicht zu implementieren. Andererseits sah man es als wünschenswert an, dass Klassen eine oder mehrer Schnittstellendefinitionen erben können, und hat mit den Interfaces ein Ersatzkonstrukt geschaffen, das dieses Feature bietet. Definition einer Schnittstelle Ein Interface ist eine besondere Form der Klasse, die ausschließlich abstrakte Methode (Operationen) und Konstanten enthält. Anstelle des Schlüsselwortes class wird ein Interface mit dem Bezeichner "interface" deklariert. Neben den Operationen kann ein Interface auch Konstanten enthalten. Die Schnittstellendefinition besteht aus zwei Teilen: der Schnittstellendeklaration und dem Schnittstellenkörper. Die Schnittstellendeklaration setzt sich aus drei Elementen zusammen: einem optionalen Zugriffsmodifikator "public", dem Schlüsselwort "interface" und dem Schnittstellennamen, optional dem Schlüsselwort "extends" und durch Kommatat getrennte Schnittstellen, von denen abgeleitet wird. public interface Schnittstellenname extends Schnittstelle1, Schnittstelle2 { Schnittstellenkörper } Mit public deklarierte Schnittstellen können - genauso wie Klassen mittels der import-Anweisung in anderen Paketen sichtbar gemacht werden. im eigenen Paket sichtbar. Ein einfaches Beispiel soll das Vorgehen zeigen: «interface» PunktSchnittstelle In Java sieht dies nun wie folgt aus; Abb.: Schnittstellen 579861275-v5 Punkt 16 OOD Das Ergebnis eines Programmablaufes wäre: Die Koordinate des Punktes ist: 3 Ein erweitertes Beispiel ist folgendes: Wir haben Personen und Nachrichtenquellen wie Zeitung, Radio und Fernseher. Für die Nachrichtenquellen (Zeitung, Radio, Fernseher) definieren wir eine Schnittstelle die INachrichtenQuelle heißen soll. Für die Klasse Person eine Schnittstelle mit dem Namen InachrichtenEmpfänger: In UML ausgedrückt, ergibt sich folgendes Diagramm: «interface» «interface» INachrichtenQuelle INachrichtenEmpfänger +anmelden() +sendeNachricht() Person Radio Fernseher Zeitung Schauen wir uns als ersten die interface-Definitionen an: // Datei: Nachrichten.java interface INachrichtenQuelle { public void anmelden (INachrichtenEmpfaenger empf); public void sendeNachricht (String nachricht); } interface INachrichtenEmpfaenger { public void empfangeNachricht (String nachricht); } In diesem Beispiel wurden Schnittstellen definiert, NachrichtenQuelle und NachrichtenEmpfänger. Implementieren einer Schnittstelle Durch die Definition des Interfaces haben wir die gewünschte Funktionalität noch nicht zur Verfügung gestellt, sondern lediglich beschrieben. Um die Funktionalität zu realisieren, müssen die entsprechenden Methoden in einer Klasse implementiert werden. Hierfür wird die classAnweisung um eine implements-Klausel erweitert, hinter der der Name des zu implementierenden Interfaces angegeben wird. Klassendiagramm 17 Aus dem obigen Beispiel wird im folgenden Beispiel die Schnittstelle Nachrichtenempfänger implementiert: // Datei: Person.java class Person implements INachrichtenEmpfaenger { private String name; private String vorname; public Person (String name, String vorname) { this.name = name; this.vorname = vorname; } // Implementierung der Methode empfangeNachricht() der Schnitt// stelle INachrichtenEmpfaenger public void empfangeNachricht (String nachricht) { System.out.println ("an: " + name + ", " + vorname + ", " + nachricht); } } Des weiteren müssen wir noch die Klassen Zeitung, Radio usw. und die main() Funktion Programmieren. Abb.: Schnittstellen: Java-Beispiel Stereotypen Die Idee wurde von Rebecca Wirfs-Brock geprägt. Das Konzept wurde von Schöpfern der UML übernommen, obwohl es dann nicht mehr dasselbe war. Die ursprüngliche Idee war eine high-level Klassifizierung eines Objektes, die einen Hinweis darauf gab von welcher Art das Objekt ist. Oft ergibt sich bei OO-Design folgendes: Wir haben eine Klasse, die die gesamte Arbeit einer mächtigen doIT-Methode verrichtet und die anderen Klassen zu nichts anderem da sind, als Daten zu kapseln. Dies ist ein schlechtes Design, weil es dazu führt, dass der controler sehr komplex und schwierig zu handhaben ist. Um diese Situation zu verbessern, überträgt man Verhalten vom Controler auf die relativ dummen Datenobjekte, so dass sie intelligenter werden und mehr Verantwortung bekommen. 579861275-v5 18 OOD Das Wesen der Stereotypen ist, dass sie die Verantwortlichkeit einer Klasse umreißen. UML hat die Idee genommen und verwendet sie als allgemeinen Mechanismus für die Sprache selbst. Stereotypen geben in der Praxis vor allem die möglichen Verwendungszusammenhänge einer Klasse, einer Beziehung oder eines Paketes an. Stereotypen klassifizieren die möglichen Verwendungen eines Modellelements. Einer oder mehreren Klassen werden bestimmte gemeinsame Eigenheiten zugeschrieben. Sie ermöglichen eine mentale und visuelle Unterscheidung und geben Hinweise auf die Verwendung, auf den Bezug zur vorhandenen Anwendungsarchitektur, z.B. interface oder utility. Stereotypen sollen nicht frei und willkürlich von den einzelnen Entwickler erfunden und vergeben werden, sondern projekt-, unternehmens- oder werkzeugbezogen definiert sein. Beispiele für Stereotypen sind: <<complete>>, <<incomplete>>, <<signal>>, <<primitve>>, <<include>>, <<extend>>. Stereotypen werden in doppelten Winkelklammern angegeben. 3.6.5 Praktische Hinweise Der erste Schritt beim Bau eines Modells sollt nicht darin bestehen, Klassen, Assoziationen und Vererbung zu Papier zu bringen. Es kommt vielmehr darauf an, das anstehende Problem zunächst überhaupt zu verstehen. Der Inhalt eines Modells richtet sich ausschließlich nach seiner Relevanz für die angestrebte Lösung. Bemühen sie sich, Ihr Modell einfach zu halten. Vermeiden Sie unnötige Komplikationen. Wählen sie Namen sorgfältig aus. Namen sind wichtig. Sie können eine Fülle von Konnotationen (z.B. Blondinen) in sich bergen. Namen sollten aussagekräftig, knapp und eindeutig sein. Sie sollten nicht einen einzelnen Aspekt einer Klasse in den Vordergrund stellen. Die Wahl guter Namen ist einer der wichtigsten Aspekte der Modellierung. Vergeben Sie Zeiger und andere Verweise auf Objekte nicht als Attribute in den Objekten. Modellieren Sie sie statt dessen als Assoziationen. Dies ist klarer und erfasst die eigentliche Absicht besser als ein implementierungsnaher Ansatz. Versuchen Sie, allgemeine ternäre und n-äre Assoziationen zu vermeiden. Die meisten dieser Assoziationen können in binäre Assoziationen aufgelöst werden, möglicherweise unter Zuhilfenahme von Qualifikationsangaben und Verknüpfungsattributen. Versuchen Sie nicht, alle Multiplizitätsfragen schon in einem sehr frühen Stadium der Softwareentwicklung perfekt zu lösen. Bauen Sie Verknüpfungsattribute nicht in eine Klasse ein. Verwenden sie, wenn möglich, qualifizierte Assoziationen. Versuchen Sie, tiefverschachtelte Generalisierungen zu vermeiden. Klassendiagramm 19 Prüfen sie 1:1-Assoziationen. Oft ist eine "0- oder 1-" - Multiplizität besser geeignet, weil das Objekt an einem der beiden Enden optional ist. In anderen Fällen ist eine m-Multplizität erforderlich. Seien Sie nicht überrascht, wenn Sie Ihr Modell überarbeiten müssen. Modelle erfordern häufig mehrere Durchgänge, um Namen zu klären., Fehler zu beheben, Details hinzuzufügen und strukturelle Einschränkungen korrekt zu erfassen. Lassen Sie Ihr Modell möglichst von anderen Leuten überprüfen. Modelle sind häufig der entscheidende Motivationsfaktor, andere in ein Projekt einzubinden. Sie sollten Modelle immer dokumentieren. Das Diagramm spezifiziert die Struktur des Modells, ohne die Überlegungen zu beschreiben, die dahinterstehen. Der erklärende Text führt den Leser durch das Modell und erklärt die tieferen Gründe, warum das Modell so und nicht anders strukturiert wurde. Der erklärend Text verdeutlicht die Bedeutung von Namen im Modell und sollte den Grund für die Existenz jeder Klasse und jeder Relation vermitteln. Die Notation stellt eine Idealisierung dar. Nicht alle Konstrukte sind für jedes Problem erforderlich. Viele Konstrukte sind optional und eine Frage des persönlichen Geschmacks. Verwenden Sie nur Konstrukte, die sie wirklich für anstehende Projekte benötigen. 579861275-v5