FA C H H O C H S C H U L E F Ü R D I E W I R T S C H A F T F H D W, H A N N O V E R O B J E K T- O R I E N T I E R T E S O F T WA R E T E C H N I K 1 NACHKLAUSUR Studiengang: HFI/T/W407 Studienquartal: II. Theoriequartal Prüfungsumfang: Skript sowie Aufgaben und Lösungen aus dem Übungsbetrieb1 Dozent: Löwe Termin: 7. Juli 2010 Dauer: 100 Minuten 40 Punkte sind zu erreichen: Wissen 16, Anwendung 16, Transfer 8 Punkte. Bestanden ab 16 Punkte. TEIL I: WISSEN (35 MINUTEN) Aufgabe 1 (2 Punkte): Das Anwendungsfalldiagramm spezifiziert in der objektorientierten Analyse die Systemgrenze. Was ist „innen“, was ist „außen“? Aufgabe 2 (2 Punkte): Anwendungsfälle im Anwendungsfalldiagramm können Struktur aufweisen. Erläu­ tern Sie den Unterschied zwischen „include“­ und „extends“­Beziehungen zwischen Anwendungsfällen! Aufgabe 3 (1 Punkt): Wann ist ein Typ abstrakt? Aufgabe 4 (3 Punkte): Im Fachklassendiagramm können Klassen durch Spezialisierungsbeziehungen strukturiert sein. Ist es immer möglich, ein Fachklassendiagramm so zu gestalten, dass Klassen, die Spezia ­ lisierungen besitzen, abstrakt sind? Wenn Ihre Antwort „nein“ ist, geben sie ein schlagendes Beispiel an! Wenn Ihre Antwort „ja“ ist, geben sie ein Rezept an, wie man Modelle, die die Eigenschaft nicht besitzen, so transformiert, dass die Eigenschaft hergestellt wird und sich die Bedeutung des Modells nicht ändert. Aufgabe 5 (2 Punkte): Im Fachklassenmodell ist Mehrfachvererbung gestattet. Geben Sie ein Anwen­ dungsbeispiel an, bei dem Mehrfachvererbung sehr viel Sinn macht. Aufgabe 6 (3 Punkte): In Java lässt sich eine Mehrfachvererbung einer Klasse C von den Klassen A und B nicht direkt abbilden. Wie kann man dennoch Mehrfachvererbungsstrukturen aus dem Fachklassenmodell ohne Veränderung der Semantik nach Java überführen? Aufgabe 7 (3 Punkte): Geben Sie die Grundstruktur eines „Composite Patterns“ an! Wie sieht der passen­ de „Visitor“ aus? T E I L I I: A N W E ND U N G ( 4 0 M I NU T E N ) Aufgabe 8 (8 Punkte): Ein XML­Dokument besteht aus einem XML­Element. XML­Elemente bestehen aus einer Sequenz von beliebig vielen Textabschnitten und anderen XML­Elementen. Dabei können nie zwei Textabschnitte direkt hintereinander vorkommen. Die in einem Element direkt enthaltenen Texte und Elemente heißen auch Kinder des Elements. Elemente ohne Kinder heißen Leere Elemente. Ein Element ist niemals direkt oder indirekt Kind von sich selbst! Elemente können neben Kindern beliebig viele Attribute besitzen. Ein Attribut hat einen Namen und einen Text als Wert. (a) (4 Punkte): Geben Sie ein möglichst präzises Fachklassenmodell2 für XML­Dokumente an! (b) (2 Punkte): Ergänzen Sie in der Klasse für XML­Elemente eine Operation (und die notwendigen Me­ thoden), die beim Empfänger einen Textabschnitt oder Element als letztes Kind einfügt! Als Hintergrundliteratur: Gamma et al: Design Patterns und Oesterreich: Objektorientierte Softwareentwicklung - Analyse und De­ sign mit der UML 2 Geben Sie Multiplizitäten (0..1, 1, *, +) an und benutzen Sie Aggregationen oder Kompositionen, wo es sinnvoll ist! 1 (c) (2 Punkte): Ergänzen Sie in der Klasse für XML­Dokumente eine Operation String getContents() (und die notwendigen Methoden), die den Inhalt eines Dokuments berechnet. Der Inhalt eines Textab­ schnitts ist dabei der enthaltene Text und der Inhalt eines Elements ist die Konkatenation der Inhalte der Kinder. Aufgabe 9 (8 Punkte): Wir betrachten eine symmetrische Beziehung relation zwischen zwei Klassen Left und Right. Die Relation soll auf der linken Seite die Multiplizität „*“ besitzen und auf der rechten Seite die Multiplizität „+“.3 Wir implementieren diese Beziehung in Java durch zwei Klassen: Relation { final private Left left; final private Right right; public Relation(Left left, Right right){this.left = left; this.right = right;} public Left getLeft(){return this.left;} public Right getRight(){return this.right;} } und RelationManager { private Vector<Relation> relations; public RelationManager(){this.relations = new Vector<Relation>();} private void add(Left l, Right r){this.relations.add(new Relation(l, r));} private Iterator<Relation> iterator(){return this.relations.iterator();} } (a) (1 Punkt): Verändern Sie den Kode für RelationManager so, dass es eine Singleton­Klasse wird! (b) (2 Punkte): Schreiben Sie die Methode für die Operation Collection<Right> getRight(Left left) in der Klasse RelationManager, die die Right­Objekte ermittelt, die mit dem als Parameter übergebenen Objekt left in Relation stehen! (c) (1 Punkt): Schreiben Sie eine Methode für die Operation Collection<Right> getRelation() in der Klasse Left, die die Right­Objekte ermittelt, die mit dem Empfänger­Objekt in relation stehen! (d) (4 Punkte): Schreiben Sie eine Methode für die Operation void deleteRelation(Right r) in der Klasse Left, die die Verbindung des Empfängers mit r – falls vorhanden – auflöst. [Hinweise: (1) Direkt nach l.deleteRelation(Right r) soll r nicht in der Ergebnismenge von l.getRight() sein. (2) Geben Sie auch alle benötigten Hilfsoperationen und ­methoden an!] T E I L I I I : T R A N S F E R ( 2 5 M I NU T E N ) Aufgabe 10 (5 Punkte): Zeichnen Sie ein UML­Fachklassendiagramm für Fachklassendiagramme! In Fachklassendiagrammen gibt es Klassen (abstrakte und konkrete) und Assoziationen zwischen zwei Klas­ sen. Klassen und Assoziationen haben einen Namen. Zwischen Klassen gibt es eine Spezialisierungsbezie ­ hung, die auch Mehrfachspezialisierung zulässt. Assoziationen können Aggregationen sein und sind mit Multiplizitäten an beiden Enden annotiert. Als Multiplizitäten wollen wir nur „*“, „+“, „0...1“ und „1“ ver ­ wenden. Zusätzlich kann noch jedes Ende einer Assoziation mit einem Rollennamen dekoriert werden. Aufgabe 11 (3 Punkte): Angenommen wir programmieren in einer Programmiersprache mit Mehrfachver­ erbung. Dann kann man die Standardinitialisierung von Objekt­wertigen Attributen mit dem „Nicht­Objekt“ null vermeiden. Wir sehen einfach eine Singleton­Klasse NullObject vor, die implizit von allen Klassen erbt, und initialisieren Objekt­wertige Attribute immer mit dem einzigen Objekt dieser Klasse, nennen wir es nullObject. (1) Warum geht das immer? (2) Was liefern jeder Objekt­wertige „ getter“ auf dem null­ Object? (3) Was ist durch das nullObject vom Typ NullObject gewonnen? Das bedeutet, dass auf der linken Seite der Relation keine Einschränkungen gemacht werden. Aber für jedes Objekt left vom Typ Left gilt: Es gibt midestens ein Objekt right vom Typ Right, mit dem left durch die Relation relation verbun­ den ist. 3