Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | Letzte Überarbeitung Beide Seiten der Revision | ||
uml [2014/11/25 17:02] huwi |
uml [2019/02/07 09:45] 127.0.0.1 Externe Bearbeitung |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Programmierung mit dem Klassendiagramm ====== | ||
+ | Mit objektorientierten Programmiersprachen hat der Entwickler mächtige Sprachmittel, | ||
+ | ===== Klassendiagramm Kurzübersicht ===== | ||
+ | >> | ||
+ | |||
+ | Die folgende Abbildung zeigt Ihnen eine Kurzübersicht der Modellierungselemente des UML-Klassendiagramms. | ||
+ | |||
+ | >>> | ||
+ | |||
+ | **Darstellung von Attributen: | ||
+ | Attribute beginnen mit einem Kleinbuchstaben. | ||
+ | |||
+ | Sichtbarkeit name : Typ = Initialwert {Merkmal} | ||
+ | # temperatur : uint8_t = 25 | ||
+ | |||
+ | **Schreibweise von Operationen: | ||
+ | Operationen beginnen mit einem Kleinbuchstaben. | ||
+ | |||
+ | Sichtbarkeit name (Parameter: | ||
+ | + setTemperatur ( temp : integer = 25 ) : bool | ||
+ | |||
+ | |||
+ | ===== Abstraktion und Klassen ===== | ||
+ | Um den Aufbau (die Struktur) eines Anwendungsprogramms zu beschreiben nutzen wir in der UML das Klassendiagramm. Bei der Konstruktion einer Anwendung stellt sich immer wieder die Frage nach dem " | ||
+ | |||
+ | > | ||
+ | |||
+ | Jedes Fenster muss erst einmal initialisiert werden bevor es angezeigt werden kann. Das ist eine Operation, die das Fenster selbst ausführen soll. Diese Operation wird in der UML der Klasse zugeordnet. Operationen erscheinen als Liste im Klassenrahmen. | ||
+ | |||
+ | >>> | ||
+ | |||
+ | ===== Objekte ===== | ||
+ | Objekte sind in der Programmierung Instanzen von Klassen. In der UML werden Objekte ebenfalls als Rechteck dargestellt. Die Kennzeichnung als Instanz erfolgt durch Unterstreichen des Namens. Zusätzlich kann der Typ der Instanz angezeigt werden. Die Instanzbeziehung zwischen einem Objekt und seiner Klasse wird als Abhängigkeit (gestrichelte Linie mit offenem Pfeil) und dem Stereotyp << | ||
+ | |||
+ | >>> | ||
+ | |||
+ | In der gezeigten UML-Darstellung wurde Folgendes festgelegt: | ||
+ | * Es gibt eine Klasse // | ||
+ | * Die Klasse //Fenster// verfügt über die Operation // | ||
+ | * Es gibt ein globales Objekt mit dem Namen // | ||
+ | * Das Objekt // | ||
+ | |||
+ | ===== Vererbung ===== | ||
+ | Klassen können Eigenschaften (Attribute und Operationen) von anderen Klassen erben. Dies ermöglicht die elegante Wiederverwendung von einmal geschriebenem Code. Klassenbibliotheken und die darin enthaltenen Basisklassen beschleunigen die Entwicklungsarbeit enorm. Bei der Vererbung kann man auch je nach Lesart von einer // | ||
+ | |||
+ | >>> | ||
+ | |||
+ | In der gezeigten UML-Darstellung wurde Folgendes festgelegt: | ||
+ | |||
+ | * Die Klasse //Fenster// verfügt über die Operation // | ||
+ | * **Das Fenster //"ist ein"// SFrameWindow** | ||
+ | * **Es wird zugesichert, | ||
+ | * Es gibt ein globales Objekt mit dem Namen // | ||
+ | * Das Objekt // | ||
+ | |||
+ | ===== Realisierung ===== | ||
+ | Die UML kennt ein zweites Ausdrucksmittel für den Sachverhalt //"ist ein"// | ||
+ | |||
+ | >>> | ||
+ | |||
+ | In der gezeigten UML-Darstellung wurde Folgendes festgelegt: | ||
+ | * Die Klasse // | ||
+ | * **Die // | ||
+ | |||
+ | Zum Thema Templates wird es ein eigenständiges Kapitel in diesem Tutorial geben. | ||
+ | |||
+ | ===== Kapselung ===== | ||
+ | Objektorientierte Programmiersprachen kennen verschiedene Konzepte, um die Stabilität von Anwendungen sicherzustellen. Eines der Konzepte ist die Kapselung. Dabei ist es möglich, Elementen, z. B. Attributen und Operationen von Klassen, sogenannte Sichtbarkeiten zuzuordnen. Damit kann verhindert werden, das geschützte Elemente unberechtigt benutzt werden. Die meisten Programmiersprachen unterstützen dies durch entsprechende Schlüsselworte wie //public//, // | ||
+ | |||
+ | >>> | ||
+ | |||
+ | In der gezeigten UML-Darstellung wurde Folgendes festgelegt: | ||
+ | * Die Klasse //Fenster// verfügt über die Operationen // | ||
+ | * **Das Attribut //value// ist privat und kann nur in Instanzen dieser Klasse benutzt werden.** | ||
+ | * **Die Operation // | ||
+ | * **Die Operation // | ||
+ | * Es wird zugesichert, | ||
+ | * Es gibt ein globales Objekt mit dem Namen // | ||
+ | * Das Objekt // | ||
+ | |||
+ | Zusätzlich sind in dieser Darstellung die Rückgabetypen der Operationen auf //void// bzw. //int// festgelegt worden. Dieses UML-Klassendiagramm kann jetzt in Quellcode überführt werden. Dieser kann, hier als vereinfachter Ausschnitt, so aussehen: | ||
+ | |||
+ | >>>< | ||
+ | // SiSy UML C++ Codegenerator //////////////////////////////////////////////// | ||
+ | class Fenster : public SFrameWindow | ||
+ | { | ||
+ | | ||
+ | // automatisch generierter Konstruktor | ||
+ | Fenster(); | ||
+ | // automatisch generierter Destruktor | ||
+ | virtual ~Fenster(); | ||
+ | int getValue(); | ||
+ | |||
+ | | ||
+ | int value; | ||
+ | |||
+ | | ||
+ | void onInitWindow(); | ||
+ | |||
+ | }; | ||
+ | ... | ||
+ | // globales Objekt | ||
+ | Fenster meinFenster; | ||
+ | ////////////////////////////////////////////////////////////////////////////// | ||
+ | </ | ||
+ | |||
+ | Der Stand bis an diese Stelle entspricht dem Grundgerüst eines UML-Projektes in SiSy. Das Werkzeug kümmert sich dabei um solche Details wie // | ||
+ | |||
+ | ===== Aggregation und Komposition ===== | ||
+ | Systeme bestehen aus Komponenten, | ||
+ | |||
+ | >>> | ||
+ | |||
+ | In der gezeigten UML-Darstellung wurde Folgendes festgelegt: | ||
+ | * Die Klasse //Fenster// verfügt über die Operationen // | ||
+ | * Das Attribut //value// ist privat und kann nur in Instanzen dieser Klasse benutzt werden. | ||
+ | * Die Operation // | ||
+ | * Die Operation // | ||
+ | * Es wird zugesichert, | ||
+ | * Es gibt ein globales Objekt mit dem Namen // | ||
+ | * Das Objekt // | ||
+ | * **Die Klasse //Fenster// besitzt eine // | ||
+ | * **Die Klasse // | ||
+ | |||
+ | >>>< | ||
+ | // SiSy UML C++ Codegenerator //////////////////////////////////////////////// | ||
+ | class Fenster : public SFrameWindow | ||
+ | { | ||
+ | | ||
+ | // automatisch generierter Konstruktor | ||
+ | Fenster(); | ||
+ | // automatisch generierter Destruktor | ||
+ | virtual ~Fenster(); | ||
+ | int getValue(); | ||
+ | // Aggregation | ||
+ | SPointList punkt; | ||
+ | |||
+ | | ||
+ | int value; | ||
+ | |||
+ | | ||
+ | void onInitWindow(); | ||
+ | |||
+ | }; | ||
+ | ... | ||
+ | // globales Objekt | ||
+ | Fenster meinFenster; | ||
+ | ////////////////////////////////////////////////////////////////////////////// | ||
+ | </ | ||
+ | |||
+ | Die Aggregation entspricht also einem Attribut der Klasse. Somit ist die folgende UML-Darstellung letztlich genau dasselbe. Die Attributdarstellung spart Platz, ist aber weniger übersichtlich was die Systemarchitektur betrifft. | ||
+ | |||
+ | >>> | ||
+ | |||
+ | ===== Sequenzen ===== | ||
+ | Sequenzdiagramme dokumentieren ausgewählte Verhaltensweisen eines Systems. In SiSy werden Sequenzdiagramme für jede Operation automatisch generiert, wenn diese ausgewählt ist. Der Entwickler kann anhand des dynamisch erzeugten Sequenzdiagrammes visuell überprüfen, | ||
+ | |||
+ | >>>< | ||
+ | void MainWnd:: | ||
+ | { | ||
+ | // Controls erzeugen | ||
+ | btnEnde.createCtrl(this," | ||
+ | tacho.createCtrl(this," | ||
+ | tacho.setPos(30); | ||
+ | tacho.setRange(0, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Das von SiSy automatisch erstellte Sequenzdiagramm zu diesem Code sieht dann so aus: | ||
+ | |||
+ | >>> | ||
+ | |||
+ | |||
+ | ===== Polymorphie ===== | ||
+ | Polymorphie ist für Einsteiger oft ein recht schwer verständliches Thema. Dabei ist das Schwierige eher die Erstellung der polymorphen Basisklassen nicht jedoch die Anwendung der Polymorphie durch den Entwickler. Überlassen wir das Bauen der Klassenbibliothek mit Templates und polymorphen Basisklassen den Profis und wenden die uns vorliegenden Bibliotheken einfach an. | ||
+ | Die folgende vereinfachte Darstellung der Klassen aus dem Paket // | ||
+ | |||
+ | >>> | ||
+ | |||
+ | |||
+ | Immer dann, wenn wir virtuelle Operationen einer Basisklasse überschreiben, | ||
+ | |||
+ | Die Klassen // SImageControl, | ||
+ | |||
+ | |||
+ | |||
+ | ===== Assoziation ===== | ||
+ | Den Umstand, das die Klasse // | ||
+ | |||
+ | >>> | ||
+ | |||
+ | Das Besondere an der Assoziation ist, dass dabei die Instanz der assoziierten Klasse nicht Bestandteil (by value) der Klasse ist, sondern nur auf den " | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Nächstes Thema ====== | ||
+ | * [[Schnelleinstieg]] | ||
+ | * [[http:// |