Software kann erweitert und mehrfach verwendet werden

Objektorientierung kann das Prototyping effektiver machen

06.04.1990

Der Begriff "objektorientiert" ist in aller Munde - doch was kann der Anwender eigentlich mit dieser modernen Art der Programmierung anfangen? Raymund Vorwerk* erläutert den Stellenwert von objektorientierter Programmierung (OOP) in der Software-Entwicklung und beschreibt, welche Vorteile der Einsatz solcher Werkzeuge vor allem bei der Entwicklung von Prototypen bringt.

Die bisherigen Verfahren und Methoden zur Entwicklung von komplexen Anwendungssystemen haben bislang die in sie gesetzten Erwartungen hinsichtlich Produktivität und Qualität nicht erfüllt. Hier könnte die Verwendung von objektorientierten Programmiersystemen Abhilfe schaffen.

Die Einführung von strukturierten Methoden wie SADT oder Jackson haben im Rahmen des Systementwurfs die Möglichkeiten von Analyse und Programmierung erweitert. Wenn es aber darum ging, große und komplexe Systeme zu erstellen, waren solche Verfahren weniger geeignet, weil es kaum möglich war, für diese Systeme schon in den frühen Entwicklungsstadien eine vollständige Spezifikation festzuschreiben.

Fertigstellungstermine ständig verschoben

Dies hat dazu geführt, daß sich der Anwendungsstau vergrößerte und die Anzahl der Fehlerquellen wuchs. Immer wieder mußten Fertigstellungstermine verschoben werden, und heute ist das Problem der Wartung größer als je zuvor.

Strukturierte Methoden und Verfahren brachten einen Produktivitätsvorteil von etwa zehn bis 15 Prozent, während Steigerungsraten im zehn bis 15fachen Umfang ein Gebot der Stunde gewesen wären. Im Gegensatz dazu ist es zum Beispiel in der Elektronikindustrie in den letzten 20 Jahre gelungen, durch die Verwendung geeigneter Werkzeuge bei der Entwicklung von Komponenten ein nahezu exponentielles Wachstum zu erreichen.

Dort hat diese Entwicklung Ende der 60er Jahre mit der Übertragung der Eigenschaften von Widerständen, Kondensatoren und Transistoren in integrierte Schaltkreise begonnen. Dieser Trend, der durch eine extrem hohe Wiederverwendbarkeit elektronischer Komponenten möglich geworden ist, wurde bis zur heutige" Wafer-Scale-Integration fortgesetzt.

Die Softwarebranche hingegen befindet sich - abgesehen von wenigen Ausnahmen - in einer Position, die vor 20 Jahren Hardwarehersteller innehatten.

Software heute wird aus Basiskomponenten, wie sie 1970 zur Verfügung standen, zusammengesetzt. An Large-Scale-Integration ist hier noch gar nicht zu denken.

Bei der Erstellung von Software haben sich zwar die Tools geändert, der Grad der Modularität und der Wiederverwendbarkeit jedoch nicht. Einen Ausweg aus diesem Dilemma scheinen seit kurzer Zeit die objektorientierten Programmierungs-Systeme (OOPS) zu bieten. OOPS dedeuten eine radikale Abkehr von der bisherigen Vorgehensweise, Systeme zu erstellen.

Um Prinzipien und Vorteile der objektorientierten Programmierung darzustellen, sollen hier zunächst wesentliche Kriterien für Softwarequalität, die keineswegs immer selbstverständlich sind, aufgeführt werden. Dazu gehört erstens die Korrektheit. Ein Softwareprodukt sollte genau die Aufgaben durchführen, die in den Anforderungen und Spezifikationen festgelegt sind.

Eine weitere wichtige Eigenschaft von Software ist ihre Robustheit; das Programm muß auch unter ungewöhnlichen Bedingungen sicher funktionieren. Auch wenn nicht-spezifizierte Ereignisse eintreten, darf das System nicht mit katastrophalen Ergebnissen reagieren, sondern muß seine Verarbeitung sauber beenden. Der Oberbegriff von Robustheit und Korrektheit wird mit Zuverlässigkeit bezeichnet.

Ein nächster Aspekt ist die Erweiterbarkeit von Software. Ein Programm muß schnell und leicht an die Veränderungen von Spezifikationen und Vorgaben angepaßt werden können. Was sich hier einfach anhört, erweist sich in der Praxis nicht selten als Problem. Häufig findet man gigantische Softwaresysteme, die aber derart fragil konstruiert sind, daß die Entfernung eines einzigen Statements zum Kollaps eines ganzen Systems führt.

Software sollte teilweise oder vollständig in neuen Anwendungen wiederverwendet werden können. Die Wiederverwendbarkeit - für den Software-Entwickler nach wie vor ein komplexes Problem - führt dazu, daß weitaus weniger Programme geschrieben und getestet werden müssen. Wird dieses Kriterium erfüllt, so kann mehr Aufwand in die Verfolgung anderer Ziele wie Korrektheit und Robustheit investiert werden. Gerade zur Unterstützung der beiden letztgenannten Ziele, nämlich der, Erweiterbarkeit und der Wiederverwendbarkeit, können objektorientierte Werkzeuge eine immense Hilfe sein.

