Labor Modellgestütztes Software Engineering Versuch 1 Wintersemester 2015 Dipl.-Ing. (FH) Joachim Hampel Version 7_01, 11.10.2012
Inhaltsverzeichnis Inhalt 1 EINFÜHRUNG... 3 1.1 RHAPSODY MODELER... 4 1.2 RHAPSODY DEVELOPER... 5 1.3 USE CASE DIAGRAM... 6 1.4 AUFBAUSTRUKTUREN... 6 1.5 BEZIEHUNGEN ZWISCHEN OBJEKTEN... 8 2 ARBEITEN MIT PROJEKTEN... 9 2.1 PROJEKT NEU ANLEGEN... 9 2.2 WICHTIGE VOREINSTELLUNGEN... 10 2.3 HALLO WELT... 12 2.4 WEITERE MÖGLICHKEIT EINE INSTANZ ANZULEGEN... 16 2.5 VERHALTEN AUßERHALB DES KONSTRUKTORS TESTEN... 16 3 LABORAUFGABEN... 19 3.1 AUFGABE - EINFACHE KLASSEN... 19 3.2 AUFGABE - VERERBUNG... 20 3.3 AUFGABE - POLYMORPHIE UND ABSTRAKTE DATENTYPEN... 21 4 LITERATUR... 22 2
1 Einführung Mit dem ersten Versuch werden folgende Lernziele verfolgt: Kennenlernen und verstehen der Funktion eines Werkzeuges zur UML-Modellierung. Es werden die Werkzeuge Rhapsody Modeler bzw. Rhapsody Developer von IBM verwendet. Grundlegende Kenntnisse in der Bedienung der Modellierungswerkzeuge. Anhand einer vorgegebenen Aufgabenstellung soll eine Analyse durchgeführt werden und der typische Designablauf mittels Use-Cases, Klassen und Objektdiagrammen, Zustandsdiagrammen und Sequence Charts durchgeführt werden. Aus diesem Modell soll dann Programmcode generiert und ausgeführt werden. Weiterhin soll ein Verständnis für die Auswirkungen von Modell und Code-Änderungen aufgebaut werden. Systeme verfügen über Aufbau und Ablaufstrukturen. UML stellt dazu für die Aufbaustrukturen Modellierungselemente wie Use-Case Diagramme und Klassendiagramme bereit. Bedingt durch das verwendete UML Werkzeug heißen diese Diagramme für die Aufbaustrukturen o Use Case Diagrams o Object Model Diagrams 3
1.1 Rhapsody Modeler Abbildung 1 Modeler Zu Ihrer Vorbereitung steht das freie Tool IBM Rational Modeler zur Verfügung. Es handelt sich um ein UML 2.1 basiertes Software-Design-Tool. Das Tool kann unter der Adresse http://www.ibm.com/developerworks/downloads/r/modeler/index.html heruntergeladen werden. Eine Freischaltung ist allerdings nötig und sollte rechtzeitig vor Beginn des Labors durchgeführt werden. Als Einsteigertool gedacht, kann es keinen Quelltext erzeugen, unterstützt aber alle Diagrammtypen, die auch unterstützt. Modeler Projekte können in IBM Rational Rhapsody Developer geöffnet werden. Nach dem Speichern mit IBM Rational Rhapsody Developer kann ein Projekt allerdings nicht mehr im Modeler geöffnet werden. Es sollte daher immer eine Kopie des Modeler-Projektes aufgehoben werden. 4
1.2 Rhapsody Developer Abbildung 2 Developer Bei Rhapsody handelt es sich um eine UML 2.1 basierte, modellgetriebene Entwicklungsumgebung für Embedded-Systeme und Software Engineering. Das Tool ermöglicht sowohl funktionsorientierte als auch objektorientierte Designtechniken. Auf der Homepage von IBM http://www.ibm.com/developerworks/rational/products/rhapsody/ kann eine Demoversion heruntergeladen werden. Die Nutzungsdauer ist auf 30 Tage begrenzt (30-Day Free Trial). ACHTUNG! Developer und Modeler dürfen nicht gleichzeitig installiert sein, ansonsten treten Inkonsistenzen zwischen diesen Programmen auf. Projekte, die mit der aktuell zum Download angebotene Developer Version erstellt wurden, können auf den Laborrechnern nicht geöffnet werden. 5
1.3 Use Case Diagram Software Design Student Professor Abbildung 3 Use-Case Use Case Diagrams gehören zu den beschreibenden Werkzeugen. Mit ihnen kann kein Code erzeugt werden, wohl aber eine Beschreibung erfolgen, die Grundlage für Diskussionen, Dokumentationen und weitere Entwicklungsschritte sein soll. 1.4 Aufbaustrukturen Zu den Aufbaustrukturen gehören Klassendiagramme, Objektdiagramme und Paketdiagramme. In Rhapsody steht für diese drei Diagrammtypen das Object Model Diagram (OMD) zur Verfügung. Jedes Diagramm kann im OMD realisiert werden, es sind aber auch Mischformen möglich. 6
Klasse1 Klasse2 Abbildung 4 Klassendiagramm Paket1 Klasse2 Klasse1 Abbildung 5 Paketdiagramm 7
1.5 Beziehungen zwischen Objekten Bindung: STÄRKER A B Generalisierung (Generalization) A erbt von B A B 1 A B Aggregation (Aggregation) A hat B 1 Komposition (Composition) A beinhaltet B A B 1 Assoziation (Association) A kennt B A B Abhängigkeit (Dependency) A nutzt B A B port_1 port_2 Interface1 Interface2 Ports und Schnittstellen (Ports and Interfaces) A C B «flow» Datenfluß (Dataflow) C fließt von A nach B A ia ib B «flow» Bindung: SCHWÄCHER Fluss (Flowports) (z.b. MatLab Simulink Ankopplung) Abbildung 6 Wesentliche Beziehungen der UML und ihre Repräsentation in Rhapsody 8
2 Arbeiten mit Projekten 2.1 Projekt neu anlegen File->New: Name und Speicherort angeben Für jedes Projekt wird ein Object Model Diagram angelegt. Die aktuellen Projekteinstellungen befinden sich in der DefaultConfig. Grundsätzlich gilt, dass Darstellungen im Projectspace Vorrang vor den graphischen Darstellungen haben. Bei jedem Objekt erreicht man über einen Klick mit der rechten Maustaste ein Menü. Features bieten den Zugriff auf die Einstellungen. Add New erlaubt die in diesem Element möglichen Ergänzungen. In der Diagrammansicht stehen weitere wichtige selbsterklärende Menüpunkt zur Verfügung: Display Options.. Edit Code 9
2.2 Wichtige Voreinstellungen Mit einem rechten Mausklick auf eine der unter Configurations gespeicherten Konfigurationen wird das Einstellungsmenü erreicht. Selbstverständlich können hier mehrere Konfigurationsdateien verwaltet werden. Verwenden von Visiual Studio 2008 Als Environment muss MSVCStandardLibraray oder MSVCXStandardLibraray ausgewählt werden. Abbildung 7 Auswahl der IDE 10
Wird in den Diagrammen keine Instanz einer Klasse angelegt, so kann hier unter Initialization im Fenster Initial Instances eine Klasse ausgewählt werden, für die eine Instanz angelegt wird. Abbildung 8 Auswahl der Default Instanz 11
2.3 Hallo Welt Nach der Neuanlage wird in die OMD Ansicht gewechselt und eine neue Klasse platziert. Abbildung 8 Platzierung einer Klasse Die Dialogbox Features.. ermöglich die weiteren Einstellungen, wie der Klassenname Attribute und Operationen. Abbildung 9 Aufruf der Dialogbox Features.. Die Ausgabe soll durch Konstruktor erfolgen. Es muss also mit New -> Constructor -> OK ein Konstruktor eingefügt werden. Durch einen Doppelklick auf das Symbol vor dem Konstruktor challowelt erscheint der Features Dialog der Operation. Hier kann jetzt unter Implementation der eigentliche Quelltext eingetragen werden. 12
Abbildung 10 Endlich eine Zeile Quelltext Die neu erstellte Operation kann auch im Projektbereich angezeigt werden. Abbildung 11 Projektübersicht Der entstandene Quelltext kann nun ebenfalls bearbeitet werden. 13
Abbildung 12 Anzeige Quelltext Der Quelltext kann ebenfalls bearbeitet werden. challowelt::challowelt() { //#[ operation challowelt() cout<<"hallo Welt, Hallo UML"<<endl; //#] } Über das Menü Code->Roundtrip->DefaultConfig kann diese Änderung ins Modell übernommen werden. Jetzt muss nur noch dafür gesorgt werden, dass eine Instanz angelegt wird. Abbildung 13 Auswahl der zu initialisierenden Instanz 14
Das Übersetzen und Ausführen erfolgt in vier Schritten: 1. Save 2. Code->Generate->DefaultConfig 3. Make 4. Run Abbildung 14 Generate and Run Abbildung 15 War doch gar nicht so schwer! 15
2.4 Weitere Möglichkeit eine Instanz anzulegen Es wird ein weiteres Object Model Diagram (OMD) angelegt und als Objektdiagram verwendet z.b. mit der Bezeichnung Builder. Hierher wird aus dem Projektspace die Klasse gezogen, von der eine Instanz angelegt werden soll. Über das Menue (rechter Mausklick) kann die Klasse zum Objekt gemacht werden (Make an Object). Bindungen auf Zeigerebene, wie z.b. eine Association können hier durch einen Link realisiert werden. 2.5 Verhalten außerhalb des Konstruktors testen Zur Klasse wird ein Statechart hizugefügt. (Klick Rechte Maustaste auf Klasse im Projektspace - Add New Diagrams - Statechart). Dem Staechart wird eine Dafault Transition und eine Transition auf den State selbst hinzugefügt. Einmalige Vorgänge können in der Dafault Transition und sich wiederholende Vorgänge können in der Transition aufgerufen werden. Als Trigger wird die Timerfunktion tm(millisekunden) verwendet. Bei der Dafault Transition ist kein Trigger nötig. Die Methodenaufrufe werden als Action eingetragen. Wichtig: Initial Instances werden nun nicht mehr benötigt. Abbildung 18 Einfaches Statechart Abbildung 19 Featuremenue einer Transition 16
2.6 Sichtbarkeit von Attributen Werden Attribute in Klassen eingefügt so sind die Attribute selbst nicht sichtbar. protected : int iwert; //## attribute iwert Die Sichtbarkeit bezieht sich auf die set und get Funktionen, die automatisch angelegt werden. Achtung: Der Buchstabe nach get oder set wird automatisch groß geschrieben und kann von dem eigentlichen Namen der Variable abweichen. public : //## auto_generated int getiwert() const; //## auto_generated void setiwert(int p_iwert); Werden Elemente oder Namen nicht automatisch in den Ansichtsfenstern angezeigt so kann über die rechte Maustaste aus dem angezeigten Menue die Display options für ein Element aufgerufen werden. Hier können Attribute, Operationen aber auch Namen von Beziehungen nachträglich angezeigt werden. 17
2.7 Besonderheit beim Verwenden einer Komposition Um eine Komposition grafisch zu erzeugen wird die Verwbindung Composition ausgewählt und von der Klasse in der eine Instanz angelegt werden soll zu der Klasse gezogen von der eine Instanz eingebunden werden soll. Wenn Sie über die Display options die Namen der Verbindung sichtbar gemacht haben, dann werden Sie feststellen, das es zwei Namen sind. Es wurde automatisch in einer Verbindung eine Komposition und eine Assoziation angelegt. cmeineklasse: ceineweitereklasse itsceineweitereklasse; //## link itsceineweitereklasse ceineweitereklasse: cmeineklasse* itscmeineklasse; //## link itscmeineklasse Ändern können Sie dies im Feature Menü der Verbindung. Stellen Sie dieconsists of: auf End itsceineweitereklasse Eine Änderung der Multiplicity bewirkt das Anlegen eines Datenfeldes. ceineweitereklasse itsceineweitereklasse[2]; 18
3 Laboraufgaben 3.1 Aufgabe - Einfache Klassen Abbildung 20 Strecke In einem zweidimensionalen Koordinatensystem wird ein Punkt P(x,y) durch eine Koordinate x und eine Koordinate y beschrieben. Eine Strecke s(p1,p2) ist die Verbindung zweier Punkte P1(x1,y1) und P2(x2,y2). Die Länge der Strecke s kann wie folgt berechnet werden: 2 s ( x x ) ( y y ) 1 2 1 2 2 (F 1) Teil A Ein Punkt kann als Objekt betrachtet und somit durch eine Klasse abgebildet werden. Es soll eine Klasse CPunkt entworfen werden, welche die Membervariablen vom Typ double dx und dy enthält. Im Konstruktor CPunkt() sollen die Variablen dx und dy mit 0 initialisiert werden. Teil B Eine Strecke kann ebenfalls durch eine Klasse beschrieben werden. Die Klasse CStrecke enthält zwei Instanzen der Klasse CPunkt, es handelt sich also um eine Komposition. Für jeden Punkt soll eine eigene Methode zum Einlesen erstellt werden. 19
Eine Methode double Abstand() berechnet den Abstand und gibt das Ergebnis zurück. Teil C Es ist eine Instanz der Klasse CStrecke anzulegen. Die einzelnen Werte der Punkte. sind einzulesen und die Methode Abstand() ist zur Berechnung des Ergebnisses zu verwenden. 3.2 Aufgabe - Vererbung Es soll eine allgemeine Basisklasse CKraftfahrzeug entworfen werden. Die Klasse beinhaltet folgende Eigenschaften:iMotorleistung, ihoechstgeschwindigkeit, ibaujahr, ifarbe Weiterhin sind die Methoden stehen(), fahren() und bremsen() zu realisieren. Aufbauend auf die Basisklasse sollen die Klassen CPkw und CLkw. Die Klasse CPkw beinhaltet zusätzlich die Eigenschaften isitze. Die Klasse CLkw beinhaltet zusätzlich die Membervariablen iartderbeladung und istanddesfahrtenschreibers. Zu ergänzen sind noch die Methoden beladen() und entladen().die verwendeten Methoden (einschließlich Konstruktor) sollen beim Aufruf nur einen Text ausgeben, der ihre Tätigkeit beschreibt.der Konstruktor soll zusätzlich zum beschreibenden Text die Adresse der angelegten Instanz ausgeben. 20
3.3 Aufgabe - Polymorphie und abstrakte Datentypen Entwerfen Sie eine Basisklasse CKraftfahrzeug, die den abgeleiteten Klassen die Möglichkeit der Polymorphie bietet. Alle Membervariablen müssen bereits in der Basisklasse angelegt werden. Die Methoden stehen(), beladen() und entladen() sollen virtuell definiert werden und in den abgeleiteten Klassen überschrieben werden. Die Methoden fahren() und bremsen() sollen abstrakt definiert werden. Die verwendeten Methoden (einschließlich Konstruktor) sollen beim Aufruf nur einen Text ausgeben, der ihre Tätigkeit beschreibt. Bei der Polymorphie (Vielgestaltigkeit) wird die Instanz einer abgeleiteten Klasse benutzt, indem ein Zeiger auf die virtuelle Basisklasse (Association) mit der Adresse einer abgeleiteten Instanz initialisiert wird. Die Initialisierung erfolgt im Objektdiagramm (hier ebenfalls ein OMD) durch einen Link. Abbildung 21 Polymorphie im Klassendiagramm Realisierung der Polymorphie im Objektdiagramm durch einen Link 21
4 Literatur Nachfolgend findet sich eine Zusammenstellung weiterführender Informationen, die mit dem Inhalt dieses Laborversuchs in Zusammenhang stehen. [1] Rupp, Queins, Zengler; UML 2 Glasklar; Hanser [2] http://www.ibm.com/developerworks/rational/products/rhapsody/ 22