Beim objektorientierten Softwareentwurf werden Klassen zur Strukturierung von Softwaresystemen verwendet. Wesentliche Teilaufgaben stellen dabei insbesondere die Identifikation und Spezifikation von Klassenhierarchien sowie die Verknüpfung von Klassen zum Softwaresystem dar.
Definition
Der objektorientierte Softwareentwurf stellt eine in Bezug auf das zur Strukturierung eingesetzte Paradigma spezielle Form des Softwareentwurfs dar, bei dem ein Softwaresystem in Klassen (vgl. objektorientierte Modellierung) zerlegt wird. Der objektorientierte Softwareentwurf umfasst die Definition der Softwarearchitektur, der Klassen und der Vererbungshierarchien [Meyer 1997, S. 24, 147; Broy und Siedersleben 2002, S. 5].
Zu den wesentlichen Teilaufgaben des objektorientierten Softwareentwurfs gehören
-
die Identifikation der Klassen, die Teil des zu entwickelnden Softwaresystems sind,
-
die Beschreibung der identifizierten Klassen und ihrer Fähigkeiten sowie
-
die Verknüpfung der Klassen zum Softwaresystem.
Die Verknüpfung von Klassen geschieht durch Beziehungen mit unterschiedlicher Wirkung. Vererbungsbeziehungen beschreiben Spezialisierungen zwischen Klassen im Rahmen einer Klassenhierarchie. Die speziellere Klasse erhält dabei sämtliche Fähigkeiten der allgemeineren Klasse und kann diese durch eigene Funktionalität erweitern bzw. überschreiben. Grundsätzlich kann nach dem Gegenstand der Übertragung zwischen der Implementierungsvererbung und der Schnittstellenvererbung unterschieden werden [Meyer 1997, S. 494-497]. Assoziationen beschreiben Verknüpfungen zwischen den Objekten verschiedener Klassen, die zur Laufzeit durch Verweise (engl. Pointer) zwischen den beteiligten Objekten abgebildet werden [Meyer 1997, S. 147].
Das Ergebnis des Entwurfsprozesses ist ein vollständiger Plan des Softwaresystems mit Vorgaben, die die Entwicklung der identifizierten Klassen und deren Verknüpfung zum Gesamtsystem ermöglichen.
Strukturierungsparadigma
Bei einem objektorientierten Softwareentwurf sind Softwaresysteme möglichst in Klassen zu zerlegen, denen konkrete oder abstrakte Gegenstände (Objekte) aus dem Anwendungsbereich entsprechen. Die Strukturierung eines Softwaresystems ist somit konsequent an den Daten ausgerichtet [Meyer 1997, S. 116, 684]. Als Strukturierungsparadigma fungiert das Konzept des
abstrakten Datentyps, der jeweils eine Datenstruktur beschreibt und diese Datenstruktur mit den auf ihr ausführbaren Funktionen zu einer Einheit zusammenfasst [Liskov und Zilles 1974; Meyer 1997, S. 129f.]. Da jede Klasse dabei genau einem (möglichst elementaren) abstrakten Datentyp entspricht, führt ein objektorientierter Softwareentwurf grundsätzlich zu vergleichsweise feingranularen Strukturen [Meyer 1997, S. 142].
Die aus einem objektorientierten Softwareentwurf resultierende große Zahl an Klassen und Beziehungen zwischen diesen verursacht in umfangreichen Systemen schnell eine hohe Entwurfskomplexität. Da einzelne Klassen aufgrund ihrer feinen Granularität ferner meist eine Vielzahl von Verknüpfungen zu anderen Klassen aufweisen und deshalb bei Wartungsmaßnahmen nicht unabhängig voneinander austauschbar sind, wird von der Anwendung des objektorientierten Softwareentwurfs bei der Entwicklung großer Softwaresysteme bisweilen abgeraten [Mili et al. 1995, S. 547; Broy und Siedersleben 2002, S. 7; Szyperski et al. 2002, S. 115-122]. Stattdessen wird empfohlen, den objektorientierten Softwareentwurf zur Strukturierung kleinerer Systemteile wie bspw. Softwarekomponenten einzusetzen [Brown 2000, S. 78, Szyperski et al. 2002, S. 38].
Methoden und Werkzeuge
Der objektorientierte Softwareentwurf wird durch eine Vielzahl von Methoden und Werkzeugen unterstützt. Insbesondere existieren Ansätze, die sich bei der Identifikation von Klassen einsetzen lassen. Diese basieren auf dem Konzept des abstrakten Datentyps und nutzen es, um Datenstrukturen systematisch mit relevanten Funktionen zu ergänzen [Meyer 1997, S. 144 ff.].
Abb. 1: Klassendiagramm zur Dokumentation eines objektorientierten Softwareentwurfs für ein Bibliothekssystem (vereinfacht)
Zur Modellierung der Softwarearchitektur lassen sich bspw. Klassendiagramme verwenden, die Bestandteil der UML sind (siehe Abbildung 1). Diese unterstützen auch die Definition von Vererbungshierarchien. Darüber hinaus stellen sie den Ausgangspunkt für die Beschreibung der einzelnen Klassen dar, deren Verhalten zur Laufzeit durch die Ergänzung sog. Vor- und Nachbedingungen sowie Invarianten [Meyer 1997, S. 334-337] spezifiziert und sichergestellt werden kann.
Da dem objektorientierten Softwareentwurf ein Implementierungskonzept zugrundliegt, existieren zahlreiche Programmiersprachen, in denen Entwurfsergebnisse direkt umgesetzt werden können. Durch Einsatz der modellgetriebenen Softwareentwicklung kann der Umsetzungsprozess teilweise automatisiert werden, wie bspw. bei der Generierung graphischer Benutzungsoberflächen.
Literatur
Brown, Alan W.: Large-Scale, Component-Based Development. Prentice Hall: Upper Saddle River 2000.
Broy, Manfred; Siedersleben, Johannes: Objektorientierte Programmierung und Softwareentwicklung – Eine kritische Einschätzung. In: Informatik Spektrum 1 (2002) 25, S. 3-11.
Liskov, Barbara H.; Zilles, Stephen N.: Programming with Abstract Data Types. In: ACM SIGPLAN Notices 9 (1974) 4, S. 50-59.
Meyer, Bertrand: Object-Oriented Software Construction. Prentice Hall: Upper Saddle River 1997.
Mili, Hafedh; Mili, Fatma; Mili, Ali: Reusing Software: Issues and Research Directions. In: IEEE Transactions on Software Engineering 21 (1995) 6, S. 528-561.
Szyperski, Clemens; Gruntz, Dominik; Murer, Stephan: Component Software – Beyond Object-Oriented Programming. Addison-Wesley: Harlow 2002.