Der objektorientierten Programmierung gehört die Zukunft, doch

Noch ist die Zeit für die OOPS-Techniken nicht reif

30.03.1990

OOPSlautet für Software-Entwickler das Modekürzel der neunziger Jahre. Versprechen objektorientierte Programmiersprachen (OOPS) doch deutlich erhöhte Programmierleistungen. Bei einer genaueren Betrachtung ist Burton Leathers* allerdings zu dem Schluß gekommen,daß diese Technik für den kommerziellen Einsatz noch nicht reif ist.

Heutzutage tut man sich schwer, einen computerbezogenen Text zu lesen, ohne nach kurzer Zeit auf den Begriff "objektorientiert" zu stoßen. Das ist genauso erfreulich wie bedauerlich. Erfeulich, weil es gute Gründe gibt, daran zu glauben,daß objektorientierte Programmierung unseren Umgang mit Computern in Zukunft wesentlich mitbestimmt, und bedauerlich, weil der Begriff selten exakt benutzt wird.

Es steht außer Zweifel, daß die meisten Hard- und Softwarehersteller dazu neigen, ständig mehr Features zu erdenken, die die Kunden dazu bringen sollen, sich immer wieder für ein scheinbar neues Produkt zu begeistern. "Workstation" ist beispielsweise ein Begriff, der so oft mißbraucht wurde, bis er jede exakte Bedeutung verloren hat. Auf diese Weise werden Produktbezeichnungen auf reine Schlagworte für das Marketing reduziert.

Daten und Operationen untrennbar verbunden

Vor diesem Hintergrund muß man jede Diskussion über objektorientierte Programmierung mit einer sauberen Definition beginnen. Unbezweifelbar ist, daß objektorientierte Programmierung mit der Definition, dem Einsatz von Objekten und der Art der Erstellung von Programmen zu tun hat. Aber was ist ein Objekt?

In gewissem Sinne stellt objektorientierte Programmierung die Datenstrukturen in den Mittelpunkt des Design- und Programmierablaufs. Doch es steckt mehr dahinter. Die objektorientierte Programmierung basiert auf der Idee der "Data-in-use". Die Theorie derDatentypen geht dabei von Daten aus, die eine Struktur aufweisen und auf eine exakt definierte Art und Weise eingesetztwerden.

Daten und sinnvolle Operationen sind untrennbar miteinander verbunden. Diese Verbindung macht das Wesen der objektorientierten Programmierung aus. Man könnte sagen: "Datenstrukturen + Algorithmen = Objekt".

Unerläßlich ist es, das Konzept der Klasse und ihre Beziehung zu einem Objekt zu kennen. Eine Klasse beschreibt Variablen und die Operationen, die damit ausgeführt werden können. Ein Objekt ist ein "Ereignis" innerhalb einer Klasse, deren Variablen bestimmte Werte aufweisen. Alle Objekte einer Klasse haben einen gemeinsamen Satz von Variablen und zulässigen Operationen. Sie unterscheiden sich durch die speziellen Werte der Variablen.

Objektorientierte Programmierung besteht aus der Definition der Klassen, die bei der Verarbeitung eines Programms eingesetzt werden. Zu der Arbeitsweise einiger Klassen gehört, daß sie intern die Ereignisse und optionalen Möglichkeiten anderer Klassen bestimmen. Im Idealfall der objektorientierten Programmierung wird das Objekt der Root-Klasse (Ursprungs-Objekt) eines Programms durch das Starten der Anwendung erzeugt, woraus dann alle weiteren Aktivitäten resultieren .

Für sich betrachtet stellt dieses isolierte Modell von Objekten und ihren Operationen ein faszinierendes Programmiermodell dar. Aber vielleicht handelt es sich bei OOPS nur um eine weitere Modetorheit, die als Allheilmittel angeboten wird, sich aber langfristig als alter Hut in neuer Verpackung entpuppt?

Der Wartungsaufwand wird wesentlich geringer

