2 Eine kurze Tour durch UML
Bevor wir in den nächsten Kapiteln die wichtigsten Konzepte von UML kennenlernen, beschäftigen wir uns in diesem Kapitel mit den Hintergründen dieser Modellierungssprache. Dazu gehen wir darauf ein, wie UML entstanden ist und was es mit dem »U« für »unified« eigentlich auf sich hat. Dann gehen wir der Frage nach, wie UML selbst definiert ist, d. h., woher kommen die Regeln, die uns sagen, wie ein gültiges Modell in UML auszusehen hat? Und wofür wird UML überhaupt verwendet? Schließlich geben wir noch einen kurzen Überblick über die gesamten 14 Diagramme von UML in der aktuellen Version 2.3, die sich sowohl für Struktur- als auch für Verhaltensmodellierung einsetzen lassen.
2.1 Historische Entwicklung
Ursprünge der Objektorientierung Die Einführung von objektorientierten Konzepten in der Informatik geht auf Arbeiten der frühen 60er-Jahre des vergangenen Jahrhunderts zurück [Cap03]. Die ersten Ideen fanden in Systemen wie z.B. Sketchpad ihre Umsetzung, das einen neuen, grafischen Kommunikationsansatz zwischen Mensch und Computer darstellte [Kay93, Sut64].
SIMULA Die Programmiersprache SIMULA [Hol94] wird heutzutage als erste objektorientierte Programmiersprache angesehen. SIMULA wurde in erster Linie zur Entwicklung von Simulationssoftware eingesetzt und erfuhr noch einen verhältnismäßig geringen Verbreitungsgrad. Konzepte wie Klassen, Objekte, Vererbung und dynamisches Binden waren in SIMULA bereits realisiert [BDMN79].
Objektorientierte Programmiersprachen Dies war der Anfang einer Revolution in der Softwareentwicklung. Basierend auf dem objektorientierten Paradigma entstand in den darauffolgenden Jahrzehnten eine Vielzahl von Programmiersprachen [GJ97]. Darunter befanden sich Sprachen wie C++ [Str09], Eiffel [Mey88] und Smalltalk [Kay93], die bereits viele wichtige Konzepte moderner Programmiersprachen enthielten und die zum Teil heute noch eingesetzt werden.
Die Entstehung und Einführung der Objektorientierung als Methode im Software Engineering ist eng mit dem Aufkommen von objektorientierten Programmiersprachen verbunden. Objektorientierung gilt inzwischen als gut etablierter und erprobter Ansatz, um mit der Komplexität von Softwaresystemen umzugehen, und hat nicht nur in Programmiersprachen, sondern auch in anderen Bereichen wie z.B. bei Datenbanken oder der Beschreibung von Benutzerschnittstellen ihre Daseinsberechtigung gefunden.
Wie wir bereits bei der Definition des Modellbegriffs in Abschnitt 1.2 festgestellt haben, sind Softwaresysteme Abstraktionen, also stark vereinfachte Darstellungen, die es zum Ziel haben, Probleme der realen Welt maschinenunterstützt zu lösen. Um die reale Welt adäquat zu beschreiben, sind herkömmliche prozedurale Programmiersprachen nicht unbedingt das einfachste Mittel, da die konzeptionellen Unterschiede zwischen einer natürlichen Problembeschreibung und der praktischen Umsetzung als Programm groß sind. Mit der objektorientierten Programmierung, deren Programmierkonzepte sich an der realen Welt orientieren, versuchte man, bessere und vor allem besser wartbare Programme zu entwickeln [Cap03].
Die Objektorientierung ist über die Jahre zum wichtigsten Softwareentwicklungsparadigma geworden, was sich heute in objektorientierten Programmiersprachen wie Java [Mös11] oder C# [Mös09] und objektorientierten Modellierungssprachen wie UML widerspiegelt. Doch bis zum heutigen State-of-the-Art der Softwareentwicklung war es ein langer, kurvenreicher Weg.
Ada
Methode von Booch In den 80er-Jahren erfuhr die Programmiersprache Ada, die vom amerikanischen Verteidigungsministerium entwickelt und propagiert wurde, aufgrund ihrer mächtigen Konzepte und effizienten Compiler starke Popularität [IBFW86]. Ada bot schon damals Unterstützung für abstrakte Datentypen in Form von Packages und Unterstützung von Nebenläufigkeit in Form von Tasks. Packages erlaubten die Trennung von Spezifikation und Implementierung und die Erweiterung der Sprache um Objekte und um Klassen von Objekten. Ada unterschied sich damit grundlegend von anderen strukturierten Sprachen wie Fortran und Cobol. Um nun Ada-Programme leichter entwickeln zu können, wurde der Ruf nach objektorientierten Analyse- und Entwurfsmethoden laut. Diese Modellierungsmethoden wurden aufgrund der weiten Verbreitung von Ada und durch den Druck des amerikanischen Verteidigungsministeriums speziell auf die Charakteristika von Ada ausgerichtet. Grady Booch war einer der ersten Forscher, der Arbeiten zu dem objektorientierten Entwurf von Ada-Programmen veröffentlichte [Boo86].
OMT-Ansatz von Rumbaugh
OOSE-Ansatz von Jacobson Mit der Zeit entstand eine Vielzahl von weiteren objektorientierten Modellierungsmethoden (siehe [Cap03, KS96] für einen detaillierten Überblick). Die Modellierungsmethoden hatten meist entweder einen starken Bezug zu Programmiersprachen wie die Methode von Booch oder einen starken Bezug zur Datenmodellierung wie OMT (Object Modeling Technique) von James Rumbaugh [RBP+91]. OMT unterstützte die Entwicklung komplexer Objekte im Sinne einer objektorientierten Erweiterung des Entity-Relationship-Modells [Che76], das für die Beschreibung von Datenbanken eingeführt worden war. Davon unabhängig führte Ivar Jacobson seinen Ansatz Object-Oriented Software Engineering (OOSE) ein, der ursprünglich zur Beschreibung von Telekommunikationssystemen entwickelt worden war [JCJO92]. OOSE stellte die Modellierung und die Simulation von Vorgängen der realen Welt in den Mittelpunkt.
Zeit des Methodenkriegs In den 80er- und frühen 90er-Jahren des vergangenen Jahrhunderts wurde die Modellierungswelt von einer Vielzahl verschiedener Modellierungssprachen überflutet. Um die auftretenden Kompatibilitätsprobleme in den Griff zu bekommen, war erheblicher Aufwand notwendig. Die Modelle von verschiedenen Projektpartnern waren oft nicht kompatibel und die Wiederverwendbarkeit in anderen Projekten war nicht gegeben. Erschöpfende Diskussionen über unterschiedliche Notationen waren die Folge, die von den eigentlichen Modellierungsproblemen ablenkten. Da immer wieder neue Modellierungssprachen auftauchten, war nicht klar, in welche investiert werden sollte und welche nur einen kurzlebigen Trend darstellten. Setzte sich eine Sprache nicht durch, waren sämtliche Investitionen, die für die Etablierung einer Sprache innerhalb eines Projekts oder eines Unternehmens getätigt worden waren, weitgehend verloren. Diese Zeit der zahlreichen, oft nur in Details unterschiedlichen Ansätze wird rückblickend auch als Methodenkrieg bezeichnet.
Object Management Group (OMG) Um dieser unzulänglichen Situation ein Ende zu setzen, rief 1996 die Object Management Group (OMG) [Obj], das wichtigste Standardisierungsgremium für objektorientierte Softwareentwicklung, zur Spezifikation eines einheitlichen Modellierungsstandards auf.
Drei Amigos Bereits im Jahr 1995 vereinten die Wissenschaftler Grady Booch, Ivar Jacobson und James Rumbaugh auf der OOPSLA-Konferenz (das Akronym OOPSLA steht für Object-Oriented Programming, Systems, Languages, and Applications) ihre Ideen und Ansätze. Seit damals werden Booch, Jacobson und Rumbaugh oft auch als die »drei Amigos« bezeichnet. Dabei steckten sie sich folgende Ziele [BM99]:
♦ Verwendung von objektorientierten Konzepten zur Repräsentation von kompletten Systemen und nicht nur einem Teil der Software;
♦ Herstellung einer expliziten Bindung zwischen Modellierungskonzepten und ausführbarem Programmcode;
♦ Berücksichtigung von Skalierungsfaktoren, die in komplexen und kritischen Systemen inhärent sind;
♦ Erstellung einer Modellierungssprache, die sowohl maschinenverarbeitbar als auch für Menschen lesbar ist.
Unified Modeling Language (UML)
Metamodell
Object Constraint Language (OCL)
XML Metadata Interchange Format (XMI) Das Resultat ihrer Anstrengungen war die Unified Modeling Language (UML), die 1997 in der Version 1.0 auf den OMG-Aufruf eingereicht wurde. Eine Vielzahl von ehemaligen Konkurrenten beteiligte sich an der Erstellung von Version 1.1, die schließlich 1998 erschien. Hierbei bestand eines der Hauptziele in einer konsistenten Formulierung des Sprachkerns von UML, der in dem sogenannten Metamodell (siehe Kap. 9) festgehalten ist. Das Metamodell legt fest, welche Elemente die Sprache UML zur Verfügung stellt und wie diese korrekt zu verwenden sind. Zu diesem Zweck wurde zusätzlich die auf Prädikatenlogik basierende Object Constraint Language (OCL) [Obj10a] eingesetzt. In darauffolgenden Versionen wurden neben der Überarbeitung gewisser Sprachkonzepte Mechanismen zur Austauschbarkeit von Modellen in der Form des XML Metadata Interchange Format (XMI) [Obj07] und Mechanismen für die Generierung von Programmcode eingeführt. Neben diesen eher kleinen Änderungen wurde bereits im Jahr 2000 von der OMG ein Erneuerungsprozess von UML initiiert, der schließlich zur Verabschiedung des Sprachstandards UML 2.0 im Jahr 2005 führte....