Das Prinzip der Objektorientierung läßt sich folgendermaßen beschreiben: Als Objekte bezeichnet man nicht etwa die einfache Zusammenfassung von Daten. Unter Objekten werden - allgemein formuliert - alle Dinge der realen Umwelt verstanden, die existent sind und deren Verhalten beschreibbar ist.

Da es die Aufgabe der Software-Entwicklung ist, einen Ausschnitt aus der realen Welt als Modell zu erstellen, macht es Sinn, diese einzelnen Objekte der realen Welt auch im Rahmen von Programmstrukturen nachzubilden. Diese Nachbildung geschieht aber nicht im Sinne der traditionellen Unterprogrammtechnik.

Abwendung von der bisherigen Philosophie

Die Nachbildung wird durch die strikte Zusammenfassung von Daten und Code realisiert, so daß ein Objekt gleichzeitig Struktur und Kontext beinhaltet. Hier zeigt sich deutlich eine Abwendung von der bisherigen Philosophie, die eine rigide Trennung von Daten und Programmen vorsah. Beobachtet man die Chronologie der Software-Entwicklung, so läßt sich ein Weg nachzeichnen, der über die Zusammenfassung von Programmen und Daten (zum Beispiel durch Algol im Jahre 1968) über ihre strikte Trennung bis hin zur erneuten Zusammenführung führt.

Im Gegensatz zur bisher üblichen Modularisierung kann auf die so definierten Objekte nur über ebenfalls definierte Nachrichten zugegriffen werden, die durch andere Objekte an sie gesendet werden. Wenn ein Objekt dann eine Nachricht erhält, weiß es exakt, wie es darauf reagieren muß.

Aus der Sicht des Programmierers ist die Kenntnis von der internen Struktur eines Objektes, seien es die Daten oder die Verfahren, unwesentlich. Er kann jedes Objekt benutzen, solange er den Nachrichtenumfang kennt, den ein Objekt empfangen und auf den es reagieren kann.

Diese Eigenschaft eines Objektes wird mit dem Begriff "Encapsulation" oder "Information Hiding" bezeichnet. Das heißt, anstatt komplexe Systeme in Hierarchien ineinander verschachtelter Kästen zu zergliedern, wie es die bisherigen "orthodoxen" Design-Methoden verlangen, bedeutet die Verwendung objektorientierter Verfahren die Simulation der realen Umgebung durch abgeschlossene Objekte, die miteinander wohldefinierte Nachrichten austauschen. Dies führt zu einem eher intuitiven Weg der Konzipierung und Erstellung von Systemen.

Zum Verständnis der Objektorientierung ist es notwendig, einen weiteren Begriff zu erläutern, nämlich den der Vererbung oder "Inheritance". Das folgende Beispiel, übertragen auf die Software-Entwicklung, zeigt die Möglichkeiten dieser Eigenschaft von Objekten auf.

Aus der Basisversion eines Fahrzeuges werden zwei neue -Fahrzeuge erstellt, zum Beispiel ein Cabrio und ein Roadster.

Beide Fahrzeuge weisen im Prinzip die gleichen Eigenschaften auf, die das Original-Fahrzeug gehabt hat. Nur das Dach sieht anders aus: Es gibt beim Cabrio ein Haltbares Verdeck sowie zusätzliche Funktionen, wie das Öffnen und das Schließen des Daches. Ein Cabrio wird nun dadurch erzeugt, daß ein neues Objekt kreiert wird, dein sämtliche Eigenschaften des Original-Fahrzeuges vererbt werden und das zusätzlich um die typischen Merkmale eines Cabrios ergänzt wird.

Die Möglichkeit der Inheritance erlaubt es, komplexe neue Objekte zu definieren, wobei die Eigenschaften bekannter Objekte in vollem Umfange genutzt werden können. Dieses Fähigkeit entspricht im wesentlichen den genannten Postulaten der Wiederverwendbarkeit und Erweiterbarkeit. Es gibt verschiedene andere Eigenschaften der Objektorientierung, die genannt werden könnten, aber den Rahmen dieser Ausführung sprengen würden.

Wie bei allen CASE-Tools, läßt sich, was die Anwendungsentwicklung angeht, zwischen den Phasen Analyse/Design und Realisierung unterscheiden. Die objektorientierte Analyse (OOA) integriert die interessantesten Konzepte vom Information Modelling, nämlich sowohl die Entity-Relationship-Diagramme und semantischen Datenmodelle als auch die besten Konzepte der objektorientierten Programmiersprachen.

Aus dem Bereich des Information Modelling werden die Attribute, die Beziehungen der Datenelemente untereinander, die Strukturen sowie die Repräsentation eines einzelnen Objektes innerhalb des zu betrachtenden Problembereichs in die OOA eingebracht.