Zahllose Veröffentlichungen beklagen, daß der größte Teil der Programmierarbeit für die Pflege bestehender Software aufgewendet wird. Die Änderung von Programmen ist schwierig und infolgedessen sehr teuer. Also ist es im Grunde nicht die Arbeit, mit der sich Programmierer beschäftigen sollten. Warum ist es so schwierig, Programme zu ändern?

Der entscheidende Punkt liegt darin, daß Programmierer viel Zeit damit verbringen, Codes zu manipulieren, die sich für solche Eingriffe nicht richtig eignen, um leicht veränderte Programme und Routinen neu zu implementieren, wie das schon viele vor ihnen getan haben.

Gerade hier liegen die Möglichkeiten der objektorientierten Programmierung. Mit dieser Technik erstellte Anwendungen lassen sich zum einen leicht und sicher ändern, zum anderen sind die einzelnen Objekte beinahe problemlos für ähnliche aber neue Aufgaben wiederverwendbar.

Grafische Features einfach nur aufrufen

Heutzutage werden immer häufiger Programme mit grafischen Fenstern für die Kommunikation mit dem Benutzer erstellt. Aus Sicht des Anwenders ist das erfreulich, aber den Programmierer, der das Fenstersystem entwickeln soll, stellt diese Aufgabe vor eine Reihe von technischen Schwierigkeiten Aus der Entwicklersicht sind Fenster außerordentlich komplex aufgebaut und müssen -um wirklich effizient zu helfen- in der Lage sein, eine ganze Reihe von Anzeige-Elementen flexibel aufzunehmen.

Sowohl im prozeduralen als auch im objektorientierten Modell ist es keine große Kunst, das Fenster zu zeichnen. Sie führen einfach eine Create-Funktion durch und legen Größe sowie Lage des Fensters fest. Schwierig wird es bei der Darstellung geometrischer Elemente in einem Fenster. Wie sind diese Elemente beschrieben? Wie wird das Fenster neu aufgebaut, wenn dies erforderlich ist? In einer Sprache wie C gibt es eine ganze Reihe von Möglichkeiten, diese Probleme anzugehen, aber keine davon ist einfach.

Die objektorientierte Welt sieht ganz anders aus. Zunächst einmal sind sowohl Fenster als auch jede der im Fenster angezeigten geometrischen Figuren Objekte. Zu den operationalen Möglichkeiten eines solchen Fenster-Objekts gehört es, andere Objekte wie geometrische Elemente aufzunehmen. Das löst das Problem der Verbindung. Auch die Darstellung ist erstaunlich einfach.

Immer dann, wenn ein Fenster-Objekt ein Objekt mit einem geometrischen Element aufnehmen soll, fordert es das geometrische Objekt auf, sich selbst abzubilden. Dabei gibt es keinen Grund, warum das Fenster-Objekt irgendwelche Einzelheiten der Anzeige kennen müßte. Und noch besser: Wenn das Fenster ein Element auffordert, in ihm zu erscheinen, braucht es sich nicht um die Art des Objekts zu kümmern.

In dieser Unabhängigkeit der Objekte voneinander liegt der Schlüssel dafür, daß objektorientierte Programme einfacher zu ändern sind als die mit herkömmlichen Sprachen erstellten. Dort müßten zahlreiche Aspekte des Systems einschließlich des Fenster-Services berücksichtigt werden. Zweifellos wären neue Schnittstellen zu bestimmen und bestehende Routinen zu ändern.

Die Fähigkeit der objektorientierten Programmierung, bestehende Codes erneut zu nutzen, hat ihre Ursache in der Eigenschaft der sogenannten "Vererbung". Dabei handelt es sich um einen Mechanismus, der kontrolliert ausnutzt, daß viele Klassen nahezu gleich sind.

Die Aufgabe besteht darin, einerseits die Gemeinsamkeiten zu nutzen und andererseits effizient mit den Unterschieden umzugehen. Das kann über die Definition einer sogenannten "Superklasse" oder "Ursprungsklasse" geschehen. Sie besitzt die gemeinsamen Eigenschaften und Möglichkeiten aller Klassen zum Beispiel von geometrischen Elementen und definiert zudem die speziellen Eigenschaftenund Fähigkeiten der einzelnen geometrischen Elemente.

