(bo)uml im Selbstexperiment

Erfahrungsbericht(e)

Da dies hier ja ein Wiki ist an dem Jeder und Jede nach herzenslust herumschrauben, -basteln und -doktorn kann, wäre es sehr schade, wenn diese Möglichkeit nich auch genutz würde.

Fühlt Euch also bitte frei auch Eure Erfahrungen, Tipps, Tricks und was-auch-immer im Zusammenhang mit (bo)uml zu ergänzen, bzw. den allergrößten Blödsinn, den ich hier verzapft habe entsprechend anzumerken, bzw. zu korrigieren.

Motivation

Angeregt durch den letzten Programmierworkshop habe nun auch ich als absolute Niete in Sachen Objektorientierung und UML mich an einen Seblstversuch gewagt.

Vorab ein wie mir scheint wichtiges Zitat über das ich bei meiner Recherche in Sachen OOP gestolpert bin:

Rentsch: "Object-Oriented Programming", SIGPLAN Notices 17.9::

My guess is that object-oriented programming will be in the 1980s what structured programming was in the 1970s.

Everyone will be in favor of it. Every manufacturer will promote his products as supporting it. Every manager will pay lip service to it. Every programmer will practice it (differently).

And no one will know just what it is.

Was das aktuelle Objektorientierungs(un)wesen betrifft, so glaube ich dabei mittlerweile schon ein wenig schlauer geworden zu sein, zumindest was mögliche Stolperfallen betrifft.

Für einen echten Profi dürfte es hier zwar nichts wirklich spannendes zu lesen geben, ein Einsteiger wird nach Lektüre - so hoffe ich zumindest - aber vielleicht doch die ein oder andere Klippe umschiffen können, mit der ich bei meiner ersten Rundfahrt recht heftig kollidiert bin.

Ziel

Als Ziel für den ersten Versuch hatte ich mir dabei die Fahrzeugfamilie aus Thomas Vortrag ausgesucht.

Da das Verkomplizieren einfacher Beziehungen und Sachverhalte eines der Grundprinzipien objektorientierter Programmierung zu sein scheint dürfte es nicht verwundern, dass eine Repräsentation des obigen Modells in bouml - zumindest für das ungeübte Auge - auf den ersten Blick doch recht verwickelt aussieht.

Unter der Annahme dass die Möglichkeit ein Ziel überhaupt als solches zu erkennen eine günstige Vorraussetzung zum Erreichen desselben ist habe ich bereits an dieser Stelle einen screenshot eingefügt, der den Stand des fertig ausgearbeiteten Projekts darstellt.

ziel.png

Ein solcher stand mir bei meinem ersten Bastelversuchen selbstverständlich leider nicht zur Verfügung und zumindest mir kam es verflixt schwierig vor den jeweils nächsten Bearbeitungsschritt zu erahnen, ohne überhaupt zu wissen wohin genau die Reise denn nun eigentlich gehen soll.

Gliederung

Dass die für das ungeübte Auge zunächst unnötig erscheinende Komplexität sehr wohl eine Berechtigung zu haben scheint offenbarte sich mir erst auf den zweiten Blick.

Von besonderem Interesse ist hier vor allem die Box mit dem Titel browser, die Auskunft über die Gliederung gibt. Zur besseren Übersicht habe ich die einzelnen Teile in der folgenden Grafik noch einmal farblich von einander abgesetzt.

browser.png

Recht gut erkennbar ist, dass sämtliche Komponenten in einer Project genannten Organisationseinheit zusammengefasst werden. Diese ist der erste grau hervorgehobene Teil mit dem Namen 'Traffic'.

Weiter habe ich die als

Während die erste Komponente (Class View) so etwas wie die abstrakte Repräsentation aller Elemente eines Projekts darzustellen scheint, handelt es sich bei der zweiten (Deployment View) wohl um jene Komponente, die eine konkrete Repräsentation in Form von Code-Schnippseln, sogenannten Artifacts enthält.

Von all den genannten Zusammenhängen und Strukturen hatte ich bei meinem ersten Experiment natürlich nicht die geringste Ahnung, aber ich denke es hilft schon Mal vorab einen kleinen Überblick vom groben Ablaufplan zu haben, bevor es nun also ins Detail geht.

Erstellen

Nach dieser langen Vorrede jetzt aber endlich zum praktischen Teil.

erster Schritt: Organisationeinheit Projekt

Nun soll es also endlich los gehen. Ich erstelle über Project->New ein neues Projekt und gebe ihm den Namen Traffic.

new.png

Die hierauf folgende Warnung

warnung.png

nehme ich nur halbherzig zur Kenntnis und werde deshalb später noch arge Probleme bekommen.