Objektorientierte Programmiersprachen tragen durch folgende Eigenschaften zur objektorientierten Analyse bei:

- Verkapselung von Attributen und exklusiven Services,

- Behandlung dieser Attribute und Services als Ganzes,

- Klassifikationsstruktur in Form von Klassen

- Eigenschaft der Inheritance.

Welchen Einfluß hat aber ein OOPS auf die Prototyp-Entwicklung. Der klassische Zyklus der Entwicklung eines Prototyps läßt sich so darstellen: Ein Design wird erstellt und zur Produktreife geführt. Infolge der Erfahrungen mit dem Produkt wird ein neues, erweitertes Design entwickelt, dem ein optimiertes Produkt folgt.

Dieser Zyklus kann im Rahmen einer evolutionären Betrachtungsweise durch den Einsatz objektorientierter Sprachen verändert werden. Es handelt sich dabei um die Erstellung eines vollständigen Anwendungs-Prototypen mit OOPS.

Hauptsächlich für Benutzeroberflächen

Prototypen werden derzeit vor allem benutzte uni die Benutzeroberflächen nachzubilden. In manchen hochinteraktiven Anwendungen beträgt der Aufwand für die Erstellung von Benutzeroberflächen rund 40 Prozent des Gesamtaufwandes, Das Problem bei diesen Anwendungen besteht darin, daß die Interaktion zwischen Benutzer und System nur sehr schwer zu dokumentieren ist. Deshalb erhalten Benutzer oft eine Anwendung, die ihren Anforderungen nicht ganz entspricht.

Eine der ältesten Methoden, Benutzeroberflächen zu beschreiben, besteht in der Nachbildung der Bildschirm-Layouts. Diese Layouts werden in Dateien gespeichert und entsprechend einer vordefinierten Abfolge dem Anwender angezeigt. Diese Art der Präsentation ist statisch und kann deshalb nicht die Dynamik einfachster Anwendungen widerspiegeln.

Die zweite Stufe des Prototyping ist die Simulation. Hier wird in ähnlicher Weise mit den Bildschirm-Layouts ",erfahren. Der Unterschied ist, daß die Reihenfolge der angezeigten Bildschirme durch Eingaben verändert werden kann. So erhält der Benutzer ein realistisches Abbild seiner künftigen Anwendung.

Die vollständigste Methode, einen Prototypen zu erstellen, besteht darin, die komplette Anwendung in einer geeigneten Prototyping-Sprache zu entwickeln. Der Prototyp entspricht dann einer vollständigen Darstellung der Anwendung und ermöglicht eine Beurteilung des endgültigen Produkts.

Die Voraussetzungen, um aus einer derartigen Vorgehensweise einen Nutzen zu ziehen, ist die Verwendung immens produktiver Software-Entwicklungsumgebungen für den Prototypen. Geeignet dafür sind die objektorientierten Programmsysteme mit den zuvor beschriebenen Eigenschaften von Encapsulation und Inheritance.

Durch die Wiederverwendbarkeit der einzelnen Objekte und Methoden ist die individuelle Produktivität sehr hoch, so daß jeder Designer in einem Software-Entwicklungsteam einen größeren Anteil am Design erbringen kann. Weil weniger Mitarbeiter in das Projekt involviert werden, entstehen weniger Kommunikationslücken und ein konsistenteres Design bei gleichzeitig reduzierten Kosten.

Software-ICs sorgen für Zuverlässigkeit

Komplexe Softwaresysteme können heute auf eine ähnliche Art und Weise zusammengesetzt werden, wie dies bereits bei der Hardware geschieht. Durch die Erstellung und Verwendung von Software-ICs gelingt es in zunehmendem Maße, ähnliche Erfolge im Hinblick auf Zuverlässigkeit, Wiederverwendbarkeit und Erweiterbarkeit zu erzielen wie vor Jahren bereits in der Hardware-Industrie.

Der sinnvollste Weg, dieses Ziel zu erreichen, besteht darin, ein funktionales Modell der Anwendung zu erstellen, bevor die detaillierte Systemspezifikation fertiggeschrieben wird. Dabei kann mit einem Prototypen gearbeitet werden, um die Funktionalität des gewünschten Systems und der Benutzeroberfläche zu erproben.

Nach Abschluß dieser Phase wird die detaillierte Systemspezifikation erstellt. Auf dieser Basis kann dann das gesamte System in einer traditionellen Programmiersprache erneut implementiert werden.

Die Erstellung eines funktionalen Modells kostet in der Regel weniger, als die meisten Unternehmen für die Spezifikation eines Anwendungssystems ausgeben. Für viele Anwendungen eignen sich die Sprachen der 4. Generation. Für Anwendungen aber, die moderne Benutzeroberflächen, komplexe Datenmodelle sowie möglicherweise Techniken der künstlichen Intelligenz fordern, sind solche Tools nicht geeignet. Auf dieser Grundlage wurde eine neue Kategorie von Softwaretools entwickelt, wie zum Beispiel Smalltalk-80 und Smalltalk-V.