Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Um die hier genannten Vorteile ausnutzen zu können, ist es wichtig, sich die Denkweise des objektorientierten<br />
Entwurfs anzueignen und das zentralistische Denken, in dem das “Hauptprogramm” eine so wichtige Rolle<br />
spielt, beiseite zu legen, wenn man es sich schon angewöhnt hat. Bei größeren Softwaresystemen ist eine<br />
dezentrale Architektur mit überschaubaren, unabhängigen und gleichberechtigten Einheiten unverzichtbar.<br />
4.1.3 Aufspüren <strong>der</strong> Klassen<br />
Die Frage, die sich hierbei natürlich direkt ergibt, ist “wie finde ich die Klassen, die ich brauche?”. Hierauf<br />
gibt es bisher keine allgemeingültige Antwort (und wahrscheinlich wird es auch nie eine solche geben), aber<br />
zumindest ein paar allgemeine Einsichten.<br />
Da Lösungskritik leichter ist als Lösungen zu schaffen, sollte man zunächst lernen, vorhandene Entwürfe zu<br />
analysieren und ihre Stärken und Schwächen zu beurteilen, um daraus Erfahrungen für eigene Entwürfe zu<br />
gewinnen. Hierzu werden beson<strong>der</strong>s die Kriterien aus Abschnitt 3.10 hilfreich sein. Es lohnt sich auch, in<br />
Teams zunächst unabhängig mehrere Lösungsansätze aufzustellen und dann zu beurteilen. Zum einen findet<br />
man hierdurch unter Umständen eine Lösung, die besser ist als jede einzelne, und zum zweiten weist die Kritik<br />
oft auf Denkfehler hin, die man beim nächsten Entwurf vermeiden kann. Aus Fehlern lernt man eine ganze<br />
Menge, aber nur wenn man zuläßt, daß diese auch aufgedeckt werden. Wer aber (sachliche) Kritik vermeidet,<br />
<strong>der</strong> wird auch selten etwas lernen.<br />
Für das Aufspüren von Klassen, die benötigt werden, um gefor<strong>der</strong>te Leistungen mit geringerem Aufwand zu<br />
beschreiben, bietet es sich an, zunächst einmal die Eiffel-Bibliotheken nach Lösungen für ähnliche Problemstellungen<br />
zu durchforsten. Für wichtige Datenstrukturen wie Listen, Bäume, Fel<strong>der</strong>, Stacks, Queues, Dateien,<br />
Strings, Hash-Tabellen, Bäume, usw. gibt es für nahezu alle Routineaufgaben (wie Einfügen, Löschen, sortieren<br />
etc.) längst eine vordefinierte Lösung, auf die man zurückgreifen kann. Da mindestens die Hälfte aller<br />
Probleme aus <strong>der</strong>artigen Routineaufgaben besteht, erspart dieser naive, aber doch sehr wirksame Weg eine<br />
Menge Arbeit und reduziert das Risiko von Fehlern.<br />
Ein weiterer wichtiger Hinweis ist, daß viele Klassen keine an<strong>der</strong>e Aufgabe haben werden, als das Verhalten<br />
externer Objekte zu modellieren. Ihre features und Eigenschaften ergeben sich also nahezu direkt aus <strong>der</strong><br />
Grobspezifikation.<br />
Ob ein Begriff aus <strong>der</strong> realen Welt als Klasse realisiert werden soll, hängt vor allem davon ab, wie damit<br />
umgegangen werden soll. Interessiert man sich zum Beispiel in einem Bibliothekssystem nur für Namen und<br />
Vornamen des Autors eines Buches als Ordnungskriterium, führt aber keine Operationen auf Autoren durch,<br />
so sollten Autoren nicht als eigene Klasse deklariert werden. Stattdessen sollte die Klasse BUCH zwei Komponenten<br />
für Namen und Vornamen beinhalten. An<strong>der</strong>s sieht dies aus, wenn man z.B. in einem angeschlossenen<br />
Informationssystem über Buchautoren immer die aktuelle Adresse mitverwalten und ggf. än<strong>der</strong>n möchte. Hier<br />
lohnt es sich schon, Autoren in einer separaten Klasse zusammenzufassen.<br />
Im allgemeinen kann man sagen, daß oft zu viele unnötige Klassen gebildet werden. Ein Begriff sollte genau<br />
dann zur Klasse erhoben werden, wenn er eine Menge von Objekten beschreibt, die interessante Operationen<br />
mit axiomatisch charakterisierbaren Eigenschaften besitzen.<br />
4.1.4 Schnittstellentechniken<br />
Ebenso wichtig wie die Strukturierung eines Systems in Klassen ist <strong>der</strong> Entwurf guter Schnittstellen, also die<br />
Fixierung <strong>der</strong>jenigen features, die nach außen hin angeboten werden. Die Qualität und Verständlichkeit dieser<br />
Schnittstellen bestimmt, in welchem Maße eine Klasse auch tatsächlich benutzt werden wird.<br />
Eine <strong>der</strong> wesentlichen Richtlinien ist hierbei eine strikte Trennung von Prozeduren und Funktionen. Die Programmiersprache<br />
Eiffel läßt prinzipiell zu, daß Funktionen nicht nur Werte berechnen, son<strong>der</strong>n gleichzeitig<br />
auch “Seiteneffekte” haben, d.h. während ihrer Abarbeitung auch das aktuelle Exemplar verän<strong>der</strong>n. Es ist