Gleich zwei wichtige Dinge hätte ich an dieser Stelle wohl besser gleich beachtet.

  • zum einen ist die Option Verbose code generation hier dringendst anzuraten.

    • Sollte es im weiteren Verlauf trotz sorgfältigster Bearbeitung doch einmal zu Komplikationen kommen, so lässt sich mit dieser Option der Ursache unter Umständen nämlich sehr viel leichter auf den Grund gehen.

  • zum anderen dürfte es am geschicktesten sein, hier gleich alle Sprachen auszuwählen, mit denen experimentiert werden soll.

    • anderenfalls scheint es nämlich ohne recht ordentliche Verrenkungen gar nicht möglich zu sein auch für erst später hinzu gewählte Sprachen Code-Schnippsel generieren zu lassen.

    • Hintergrund ist hier die Tatsache, dass die zur Codeerzeugung nötigen Vorlagen nur zum Zeitpunkt des Erstellens einer Klasse, eines Attributs, bzw. einer Methode automatisch mit Standardwerten gefüllt werden und dies nur für zu diesem Zeitpunkt bereits ausgewählte Srachen.

    • Sollen später Code-Schnippsel für zu diesem Zeitpunkt nicht gewählte Sprachen erzeugt werden, so scheint dies nur möglich zu sein, indem alle fehlenden Vorlagen manuell für jede Klasse, jedes Attribut und jede Methode hinzugefügt werden: viel Spaß beim Klicken!

Geschickter hätte ich meine Wahl wohl besser gleich so getroffen wie es in folgendem screenshot zu sehen ist.

languages.png

Rechtsklick auf das neu erstellt Projekt öffnet das folgende Kontextmenü, aus dem ich die Option 'Edit generation settings' wähle.

generation-settings.png

Im sich hierauf öffnenden Dialog lege ich flink das Verzeichnis fest, in dem später der generierte Code landen soll.

directory.png

Damit ist das Setup komplett und ich kann mich nun endlich dem Etwurf der Klassen widmen.

zweiter Schritt: abstrakte Repräsentation

Nach erneutem Rechtsklick auf das eben erstellte Projekt öffnet sich das bereits bekannte Kontextmenü.

Diesmal wähle ich die Option 'New class view' um eine neue Klassenansicht zu erstellen, in der wie eingangs beschrieben die noch zu erstellenden Klassendiagramme gesammelt werden sollen.

Mangels Phantasie wähle ich auch hier den Namen Traffic.

new-class-view.png

Nach Rechtsklick auf die eben erstellete Klassenansicht füge ich dieser durch Wahl der Option 'New class diagram' ein erstes noch leeres Klassendiagram hinzu.

Noch immer habe ich keine gescheitere Idee und taufe schließlich auch dieses auf den Namen Traffic.

new-class-diagram.png

Nun also ist es endlich soweit. Das neu erstellte Diagramm öffne ich mit einem Doppelklick und füge durch Betätigen des Buttons 'Add Class' die erste Klasse hinzu.

Dieser gebe ich wie in Thomas Beispiel den Namen Vehicle.

new-class.png

Durch Rechtsklick auf die eben erzeugte Klasse und Wahl der Option 'Add attribute' sind die benötigten Attribute flink hinzugefügt.

new-attribute.png

Für jedes der hinzugefügten Attribute öffnet sich dabei zwischenzeitlich folgender Dialog, in dem ich für jedes hinzugefügte Attribut den jeweiligen Typ angebe.

attribute.png

Für meinen ersten Test gebe ich mich mit zwei weiteren Attributen: 'achsen' und 'raeder' zufrieden, die ich nach gleichem Muster hinzufüge.

Der aktuelle Stand des Projekts sieht hiernach in etwa so aus:

teil-2.png

Nach so viel Abstraktion möchte ich nun endlich etwas konkretes sehen.

dritter Schritt: konkreter Quellcode

Nach Rechtsklick auf das Projekt wähle hierzu im Kontextmenü zunächst die Option 'New deployment view'. Wer glaubt wenigstens hier wäre mir etwas vernünftiges eingefallen, der täuscht sich gewaltig, denn auch hier gebe ich den Namen Traffic an.

new-deployment-view.png

Noch scheint es keine so rechte Verbindung zwischen Klassenansicht und Verteilungsansicht zu geben.

Diesen Mangel behebe ich flink, indem ich nach Rechtsklick auf die Klassenansicht die Option 'Edit' wähle und unter 'deployment view' die eben erstellte 'Traffic' auswähle.

Achtung! dieser Schritt ist essentiell wichtig!

  • Diesen Punkt kann man, worauf ich zu recht hingewiesen wurde nicht deutlich genug betonen!
  • Leider stellt die browser Komponente von bouml diese Verbindung zwischen Klassenansicht und Verteilungsansicht nämlich nicht graphisch dar, sodass sie bei nur oberflächlichem Lesen dieses Berichts leicht übersehen werden kann. Tatsächlich ist sie aber eine der wichtigsten überhaupt, sollte man neben der Funktion als Graphikeditor bouml auch zur automatischen Codegenerierung einsetzen wollen.

edit-class-view.png

Das zur Klasse Vehicle zugehörige Artifact lasse ich mir nun ganz bequem automatisch erstellen, indem ich nach Rechtsklick auf die Klasse 'Vehicle' die Option 'Create source artifact' im Kontextmenü wähle.

create-artifact.png

Hiermit ist die Bühne dann auch endlich bereitet und es wird ernst.

Nach Rechtsklick auf das neu erstellte Artifact wähle ich die Option 'Generate' -> 'C++' um den zugehörigen Quellcode zu generieren.

generate.png

Das Ergebnis bewundere ich nun nach Rechtsklick auf das Artifact und Wahl der Option 'See file':

see-file.png

lugfrankfurt: Programmierworkshop/bouml (zuletzt geändert am 2011-05-28 22:20:54 durch Bernd)