Code muß nur ein einziges Mal existieren

Nachdem zunächst die generische Klasse definiert ist, wird jede einzelne der speziellen Klassen-Rechteck, Ellipse, Dreieck etc. - mit den Begriffen der generischen Klasse definiert. Man sagt auch, sie erben von der generischen Klasse.

Jede Klasse nutzt automatisch die Definitionen (und den daraus resultierenden Code) der übergeordneten Klasse. Das ist eine sehr leistungsstarke Hilfe, die dazu beiträgt, die grundsätzliche Kompetenz in Familien zusammengehöriger Klassen sicherzustellen. Und da der Code, der auf alle geometrischen Elemente anzuwenden ist, nur einmal existiert, bleibt das Programm kompakt, aber leistungsstark.

Diese Eigenschaften der objektorientierten Programmierung - Verkapselung und Vererbung - tragen entscheidend zu der Möglichkeit bei, Codes sicher und wirtschaftlich zu ändern. Das kann zu einer drastischen Reduzierung der Kosten in den teuersten Bereichen der Software-Entwicklung -Pflege und Erweiterung - führen.

Objektorientiertes Design ist vielseitig einsetzbar

Diese Technik kann als Organisationsrahmen für das Design von Systemen, für die klassische Programmierung und als externes Idiom für die Anwendungen verwandt werden. Außerdem ist es gut möglich, ein objektorientiertes Design in eine herkömmliche Sprache zu implementieren oder diese für objektorientierte Programmierung einzusetzen, um damit konventionelle Anwendungen zu erstellen.

Objektorientiertes Design ist eine leistungsstarke Möglichkeit, komplexe verteilte Anwendungen zu entwickeln, von denen man annehmen kann, daß sie sich während des Einsatzes weiter entwickeln werden. Die Zuordnung der Details objektbezogener Aktivitäten zu einer Klasse statt zu einem Anwender macht es möglich, daß viele aktive Elemente eines Systems komplexe Einrichtungen gemeinsam nutzen.

Darüber hinaus erlaubt die Eigenständigkeit der Klassen -unabhängig vom Kontext ihres Einsatzes - die Verteilung von Aktivitäten zwischen Tasks und Servern, ohne daß hierzu eine umfassende Kommunikation zwischen den verteilten Elementen eines Systems erforderlich wäre.

Wir haben herausgefunden, daß objektorientierte Sprachen halten, was sie versprechen. Trotzdem ist Kritik durchaus angebracht. Bei einer ganzen Reihe von Aufgaben fehlt dieser Technik der nötige Reifegrad, der als Grundlage für Produktentwicklung unerläßlich ist. Trotzdem gibt es Anzeichen für eine schnelle Weiterentwicklung. Wir behalten OOPS deshalb im Auge, soweit es die verfügbare Technologie erlaubt.

Objektorientierte Programmierung wird häufig so dargestellt, als sei sie der Alltragserfahrung von Menschen sehr verwandt. Es gibt da ein Problem: Die Computerindustrie hat ihren Kunden in den letzten 30 Jahren beigebracht, prozedural zu denken, so daß sie inzwischen ihre DV-technischen Probleme häufig maschinengerecht formulieren.

Wir haben also erfolgreich einer ganzen Programmierer-Generation eine alles andere als natürliche Denkweise eingetrichtert. Wenn objektorientierte Anwendungen zum Einsatz kommen sollen, müssen wir diese Fehlentwicklung rückgängig machen. Die von Xerox Parc entwickelte und durch die Apple-Rechner bekannt gewordene Desktop-Benutzeroberfläche ist ein großartiger Anfang.

Durch die grafische Benutzerführung und nicht-sequentielle Ablaufstrukturen erlaubt dieses Modell dem Anwender, zu einer natürlicheren Denk- und Arbeitsweise zurückzufinden. Die Erwartungshaltung in bezug auf das, was Computer können und wie sie es können, ändert sich.